最近才刚开始接触mysql5.6新的主从GTID同步,掉不少坑。
环境:一主一从运行有1年时间了,主库的master日志比较多,在my.cnf上添加expire_logs_days = 30,重启,发现日志少了。
现在要来添加多一个从库。
首先上主库执行:
mysql> show master status;
+——————-+———-+————–+——————————————————–+————————————————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————-+———-+————–+——————————————————–+————————————————-+
| master-bin.000440 | 6288490 | | mysql,performance_schema,information_schema,test| 6f723299-523b-11e5-a5bf-00163e0007c9:1-54549749 |
+——————-+———-+————–+——————————————————–+————————————————-+
1 row in set (0.00 sec)
复制下:6f723299-523b-11e5-a5bf-00163e0007c9:1-54549749
接着就导出数据了
/mysql/bin/mysqldump -uroot -pxxx –set-gtid-purged=OFF database | gzip > /data/backup.sql.gz
我这里用了压缩 gunzip解压后
再来登陆slave数据库,执行source /data/backup.sql;导入了
执行同步命令:change master to master_host = ‘ip’,master_port = 3306,master_user = ‘repluser’,master_password=’password’,master_auto_position = 1;
然后就要用gtid_purged来绕过,之前已经执行过的日志记录,从刚才导出sql的新地方开始执行同步即可。(GTID_PURGED :已经被删除的binlog的事务,它是GTID_EXECUTED的子集)
mysql> set global gtid_purged = ‘6f723299-523b-11e5-a5bf-00163e0007c9:1-54549749’;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 271
Current database: database
ERROR 1840 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.//这里的时候可能会出现错误
mysql> stop slave;
mysql> reset master;//没事这里重置下再执行 set global gtid_purged 即可
mysql> set global gtid_purged = ‘6f723299-523b-11e5-a5bf-00163e0007c9:1-54549749’;
mysql> start slave;
mysql> show slave status\G;//在看看
如果没有执行gtid_purged来绕过同步,就会出现以下错误:
1、人工暂停SLAVE进程;
2、MASTER上继续写入数据;
3、MASTER上刷新LOG;
4、MASTER上删除旧BINLOG,只保留最新的BINLOG;
5、SLAVE上启动MASTER,这时候会报错,像下面这样:
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.’
网上解答是:针对这种问题的处理方法可以这么做:
1、关闭MASTER_AUTO_POSITION,即设置 MASTER_AUTO_POSITION = 0;
2、手工CHANGE BINLOG FILE & POS;
这种情况下,不能再次设置 MASTER_AUTO_POSITION = 1,否则还会再次报错。
绕过后并没有问题,继续MASTER_AUTO_POSITION = 1。
我怎么感觉指定gtid_purged和指定master.bin与pos位置一个道理呢?