开发环境两台Mysql主机,已配置高可用(keepalived)双向同步,某天巡视发现,同步失败。经检查当前主用库(192.168.1.182)数据正常,故决定在第二台机(192.168.1.181)上重做同步。
因主机数据库较大,为提高效率,故采用物理备份方案,备份工具使用percona公司xtrabackup,版本号:2.4.4,两台机都要安装,过程省略。
说明:采用本方案,主库不用锁表,即实现了”热备“,实际上本方案就是一个使用xtrabackup来搭建slave的方案
1. 确认主用机器已停止同步
因为之前配的高可用双向同步,所以先将主库的同步停掉
# 主机上操作
mysql> stop slave ;change master to master_host=' ';reset slave all;
mysql> show slave status\G
Empty set (0.00 sec)
# 查看备份用户是否存在
mysql> select host,user from mysql.user where user='rep';
+--------------+------+
| host | user |
+--------------+------+
| 192.168.1.% | rep |
+--------------+------+
1 row in set (0.00 sec)
# 如果上述命令返回为空,则创建备份用户
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123456';
mysql> flush privileges;
- 清除并重建从机上的数据库
# 从机上准备工作
$ service mysql stop
$ rm -rf /data/mysql /opt/test1 # 删除所有数据库及备份文件存放目录
# 主机上操作
$ rm -rf /opt/test1 && mkdir -pv /opt/test1
# 全备
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --slave-info --no-timestamp /opt/test1
$ scp -r /opt/test1 root@192.168.1.181:/opt/
# 从机上操作
# 准备
$ innobackupex --apply-log /opt/test1/
# 在输出结果中找到类似"InnoDB: xtrabackup: Last MySQL binlog file position 990174286, file name log_bin.000186"
# 还原
$ innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/test1
$ chown -R mysql.mysql /data/mysql
$ cat /opt/test1/xtrabackup_binlog_info # 查到同步的信息(和上面命令的结果一致)
log_bin.000186 990174286
$ service mysql start
# 到从机上操作
mysql> change master to master_host='192.168.1.182',
master_user='rep',
master_password='123456',
master_log_file='log_bin.000186',
master_log_pos=990174286;
mysql> start slave ;
mysql> show slave status\G ;
*************************** 1. row ***************************
......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes ....
# 再准备配置双活
mysql> show master status\G
*************************** 1. row ***************************
File: log_bin.000002
Position: 1149270
# 再到主机上start slave
mysql> change master to master_host='192.168.1.181',
master_user='rep',
master_password='123456',
master_log_file='log_bin.000002',
master_log_pos=1149270;
mysql> start slave ;
mysql> show slave status\G ;
# 确认主从一致后,两台机都清理一下
$ rm -rf /opt/test1
# 让相关开发人员检查服务运行情况
PS; 特别说明,在设置同步点的时候,网上很多资料说是查看xtrabackup_slave_info文件,但本人在实践中发现,这个文件的提示有时候并不靠谱,甚至根本找不到它所提示的bin_log文件,因此,还是以xtrabackup_binlog_info文件为准
- 关于找不到记录的处理办法
有些时候查看同步状态时会显示“ Could not execute Delete_rows event on table XXX.XXX; Can't find record in 'xxx', ....."之类的错误,这表示删除记录时,这条记录不存在,路过这条记录就可以了
mysql> show slave status\G ;
*************************** 1. row ***************************
......
Slave_IO_Running: Yes
Slave_SQL_Running: No
......
Last_Errno: 1032 # 错误类型1032(记录不存在)
Last_Error: Could not execute Delete_rows event on table XXX.xxx; Can't find record in 'xxx', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log log_bin.000183, end_log_pos 373070996 ......
mysql> stop slave;set global sql_slave_skip_counter=1;start slave;
mysql> show slave status\G ;
# 如果频繁出现1032(记录不存在)错误,则到my.cnf中设置跳过此错误
$ vi /etc/my.cnf # 在[mysqld]项最后添加
slave-skip-errors=1032
$ service mysql restart
mysql> show slave status\G ;
网友评论