背景
1、线上使用的是阿里云的RDS for MySQL,导入其数据库至线下,因为数据量不大,所以采用的是逻辑备份的方式。
2、在控制台进行手动备份,然后下载下来,上传至本地服务器,准备导入数据
3、本地环境是一组两备的mysql集群,主备状态正常
GTID限制
在导入的时候数据的时候发现报错
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
此报错是是因为在逻辑备份时有GTID的备份限制,一般有两个解决方案:
1、–set-gtid-purged=off
在dump导出时,添加–set-gtid-purged=off参数,避免将gtid信息导出
mysqldump -uroot -p --set-gtid-purged=off -d test>test.sql
因为我这个是从RDS控制台进行的备份,无法指定参数,所以
2、reset master
这个操作可以将当前库的GTID_EXECUTED值置空。此时sql文件中的set就可以执行
功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。用于第一次进行搭建主从库时,进行主库binlog初始化工作;
这里的话,我线下已经是一主两备,不能做这样操作
解决办法:
手动将sql文件中关于GTID的内容删除
GTID state at the beginning of the backup
SET @@GLOBAL.GTID_PURGED='2d5a7b17-bcb3-11e9-b156-ec0d9ac5d408:1-2490085,
2d98295e-bcb3-11e9-b156-506b4bfdc6e4:1-649802,
73f4fc2b-aeb5-11ea-9b70-98039b1b4bd8:123-2384';
备库没有同步
解决GTID的错误以后,在主库执行sql文件成功,登录到主库去查看相关表和数据都正常。
在登录在备库去查看数据时发现备库的表和数据没有同步
检查主备复制状态,master和slave的状态均正常。线程启动也是正常
手动在主库上建表插入数据,备库均能成功同步。日志中也均为明显报错
最后就是还怀疑到sql文件上,发现文件上还有一个关于binlog的会话参数设置
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
.......
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
该参数控制了禁止将语句记录进binlog日志中,而mysql主备是由binlog日志进行同步,没有日志,也就无法同步数据,应该是RDS为了避免在导入迁移数据过程中会产生大量的binlog,造成服务器的不稳定
将sql文件的相关参数删除即可