zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    UITabBarController生命周期(使用storyoard搭建)
    ios应用数据存储方式(归档)
    ios应用数据存储方式(偏好设置)
    使用picker View控件完成一个简单的选餐应用
    ios应用数据存储方式(XML属性列表-plist)
    控制器的View的创建
    控制器的创建
    权限管理具体代码实现
    gitHub相关
    初始Ajax
  • 原文地址:https://www.cnblogs.com/Csir/p/7799450.html
Copyright © 2011-2022 走看看