MySql主从复制:GTID复制

GTID(global transaction identifiers)复制是完全基于事务的复制,每个在主库上执行的事务都会被分配一个唯一的全局ID并记录和应用在从库上。

1、当一个事务在主库提交时,为此事务分配一个GTID,并记录在主库的bin log中。

2、主库的bin log传输到从库的relay log中,从库读取此GTID并生成gtid_next系统参数。

3、从库验证此GTID有没有在从库中使用过,如果没有则应用此事务在从库上。

      MySql 5.6使用bin log记录同步复制的信息(UUID:事务号),salve必须开启bin log和log_slave_updates参数;

      MySql 5.7使用gtid_executed系统表记录同步复制信息(UUID:事务号),无需开启log_slave_updates;

      select * from mysql.gtid_executed;

一、按异步复制的方式将主从关系配置好

MySql异步复制

二、配置GTID

1、将主库和从库都设置为read only,确保两者之间的数据完全同步:set @@global.read_only=ON;

2、关闭主库和从库:mysqladmin -u 用户名 -p shutdown

3、设置主从库GTID; enforce-gtid-consistency参数确保只对gtid复制机制安全的语句才会被log

    gtid-mode=on       #配置主库和从库my.cnf
    enforce-gtid-consistency=on  #配置主库和从库my.cnf

4、重启主从库mysql,并关闭从库的slave;

    systemctl restart mysqld; #重启MySql
    stop slave;  #关闭MySql从库复制进程

5、重新设置主从库的复制关系

    CHANGE MASTER TO
        MASTER_HOST='主机地址',
        MASTER_PORT=端口号,
        MASTER_USER='用户名',
        MASTER_PASSWORD='密码',
        MASTER_AUTO_POSITION=1;

6、启动从库slave进程:start slave;

7、关闭MySql的只读模式:set @@global.read_only=OFF;

8、编辑数据后查看效果:

      主库:show master status; 找到Executed_Gtid_Set [最后执行的事务ID]

      从库:show slave status\G  找到Retrieved_Gtid_Set [最后取到的事务ID] 和Executed_Gtid_Set [最后执行的事务ID]

三、使用GTID的限制

由于GTID复制是基于事务的,所以MySql的一些属性不被支持;

当一个事务中既包含对InnoDB表的操作,也包含对非事务型存储引擎表(MyISAM)的操作时,会导致一个事务中可能会产生多个GTID的情况;或者是master和slave的表使用的存储引擎不一致时,都会导致GTID复制功能不正常;

create table ... select语句在基于语句复制的环境中是不安全的,在基于行复制的环境中,此语句会被拆分成两个事件:建表和insert数据,在某些情况下这两个事件会被分配相同的GTID,从而导致insert数据的操作被忽略,所以GTID不支持此语句;

create/drop temporary table 语句在GTID复制环境中不能放在事务中执行,只能单独执行,并且autocommit要开启。

sql_slave_skip_counter语句是不支持的,如果要跳过事务,可以使用gtid_executed变量。

 

 

发布了65 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_26900081/article/details/103240155