gtid格式/主从同步方式转变

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

主从同步方式转换

  1. 当前主从的配置都是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)

  1. 主从同步状态
主库线程:
| 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)

  1. 主从开启enforce_gtid_consistency
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
  1. 主从设置gtid_mode
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
主从所有的节点都要执行,没有严格的先后顺序

  1. 等待所有的节点 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 刷新所有的日志。

  1. 设置gtid_mode为on

  2. 变更binlog_format 格式(可以在设置gtid之前变更)

从库先执行
set global binlog_format=row;
  1. 变更主从同步方式
stop slave; 
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
start slave; 

主从同步方式转变的意义

  1. 在主库使用binlog-do-db 和 statement 格式的binlog 造成数据丢失
  2. statement 格式的binlog 对部分函数的同步会造成数据不一致

针对以上的问题,有两个建议:

  1. 不要在主库使用binlog 过滤,在从库使用replicat-do-db
  2. 新建的数据库环境都是用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值