gtid 格式转换
单主模式gtid 模式切换
开启 enforce_gtid_consistency
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
设置 gtid_mode
打开的顺寻是:
OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON
主从同步方式转换
- 当前主从的配置都是statement 的binlog 格式和gtid 为off 的配置
mysql> show global variables like '%gtid%';
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | OFF |
| gtid_executed | |
| gtid_executed_compression_period | 1000 |
| gtid_mode | OFF |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-------+
8 rows in set (0.00 sec)
mysql> show global variables like '%binlog_format%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
- 主从同步状态
主库线程:
| 187 | repl | DBAtest2:56302 | NULL | Binlog Dump | 24 | Master has sent all binlog to slave; waiting for more updates | NULL |
从库线程:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主库插入:
mysql> insert into t1 values(999,';;');
Query OK, 1 row affected (0.00 sec)
从库查询:
mysql> select * from db.t1 where id = 999;
+-----+------+
| id | name |
+-----+------+
| 999 | ;; |
+-----+------+
1 row in set (0.00 sec)
- 主从开启enforce_gtid_consistency
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
- 主从设置gtid_mode
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
主从所有的节点都要执行,没有严格的先后顺序
- 等待所有的节点 NGOING_ANONYMOUS_TRANSACTION_COUNT 参数变成0;
show global status like 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
为了确保所有的从库已经执行完了匿名事务,可以进行简单校验
步骤1:在主库获取master status 信息
SHOW MASTER STATUS;
步骤2:在从库执行:
SELECT MASTER_POS_WAIT('mysql-bin.000006', 659);
如果主从之间没有延迟,显示为0;
如果只级联主从,需要在各个从库执行;
如果是环形主从同步,需要在整个同步中,执行两次上面的2步骤
如果在变更期间还有基于binlog的备份或者是恢复操作,需要等待其完成。
完成之后主库执行flush logs 刷新所有的日志。
-
设置gtid_mode为on
-
变更binlog_format 格式(可以在设置gtid之前变更)
从库先执行
set global binlog_format=row;
- 变更主从同步方式
stop slave;
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
start slave;
主从同步方式转变的意义
- 在主库使用binlog-do-db 和 statement 格式的binlog 造成数据丢失
- statement 格式的binlog 对部分函数的同步会造成数据不一致
针对以上的问题,有两个建议:
- 不要在主库使用binlog 过滤,在从库使用replicat-do-db
- 新建的数据库环境都是用row 格式的bibnlog
错误处理
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.’
文档借鉴
https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-concepts.html