MySQL传统点位复制在线转为GTID模式复制
1. gtid优缺点
mysql传统点位复制在5.7版本前是主要的主从复制模式,而随着mysql5.6版本引入gtid,并且mysql5.7进行各方面的优化以后,在mysql5.7(尤其是mysql5.7.6)版本后gtid模式的主从复制方式成为一个新的选择方式。要使用gtid模式,首先也需知其优缺点,其主要的优缺点如下:
1.1 优点
a) 更简单的实现failover,无需找log_file和log_pos。
b) 更简单的搭建主从复制。
c) 复制集群有一个统一的方式识别复制位置,给集群管理带来了便利。
d) 正常情况下,gtid是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过
1.2 限制
a) 在一个事务里面混合使用引擎如innodb(支持事务)、myisam(不支持事务), 造成多个gtids和同一个事务相关联出错
b) create table…..select 不能使用,该语句产生的两个event在某一情况 会使用同一个gtid(同一个gtid在slave只能被使用一次),使用时会报如下错误:
错误代码: 1786 statement violates gtid consistency: create table ... select.
需改为 create table like tb; insert into tb ... select 方式处理
c) create temporary table and drop temporary table 不能在事务内使用 (启用了--enforce-gtid-consistency参数)
2. 传统点位复制在线转为gtid模式复制
2.1 在线调整的条件
a) 要求mysql 5.7.6及以后版本。
b) 所有组中节点的gtid_mode 为off状态。
2.2 在线调整
2.2.1 查看当前状态
/** 传统复制下enforce_gtid_consistency gtid_mode 均为off **/
mysql> show global variables like 'enforce_gtid_consistency'; +--------------------------+-------+ | variable_name | value | +--------------------------+-------+ | enforce_gtid_consistency | off | +--------------------------+-------+ 1 row in set (0.00 sec) mysql> show global variables like 'gtid_mode'; +---------------+-------+ | variable_name | value | +---------------+-------+ | gtid_mode | off | +---------------+-------+ 1 row in set (0.00 sec)
2.2.2 修改enforce_gtid_consistency
所有节点均先将其修改为 warn,同时注意查看日志是否出现警告信息,生产环境想调整为gtid模式时,需提前一段时间调整此参数,观察一段时间,确定无警告后再调整。
/** 所有节点均调整,主从无先后顺序 **/ mysql> set global enforce_gtid_consistency =warn; query ok, 0 rows affected (0.00 sec)
开启后观察数据库日志,只有在无警告的情况下才可以进行后续的操作。
2019-10-13t06:00:19.723310z 10588 [note] changed enforce_gtid_consistency from off to warn.
2.2.3 修改enforce_gtid_consistency = on
将各节点enforce_gtid_consistency 设置为 on,不分顺序,但需要全部执行完毕后再进行下一步
mysql> set global enforce_gtid_consistency = on; query ok, 0 rows affected (0.00 sec)
2.2.4 修改gtid_mode = off_permissive
将各节点gtid_mode设置为 off_permissive,不分顺序,但需要全部执行完毕后再进行下一步
mysql> set global gtid_mode = off_permissive; query ok, 0 rows affected (0.00 sec)
2.2.5 修改gtid_mode=on_permissive
建议先修改从库的gtid_mode为on_permissive,之后再修改主库的。此步骤执行完毕后生成的日志是带gtid的
mysql> set global gtid_mode=on_permissive; query ok, 0 rows affected (0.01 sec)
2.2.6 查看状态
/** 确定传统方式复制完毕,此时各节点ongoing_anonymous_transaction_count状态为0 **/ mysql> show status like 'ongoing_anonymous_transaction_count'; +-------------------------------------+-------+ | variable_name | value | +-------------------------------------+-------+ | ongoing_anonymous_transaction_count | 0 | +-------------------------------------+-------+ 1 row in set (0.00 sec)
/** 切换日志 **/
mysql> flush logs;
query ok, 0 rows affected (0.16 sec)
需要所有的节点ongoing_anonymous_transaction_count均为0.
2.2.7 启用gtid_mode
前面的步骤确认正常后,各节点开启gtid_mode
mysql> set global gtid_mode=on; query ok, 0 rows affected (0.01 sec)
2.3 将传统复制转为gtid模式
停止原有复制,切换为gtid模式后,设置为自动查找位置复制。
ql> stop slave; query ok, 0 rows affected (0.00 sec) mysql> change master to master_auto_position=1; query ok, 0 rows affected (0.01 sec) mysql> start slave; query ok, 0 rows affected (0.01 sec)
修改后复制即变为gtid模式。
mysql> show global variables like '%gtid%'; +----------------------------------+--------------------------------------------------------------------------------------------+ | variable_name | value | +----------------------------------+--------------------------------------------------------------------------------------------+ | binlog_gtid_simple_recovery | on | | enforce_gtid_consistency | on | | gtid_executed | e29d3917-9dbb-11e9-8b64-e4434b6e2c80:1-93632, e595a4ee-9dbb-11e9-a0f5-e4434b6e3094:1-30042 | | gtid_executed_compression_period | 1000 | | gtid_mode | on | | gtid_owned | | | gtid_purged | e29d3917-9dbb-11e9-8b64-e4434b6e2c80:1-4803, e595a4ee-9dbb-11e9-a0f5-e4434b6e3094:1-30042 | | session_track_gtids | off | +----------------------------------+--------------------------------------------------------------------------------------------+ 8 rows in set (0.01 sec)
3. 修改配置文件
在配置文件中添加gtid相关参数,涉及到gtid的参数如下:
server-id:每个mysql 实例的id值,不能相同。必选项 gtid_mode = on: mysql是开启gtid模式. enforce-gtid-consistency=on:开启gtid复制是,保证gtid的一致性. log-bin:mysql 必须开启binlog. binlog_format=row: mysqlbinlog 的事实标准,其他格式会导致数据丢失. log-slave-updates=on:级联复制,当slave接受到master的更新且执行完毕之后,执行的binlog是否写入slave的binlog记录中.
下一篇: ASP万用分页程序