• GTID复制详解


    前言

    GTID复制是MySQL 5.6后的新功能,在传统的方式里,主从切换后,需要找到binlog和POS点,然后执行命令change master to 指向新的主库。对于不是很有经验的人来说,往往会找错,造成主从同步复制报错,在MySQL 5.6版本里,无须再找binlog和POS点,只需要知道master的IP、端口、账号和密码即可,因为同步复制是自动的,MySQL会通过内部机制GTID(Global Transaction ID)自动找点同步。另外,MariaDB 10.0版本中,默认开启GTID,无需设置任何参数。

    GTID复制名词解释

    server_uuid

    服务器身份ID。在第一次启动MySQL时,会自动生成一个server_uuid并写入数据目录下的auto.cnf文件里,官方不建议修改。并且server_uuid跟GTID有密切联系。

    GTID

    全局事务标识符。使用这个功能时,每次事务提交都会在binlog里生成一个唯一的标识符,它由UUID和事务ID组成。首次提交的事务ID为1,第二次为2,第三次为3,依次类推。
    开启GTID时,slave进行同步复制的时候,无须找到binlog日志和POS点,直接change master to master_auto_position = 1即可,它会自动找点同步。

    GTID的工作流程

    1、在master上一个事务提交,并写入binlog里
    2、binlog日志发送到slave,slave接收完并写入中继日志里,slave读取到这个GTID,并设置gtid_next的值。例如:

    SET@@SESSION.GTID_NEXT='B0869D03-D4A9-11E1-A2E-000C290A6B8F:3;'
    

    然后告诉slave接下来的事务必须使用GTID,并写入它自动的binlog里。
    3、slave检查并确认这个GTID没有被使用,如果没有被使用,那么开始执行这个事务并写入它自已的binlog里。
    4、由于gtid_next的值不为空,slave不会尝试去生成一个新的gtid,而是通过主从同步来获取GTID

    注意: 如果使用了GTID,就不能使用传统的binlog和POS方式。

    GTID的局限性包含以下几方面

    • GTID同步复制是基于事务的,所以MyISAM表不支持,这可能导致多个GTID分配给同一个事务
    • 不支持CREATE TABLE...SELECT 语句。因为该语句会被拆分成create table和insert两个事务,并且,如果这两个事务被分配了同一个GTID,则会导致instert被备库忽略掉。

    设置MySQL 5.6 GTID方式的主从同步

    在my.cnf中加入:

    log-bin = mysql-bin
    binlog_format = row
    log_slave_updates = 1
    gtid_mode = ON
    enforce_gtid_consistency = ON
    

    在master导入数据到slave后,在slave执行:

    mysql> CHANGE MASTER TO 
    > MASTER_HOST = master-host,
    > MASTER_PORT = master-port,
    > MASTER_USER = repl-user,
    > MASTER_PASSWORD = repl-password,
    > MASTER_AUTO_POSITION = 1;
    
  • 相关阅读:
    Java多线程(3) Volatile的实现原理
    Java 多线程(2)-Executor
    Java 多线程(1)-Thread和Runnable
    nginx+php部署
    MySQL的慢查询分析
    MySQL 错误
    log4j.properties配置详解
    Windows下Nginx的安装与配置(转)
    Java 字符的验证
    Spring MVC3返回JSON数据中文乱码问题解决(转)
  • 原文地址:https://www.cnblogs.com/Csir/p/7799450.html
Copyright © 2020-2023  润新知