Mysql数据库管理-MySQL】MySQL5.7传统复制和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 在线调整的条件

a)   要求MySQL 5.7.6及以后版本。

b) 所有组中节点的gtid_mode 为off状态。

一、参数解析

下面对GTID_MODE变量如下解释:

解释
OFF新事务是非GTID, Slave只接受不带GTID的事务,传送来GTID的事务会报错
OFF_PERMISSIVE新事务是非GTID, Slave即接受不带GTID的事务也接受带GTID的事务
ON_PERMISSIVE新事务是GTID, Slave即接受不带GTID的事务也接受带GTID的事务
ON新事务是GTID, Slave只接受带GTID的事务

我们在更改GTID_MODE时不可直接跳跃更改,否则会提示报错

root@localhost [xucl]>set global gtid_mode=ON;

ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.

二、在线更改

1.将enforce_gtid_consistency设置为WARNING,主库从库都要设置,无先后顺序。

set @@global.enforce_gtid_consistency=warn;

以下语法GTID都不支持:

1.CREATE TABLE ...SELECT ..

该语句会被拆分为create table和insert table两个事务且分配同一个GTID,传到备库后,insert操作会被忽略

ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

2.在事务内部的CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE

ERROR 1787 (HY000): Statement violates GTID consistency:CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.

These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.

3.在一个事务内部同时更新非事务引擎表和事务引擎表

ERROR 1785 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions,and never in the same statement as updates to transactional tables.

注意:执行完这条语句后,如果出现GTID不兼容的语句用法,在错误日志会记录相关信息,那么需要调整应该程序避免不兼容的写法,直到完全没有产生不兼容的语句,可以通过应用程序去排查所有的sql,也可以设置后观察错误日志一段时间,建议观察过,这一步非常重要。

2.将ENFORCE_GTID_CONSISTENCY设置为ON,主库从库都要设置,无先后顺序。

set @@global.enforce_gtid_consistency=on;

3.设置GTID_MODE为off_permissiv,主库从库都要设置,无先后顺序。

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

4.设置GTID_MODE为on_permissiv,主库从库都要设置,无先后顺序。

SET @@GLOBAL.GTID_MODE = on_permissive;

5.主从检查变量ONGOING_ANONYMOUS_TRANSACTION_COUNT

SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'; ??

MySQL status变量是一种用于传达MySQL服务器执行状态或者MySQL服务器性能数据的状态变量,你可以调整这些变量来调整MySQL的性能,它能用来分析MySQL服务器当前的运行状态,分析MySQL的性能等MySQL系统的状态。

Ongoing_anonymous_transaction_count 是 MySQL Status 变量之一,用来表示MySQL当前正在运行的无名事务的数量。 这个值会在MySQL中执行 Begin 命令后增加,随着对应的 Commit 或 Rollback 命令的执行而减少。因为没有指定的事务名,因此称为无名事务,也就是没有 begin transaction来定义事务的场景

需要等到该变量为0

6.确保所有的匿名事务(非GTID事务)已经被完全复制到所有的server上。

主库

show master status;

从库

show slave status\G

确保事务在从库都会放完毕
或者:

SELECT MASTER_POS_WAIT('mysql-bin.00000x', xxx);

7.确认整个拓扑结构中已经没有匿名事务的存在,如之前产生的所有匿名事务已经全部被执行完毕,甚至二进制日志中也不要有匿名事务,可以通过flush logs,并让mysql来自动清理旧的二进制日志文件。

8.设置GLOBAL.GTID_MODE为ON,主库从库都要设置,无先后顺序。

SET @@GLOBAL.GTID_MODE = ON;

9.修改my.cnf的配置文件,重启数据库服务,避免数据库重启后失效。

#开启GTID复制功能
gtid_mode=on
enforce_gtid_consistency=1

把传统复制停掉,执行 stop slave, 再执行change master to master_auto_position=1,然后start slave,开启主从复制。
stop slave;

change master to master_auto_position=1;

start slave;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 5.7引入了GTID(Global Transaction Identifier)特性,这对于高可用性和故障恢复非常重要。GTID提供了一种跟踪跨多个数据库实例的事务的方式,使得主从复制更为可靠。下面是安装和配置MySQL 5.7 GTID主从的一般步骤: 1. **安装MySQL 5.7**: - 下载MySQL 5.7的二进制包,可以从MySQL官网下载适用于你操作系统的版本。 - 按照官方文档的指示进行安装,确保在安装过程中选择“GTID”作为复制模式。 2. **初始化主服务器**: - 配置my.cnf文件,开启GTID相关选项,例如设置`gtid_mode=ON` 和 `enforce_gtid_consistency=ON`。 - 启动MySQL服务并创建一个包含GTID的初始数据库实例。 3. **启用二进制日志**: - 在my.cnf中配置`log_bin`和`expire_logs_days`以管理二进制日志,这对主从复制至关重要。 4. **配置主从复制**: - 创建复制用户并分配合适的权限,如`REPLICATION SLAVE`。 - 在主服务器上执行`CHANGE MASTER TO`命令来指定从服务器的信息,包括GTID的位置(例如,`MASTER_GTID_FILE`和`MASTER_BINLOG_POS`)。 5. **启动从服务器**: - 使用相同的GTID配置启动从服务器。 - 运行`START SLAVE`命令,让从服务器开始同步数据。 6. **监控和调试**: - 定期检查`SHOW MASTER STATUS`和`SHOW SLAVE STATUS\G`来确保复制状态正常。 - 如果遇到问题,查看错误日志和使用`mysqlbinlog`工具分析事务历史。 **相关问题--:** 1. GTID是什么,它如何提高复制的可靠性? 2. 在配置主从复制时,如何正确设置`CHANGE MASTER TO`命令? 3. 有哪些常见的GTID复制问题及解决方法?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值