Mysql备份:
备份系统的构建,要注意的要点:
第一:能容忍最多丢失多少数据;
第二:恢复数据需要在多长时间内完成;
第三:需要恢复哪些数据:备份时要考虑备份完整;
(1)必须做还原测试,用于测试备份的可用性;
(2)还原演练;不是一个人能够完成的;
备份类型:
完全备份:就是备份整个数据集,是从时间轴上划分的,完整数据集;;
部分备份:只备份数据子集;
增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据;备份的是从上一次备份为起点到备份时的变化的数据;问题是还原起来比较麻烦;但很节约空间;是从时间轴上的变化量来备份的;是相对上一次的数据变化;
差异备份:仅备份最近一次完全备份以来变化的数据;起点都是从完全备份到备份时的差异部分;还原时用完全备份+最后一个差异就ok了;
注意:在实际使用备份策略时,应该使用完全备份+差异备份,或完全备份+增量备份
根据备份时的业务系统能否在线分为:
热备:备份过程中读写操作均可执行;技术复杂;
温备:读操作可执行,但写操作不成;
冷备:读写操作均不可执行;
MyISAM存储引擎:可温备,不能热备;
InnoDB存储引擎:可热备;内部支持快照;
InnoDB实现热备是,当打算开始备份时,对整个数据做一次阻断;内部做一个快照,而后就针对这个快照做备份就行了,InnoDB支持,因为它的每一次数据修改都有一个lsn日志序列号,但是MyISAM存储引擎没有,所以MyISAM存储引擎就不能执行热备;备份技术都跟存储引擎是有关系的;
根据备份的方式分为:
物理备份:直接复制数据文件进行备份;
使用cp、tar命令复制数据;
逻辑备份:从数据库中导出数据另存而进行的备份;
逻辑备份会转换为文本数据后会丢失精度,占用更多空间,需要专用的客户端才能进行;
物理备份,逻辑备份:与存储引擎无关;
备份工具:
mysqldump:
逻辑备份工具,适用于所有存储引擎,支持温备不支持热备;可用于完全备份、部分备份
对InnoDB存储引擎支持热备;是通过启动一个大事务进行的,可能会备份一天一夜,由于时间长会导致严重的资源竞争;
cp,tar等复制归档工具:
备份容易实现,但是物理备份工具,适用于所有存储引擎;只适用于冷备,可做完全备份、部分备份;
lvm的快照:
可实现几乎热备,借助于文件系统管理工具进行备份;
Mysqlhotcopy
几乎冷备;仅适用于MyISAM存储引擎;
mysql自带的程序
现在除了mysql自己的库使用MyISAM存储引擎,其它很少有人使用了;
备份工具的选择:
方案一:mysqldump+复制binlog:可进行远程备份;
mysqldump:做完全备份;
复制binlog中指定时间范围内的event;做增量备份;
说明:如果数据集很小(几十兆到几百兆),每周可使用mysqldump进行一次完全备份,然后每一天(每1或2小时等根据需要)使用start-datetime和stop-datatime中间,取得binlog中的事件导出保存在一个sql文件中,这样来备份;也可从上一个完全备份开始一直到现在,就能实现差异,如果是从上一次完全备份或增量开始就能实现增量;这种方案一般比较慢,但支持远程备份;
因为mysqldump是myslq协议的客户端工具;mysqlbinlog又可以远程读取事件,就意味着,备份过程就可以远程进行了;mysql就自带了这些工具;所以,在较小的数据集范围内,对数据精度要求不是特别苛刻,而且对于备份和恢复过程又要求不是特别严格场景中,开使用这个两个工具做备份;
mysqldump命令:
客户端命令,支持通过mysql协议连接至mysqld服务器;
事实上就是向mysql服务器发起一个全量查询操作,把所有数据拿到本地以后,并且将读取到的数据保存在文件中,从而完成备份操作的;
-A –all-databases:备份所有库;
-B –databases:指明备份的哪个库
mysqldump [OPTIONS] database [tables]
备份指定库中的表,没有生成create database语句
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p hellodb > ./hellodb
Enter password:
MyISAM存储引擎:支持温备,备份时要锁定表;
-x, –lock-all-tables:锁定所有库的所有表,读锁;
mysqldump [OPTIONS] –all-databases [OPTIONS]
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -x –all-databases > ./hellodb4
Enter password: //输入mysql的密码
-l, –lock-tables:锁定指定库所有表;
mysqldump [OPTIONS] –databases [OPTIONS] DB1 [DB2 DB3…]
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -l –databases hellodb > ./hellodb3
Enter password:
InnoDB存储引擎:支持温备和热备;
–single-transaction:创建一个事务,基于此快照执行备份;
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p –single-transaction –databases hellodb > ./hellodb2
Enter password:
注意:必须使用加锁的方式进行备份,否则会造成数据不一致,使备份无法可用
其它必给选项:
–databases:指定备份是数据库一个或多个;
–all-databases:备份所有数据库;
–events, -E:备份指定数据库相关的所有event scheduler;
–routines, -R:备份指定数据库相关的所有存储过程和存储函数;
–triggers:备份表相关的触发器;
–skip-triggers:不备份触发器;
–master-data[=#]
0:表示不记录
1:记录为CHANGE MASTER TO语句,此语句不被注释;
2:记录为CHANGE MASTER TO语句,此语句被注释;
–flush-logs:锁定表完成后,即进行日志刷新操作;
实验1::做一次mysqldump的备份及还原完全步骤:
1、先做一侧完全备份
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -x -A -R -E –master-data=2 –flush-logs –triggers > ./hellodb $(date +%F-%T)
Enter password:
在mysql做几项修改
MariaDB [hellodb]> insert into students (name) values ('wang4');
Query OK, 1 row affected, 1 warning (0.01 sec)
MariaDB [hellodb]> drop table students;
Query OK, 0 rows affected (0.02 sec)
2、还原二进制日志:
[root@centos7clean ~]# mysqlbinlog /var/lib/mysql/master-log.000008 //查看drop表的起始位置
[root@centos7clean ~]# mysqlbinlog –stop-position 481 /var/lib/mysql/master-log.000008 > /root/binlog.sql //导出二进制日志在481的地方结束
MariaDB [hellodb]> set sql_log_bin = off; //还原时不记录二进制文件中
MariaDB [hellodb]> \. /root/hellodb2016-11-19-14:21:01 //还原完全备份
MariaDB [hellodb]> \. /root/binlog.sql //还原二进制备份
MariaDB [hellodb]> set sql_log_bin = on; //开启记录二进制文件中
方案二:lvm2快照+复制binlog:不常用了解
lvm2快照:使用cp或tar等做物理备份;做完全备份;
复制binlog中指定时间范围内的event;做增量备份;
这其实就是物理+逻辑的方式实现;因为cp是物理备份,而复杂binlog中的event在还原时是逻辑还原的,备份出来的数据也是逻辑的;
实验步骤:
前提:数据目录位于逻辑卷,包含了数据文件和事务日志;
(1) 请求锁定所有表;
mysql> FLUSH TABLES WITH READ LOCK;
(2) 记录二进制文件事件位置;
mysql> FLUSH LOGS;
mysql> SHOW MASTER STATUS;
mysql -e 'SHOW MASTER STATUS;' >> /PATH/TO/SOME_POS_FILE
(3) 创建快照卷
lvcreate -L # -s -p r – SNAM-NAME /dev/VG-NAME/LV-NAME
(4) 释放锁
mysql> UNLOCK TABLES
(5) 挂载快照卷,并执行备份,备份完成后删除快照卷;
(6) 周期性备份二进制日志;
基于lvm备份具体步骤:
对整个逻辑卷做一个快照,快照卷里面没有内容,快照之后所有对原卷的修改时,需要先将原卷内容复制一份到快照卷上,再在原卷上修改;通过快照卷访问的数据,如果原卷没改仍然通过原卷来访问,如果原卷改了的,将通过快照卷复制原卷修改之前的副本来访问;
1.连接到mysql上,请求锁定所有表:
> FLUSH TABLES WITH READ LOCK;
施加读锁,把所有表中的数据从内存同步到磁盘上;如果能请求到读锁,其它线程只能读操作;如果此时,正有人在执行一个大事务,且正在做写操作,此时就可能会等很长时间才能请求到读锁;
> SHOW MASTER STATUS;
2.锁定后,滚动一次二进制日志;记录二进制日志文件及事件位置:
> FLUSH LOGS;
# mysql -e 'SHOW MASTER STATUS' > /root/pos.`date +%F`
注意:二进制日志文件要从原卷中备份:
# cp -a /data/mysql/binlogs/ /tmp
3.为逻辑创建快照:
# lvcreate -L 2G -n mydata-snap -s -p r /dev/myvg/mydata
4.释放全局读锁
> UNLOCK TABLES;
模拟数据库变化,做些修改操作;
> USE hellodb;
> DELETE FROM students WHERE StuID=5;
> DELETE FROM students WHERE StuID=6;
> DELETE FROM students WHERE StuID=11;
> SELECT * FROM students;
5.挂载快照卷并备份
挂载快照卷:
# mount -r /dev/myvg/mydata-snap /mnt
备份数据文件
# cp -a mysql/ /tmp
注意:二进制日志文件要从原卷中备份:
6.删除快照卷
# umount /mnt
# lvremove /dev/myvg/mydata-snap
模拟数据库服务器崩溃:
# systemctl stop mariadb.service
# rm -rf /data/mysql/*
模拟数据文件崩溃;
# rm -rf /data/binlogs/*
模拟二进制日志文件崩溃;
演示基于lvm还原:
1.还原数据文件:
# cp -a /tmp/mysql/* /data/mysql/
还原数据文件;即直接拷贝回来;
确保复制回来以后,文件的属主、属组是mysql;
2.启动服务
# systemctl start mariadb.service
> SHOW BINARY LOGS;
> USE hellodb;
> SELECT * FROM students;
崩溃前的数据;
3.读取二进制日志文件中备份的事件位置
# cat /pos-2016-06-05
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000004 245
4、在备份的二进制日志文件中找到mysql-bin.000004文件,从245位置后面,读出所有事件,然后保存在一个sql文件中;
# mysqlbinlog –start-position=245 mysql-bin.000004 > recovery.sql
5.重放事件:
# mysql < recovery.sql
方案三:xtrabackup:支持完全备份、增量备份;
由percona提供的支持InnoDB做热备,是物理备份的工具;
可以理解为复制底层数据块,而非简单的复制文件
MyISAM:温备,不支持增量备份;
InnoDB:热备,增量;
实验2.1:
1、安装xtrabackup
[root@centos7clean ~]# yum -y install ./percona-xtrabackup-2.3.2-1.el7.x86_64.rpm
2、新建目录并备份
[root@centos7clean ~]# mkdir /mydata
[root@centos7clean ~]# innobackupex –user=root –password= /mydata
生成的文件说明:
[root@centos7clean 2016-11-19_15-19-55]# cat backup-my.cnf
备份了还原时的基本特性
[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=5242880
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0
[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_binlog_info
master-log.000008 594 //备份时那一刻二进制文件和position
[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_info
备份时程序自己的一些相关信息
uuid = 864f15ea-acec-11e6-89ee-000c299ef417
name =
tool_name = innobackupex //备份的程序
tool_command = –user=root –password=… /mydata //账号等信息
tool_version = 2.3.2 //程序的版本号
ibbackup_version = 2.3.2
server_version = 5.5.44-MariaDB-log
start_time = 2016-11-19 15:19:56 //启动时间
end_time = 2016-11-19 15:19:58 //结束时间
lock_time = 0
binlog_pos = filename 'master-log.000008', position '594'
innodb_from_lsn = 0
innodb_to_lsn = 9375874
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_checkpoints
文件的核查点
backup_type = full-backuped //备份的类型
from_lsn = 0
to_lsn = 9375874
last_lsn = 9376086
compact = 0
recover_binlog_info = 0
3、还原到10.1.72.50
开启mariadb服务
50:[root@localhost ~]# systemctl stop mariadb //在目标主机上还原明mysql不能启动
[root@ ~]# yum -y install ./percona-xtrabackup-2.3.2-1.el7.x86_64.rpm
60:[root@ mydata]# scp -rp 2016-11-19_15-19-55/ 10.1.72.50:/mydata
[root@ ~]# scp percona-xtrabackup-2.3.2-1.el7.x86_64.rpm 10.1.72.50:/root
——————
[root@localhost mysql]# innobackupex –apply-log /mydata/2016-11-19_15-19-55/ //应用日志,该提交提交该回滚回滚
[root@localhost mydata]# innobackupex –copy-back /mydata/backup/2016-11-19_15-19-55/
此处特别注意:
在/etc/my.cnf中必须指定、datadir=要恢复的目录
4、更改mysql数据目录的属主属组
[root@localhost mydata]# chown -R mysql.mysql /var/lib/mysql/
5、修改my.cnf
由xtrabackup还原后innodb事务日志的大小改为48m,原mysql默认为5m
不匹配,所以要修改innodb_log_file_size参数
-rw-r—– 1 mysql mysql 50331648 Nov 6 21:44 ib_logfile0
-rw-r—– 1 mysql mysql 50331648 Nov 6 21:44 ib_logfile1
[root@localhost mysql]# vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
symbolic-links=0
innodb_log_file_size = 50331648
——————-
实验2.2
MariaDB [hellodb]> insert into students (name) values ('wang5');
Query OK, 1 row affected, 1 warning (0.01 sec)
1.做增量备份
[root@centos7clean mydata]# innobackupex –user=root –password= –incremental /mydata –incremental-basedir=/mydata/2016-11-19_15-19-55
–incremental:明确指明做增量备份
–incremental-basedir:基于上次备份的哪个目录做增量备份
[root@centos7clean 2016-11-19_17-11-32]# less xtrabackup_checkpoints
2.再次修改数据
MariaDB [hellodb]> delete from students where stuid=31;
Query OK, 1 row affected (0.01 sec)
3.再做一次增量备份
[root@centos7clean 2016-11-19_17-11-32]# innobackupex –user=root –password= –incremental /mydata –incremental-basedir=/mydata/2016-11-19_17-11-32
查看记录到哪个binlog
[root@centos7clean 2016-11-19_17-21-22]# less xtrabackup_binlog_info
master-log.000008 1029
4.再做修改
MariaDB [hellodb]> insert into students (name) value ('wang6');
Query OK, 1 row affected, 1 warning (0.30 sec)
5.导出二进制文件
[root@centos7clean mysql]# mysqlbinlog –start-position=1029 master-log.000008 > /mydata/binlog.sql
6.还原:
[root@localhost mydata]# innobackupex –apply-log –redo-only 2016-11-19_15-19-55/
–redo-only:只提交不回滚
7.合并第一次增量
[root@localhost mydata]# innobackupex –apply-log –redo-only 2016-11-19_15-19-55/ –incremental-dir=/mydata/2016-11-19_17-11-32 //
8.合并第二次增量
[root@localhost mydata]# innobackupex –apply-log 2016-11-19_15-19-55/ –incremental-dir=/mydata/2016-11-19_17-21-22
注意:这是redo-only不写
9.复制文件:
[root@localhost mydata]# innobackupex –copy-back /mydata/2016-11-19_15-19-55/
10.导入二进制sql语句
MariaDB [hellodb]> \. /mydata/binlog.sql
Mysql复制:
1.主/从架构:
异步复制:
半同步复制:
一主多从;
一从一主;
级联复制;
循环复制;
双主复制;
1.1配置在主服务器上
1.同步时间
[root@localhost mydata]# ntpdate 10.1.0.1
2. 修改mysql配置文件
[root@centos7clean ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server_id=1
log_bin=master-log
3.配置一个从服务器的授权
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
1.2在从服务器上
[root@localhost mydata]# !vim
vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
symbolic-links=0
innodb_log_file_size = 50331648
server_id=2
relay_log=slave-log
innodb_file_per_table=on
启动服务
指明主服务器:
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000009',master_log_pos=245;
查看从服务器状态
开启从服务器
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000009',master_log_pos=245;
MariaDB [(none)]>start slave;
验证:
设置从服务器为只读
MariaDB [hellodb]> set @@global.read_only=1;
2、主主模式
互为主从:两个节点各自都要开启binlog和relay log;
1、数据不一致;
2、自动增长id;
定义一个节点使用奇数id
auto_increment_offset=1
auto_increment_increment=2
另一个节点使用偶数id
auto_increment_offset=2
auto_increment_increment=2
节点1:
[root@centos7clean ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
relay_log=relay-log
auto_increment_offset=1
auto_increment_increment=2
授权
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
指向另一个节点为主:
MariaDB [(none)]> change master to master_host='10.1.72.50',master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=245;
MariaDB [(none)]> start slave;
节点2:
[root@centos ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
relay_log=relay-log
auto_increment_offset=2
auto_increment_increment=2
授权:
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.60' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
指向另一台为主:
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=245;
MariaDB [(none)]> start slave;
复制时应该注意的问题:
1、尽量确保复制时的事务安全
在master节点启用参数:
sync_binlog = ON
立刻将二进制日志写入磁盘中
如果用到的是InnoDB存储引擎:
innodb_flush_logs_at_trx_commit=ON将事务日志写入磁盘
innodb_support_xa=ON支持分布式事务
2、从服务器意外中止时尽量避免自动启动复制线程
3、从节点:设置参数
sync_master_info=ON
sync_relay_log_info=ON
声明:最好不要使用主主模式
3、半同步复制
支持多种插件:/usr/lib64/mysql/plugins/
主节点:
[root@centos7clean ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
[root@centos7clean ~]# systemctl start mariadb
[root@centos7clean ~]# mysql
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.%' identified by '123';
MariaDB [(none)]> flush privileges;
安装插件
MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
MariaDB [(none)]> show plugins;
MariaDB [(none)]> show global variables like 'rpl_semi%';
开启半同步复制
MariaDB [(none)]> set @@global.rpl_semi_sync_master_enabled=on;
查看是否有从节点:
MariaDB [(none)]> show global status like '%semi%';
从节点:
[root@localhost mydata]# vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
server_id=2
relay_log=slave-log
[root@localhost mydata]# systemctl start mariadb
[root@localhost mydata]# mysql
MariaDB [(none)]> change master to master_host='10.1.72.60' ,master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=486;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
安装插件
MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
启动服务
MariaDB [(none)]> set @@global.rpl_semi_sync_slave_enabled = on;
停止服务
Stop slave;
开启服务
Start slave;
复制过滤器:
仅复制有限一个或几个数据库相关的数据,而非所有;由复制过滤器进行;
有两种实现思路:
(1) 主服务器
主服务器仅向二进制日志中记录有关特定数据库相关的写操作;
问题:其它库的point-recovery将无从实现;
binlog_do_db=白名单,复制哪个数据库
binlog_ignore_db=黑名单,忽略哪个数据库
(2) 从服务器
从服务器的SQL THREAD仅重放关注的数据库或表相关的事件,并将其应用于本地;问题:网络IO和磁盘IO;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
将这些参数写入到配置文件中即可;
半同步复制哪些参数想重启生效,也要写入到配置文件中
复制的监控和维护:
(1) 清理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
示例:
MariaDB [(none)]> purge binary logs to 'master-log.000003';
表示mysql-bin.03之前的所有日志都被清理;
MariaDB [(none)]> PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26' ;表示2008-04-02 22:46:26这个时间点之前的所有事件都被清理;
(2) 复制监控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判断从服务器是否落后于主服务器:
MariaDB [(none)]> show slave status\G;
Seconds_Behind_Master: 0
(3) 如何确定主从节点数据是否一致?
通过表的CHECKSUM检查;
使用percona-tools中pt-table-checksum;
(4) 主人数据不一致时的修复方法?
重新复制;
综合实验:
主节点:
创建CA证书
[root@centos7clean CA]# (umask 077;openssl genrsa -out private/cakey.pem)
[root@centos7clean CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem
[root@centos7clean mysql]# cd ssl/
[root@centos7clean ssl]# (umask 077;openssl genrsa -out mysql.key)
[root@centos7clean ssl]# openssl req -new -key mysql.key -out mysql.csr
[root@centos7clean ssl]# openssl ca -in mysql.csr -out mysql.crt
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
innodb_file_per_table = on
ssl
ssl_ca = /etc/pki/CA/cacert.pem
ssl_cert = /var/lib/mysql/ssl/mysql.crt
ssl_key = /var/lib/mysql/ssl/mysql.key
改变属主属组
[root@centos7clean ssl]# chown -R mysql.mysql *
MariaDB [(none)]> show variables like '%ssl%';
从节点:
[root@localhost ssl]# (umask 066;openssl genrsa -out mysql.key)
[root@localhost ssl]# openssl req -new -key mysql.key -out mysql.csr
[root@localhost ssl]# ls
mysql.csr mysql.key
[root@localhost ssl]# scp mysql.csr 10.1.72.60:/root
主节点签署并发还从节点,更改属主属组
[root@localhost ssl]# chown mysql.mysql *
[root@localhost ssl]# ll
total 8
-rw-r–r– 1 mysql mysql 0 Nov 20 10:46 mysql.crt
-rw-r–r– 1 mysql mysql 643 Nov 20 10:37 mysql.csr
-rw——- 1 mysql mysql 887 Nov 20 10:37 mysql.key
将证书的公钥cacert.pem复制到从服务器的目录下
更改从节点配置文件:
[root@localhost ssl]# vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
symbolic-links=0
innodb_log_file_size = 50331648
server_id=2
ssl
ssl_ca=/etc/pki/CA/cacert.pem
ssl_cert=/var/lib/mysq/ssl/mysql.crt
ssl_key=/var/lib/mysql/ssl/mysql.key
relay_log=slave-log
启动服务,主节点授权
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123' require ssl;
MariaDB [(none)]> flush privileges;
备份主节点数据到从节点:
主:
备份数据
[root@centos7clean ~]# innobackupex –user='root' –password= /mydata
从:
停止服务,还原数据:
[root@localhost mysql]# innobackupex –apple-log /mydata/2016-11-20_11-13-51/
[root@localhost mysql]# rm -rf *
[root@localhost mysql]# innobackupex –copy-back /mydata/2016-11-20_11-13-51/
注意:恢复数据的时候是基于unix套接字的,所以要先创建mysql.sock
启动服务,并指明主服务器
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000011',master_log_pos=499,master_ssl=1,master_ssl_ca='/etc/pki/CA/cacert.pem',master_ssl_key='/var/lib/mysql/ssl/mysql.key',master_ssl_cert='/var/lib/mysql/ssl/mysql.crt';
Query OK, 0 rows affected (0.05 sec)
可以用[root@localhost ssl]# mysql –ssl -uuser -h10.1.72.60 -p123测试
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.72.60
Master_User: user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000012
Read_Master_Log_Pos: 245
Relay_Log_File: slave-log.000007
Relay_Log_Pos: 530
Relay_Master_Log_File: master-log.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 245
Relay_Log_Space: 1357
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /etc/pki/CA/cacert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /var/lib/mysql/ssl/mysql.crt
Master_SSL_Cipher:
Master_SSL_Key: /var/lib/mysql/ssl/mysql.key
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
实验:使用zabbix监控从服务器
实验要求:
·
监控过滤Seconds_Behind_Master: 0,如果不等于0,则表示从服务器落后于主服务器,则发送警报并执行操作,在从服务器上执行命令:(mysql -e “stop slave io_thread;start slave io_thread”)
10.1.72.40:安装zabbix
[root@localhost ~]#yum -y install ./zabbix-get-3.0.2-1.el7.x86_64.rpm ./zabbix-server-mysql-3.0.2-1.el7.x86_64.rpm ./zabbix-web-3.0.2-1.el7.noarch.rpm ./zabbix-web-mysql-3.0.2-1.el7.noarch.rpm
[root@localhost ~]#yum -y install php httpd php-mysql mariadb-server
[root@localhost ~]#vim /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBUser=zabbix
DBPassword=123
Agent端安转并启动服务,配置自定义key
[root@localhost mysql]# vim /etc/zabbix/zabbix_agentd.conf
# UserParameter=
UserParameter=Seconds_Behind_Master,mysql -uroot -hlocalhost -e 'show slave status\G;'|awk -F':' '/Seconds/ {print $2}'
添加主机,并建立一个item
关联一个账户
定义动作:
测试:
从服务器添加一个读锁
MariaDB [(none)]> flush tables with read lock;
主服务器做操作
原创文章,作者:landanhero,如若转载,请注明出处:http://www.178linux.com/60147