文章目录
- 概要
- 步骤
- 出错
- 参考
概要
由于一时大意,在从库里执行了一条delect,本来马上执行跳过一个错误,是可以马上恢复同步的。
stop slave;
set global sql_slave_skip_counter=1; (1是指跳过一个错误)
slave start;
可当时没有检查同步功能,结果十几天后再回查看时已为时已晚,主从数据库差异比较大,已无法使用跳过来执行恢复,于是只能重做主从同步。
在网上查了大量资料,于是动手开干,这也是第一次做。
步骤
同步操作步骤:
1、登录从库的mysql停止slave
mysql> stop slave;
2、登录主库的mysql锁定数据库 (期间不能写入数据)
建议半夜执行,这时访问人数不多;
mysql> flush table with read lock;
3、主库清除binlog
mysql>RESET MASTER;
4、主库查看锁定状态下的binlog和位置并截图保存
这步很重要,到时还原后从binlog开始执行;
mysql>show master status\G;
5、主库备份数据库
(我的数据库60GB,估计备份时间18分钟,做参考)
mysqldump --max_allowed_packet=500M -uroot -p cms > /mysql/backup.sql
输入mysql密码执行备份
6、主库解锁表
备份完成后解锁主库,主库恢复正常使用
mysql>unlock tables;
7、主库传输备份文件到192.168.1.2(从库)
scp /mysql/backup.sql root@192.168.1.2:/mysql/backup.sql
8、进入从库删除已不同步的数据库表(重要:检查是否是从库服务器,不要在主库上操作,以防误删除主库)
mysql>drop database _table;
9、从库创建表_table
mysql>create database _table;
10、从库还原数据库
(我的数据库60GB还原预估时间18个小时,做参考)
mysql>use _table;
mysql>SOURCE /mysql/backup.sql;
11、还原完成,检查数据表是否完整(对比主库的表)
mysql>use _table;
mysql>show tables;
12、重置slave,会重置从库相关设置。
( reset slave不会改变复制连接使用的参数,例如master_host, master_port, master_user, master_password)
mysql>reset slave;
13、修改同步日志和位点(第4步中保存的数据)
mysql>change master to master_log_file='mysql-bin.000001',master_log_pos=123;
14、从库开启slave
mysql>start slave;
15、查看从库同步状态
mysql>SHOW SLAVE STATUS\G;
如果出现
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
则表示同步成功
16、再次在主库中添加测试数据,看从库数据是否同步。
出错
在第15步时,可能出现错误,如下
[ERROR] Slave SQL: Error 'Duplicate entry '1007-443786-0' for key 'PRIMARY'' on query. Default database: 'ufo'. Query: 'insert into misdata (uid,mid,pid,sta
te,mtime) values (443786,1007,0,-1,1262598003)', Error_code: 1062
100104 17:39:05 [Warning] Slave: Duplicate entry '1007-443786-0' for key 'PRIMARY' Error_code: 1062
100104 17:39:05 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'ufolog.000058
8' position 55793296
Error_code: 1062是主键重复,说明是从库已存在该键值,这时可以直接sql_slave_skip_counter=1跳过,或批量跳过1062。
强制批量跳过 1062错误,可能修改从库的/etc/my.cnf文件
在里面的 [mysqld]下面加入了一行
slave-skip-errors = 1062 (忽略所有的1062错误)
重启下从库的 mysql /etc/init.d/mysqld restart
重新执行查看是否已完成同步
mysql>SHOW SLAVE STATUS\G;
也有因为删除时从库不存在该数据的,也可以按情况跳过
参考
MYSQL主从同步故障解决(主键重复)mysql数据库重新做主从(完全同步)