zoukankan      html  css  js  c++  java
  • MYSQL之GTID的主从复制

    1.什么是GTID

    GTID(Global Transaction ID)是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号。
    它的官方定义如下:
    GTID = source_id :transaction_id
    7E11FA47-31CA-19E1-9E56-C43AA21293967:29
    什么是sever_uuid,和Server-id 区别?
    核心特性: 全局唯一,具备幂等性
    

    2.GTID主从复制的优点

    1.GTID同步时开启多个SQL线程,每一个库同步时开启一个线程
    2.binlog在rows模式下,binlog内容比寻常的主从更加简洁
    3.GTID主从复制会记录主从信息,不需要手动配置binlog和位置点
    

    3.GTID主从复制的缺点

    1.备份时更加麻烦,需要额外加一个参数 --set-gtid=on
    2.主从复制出现错误,没有办法跳过错误
    

    4.GTID的核心参数

    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    
    gtid-mode=on                        --启用gtid类型,否则就是普通的复制架构
    enforce-gtid-consistency=true               --强制GTID的一致性
    log-slave-updates=1                 --slave更新是否记入日志
    

    5.搭建GTID主从复制

    1.配置三台数据库

    # 配置第一台主库
    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=1
    log_bin=/usr/local/mysql/data/mysql-bin
    
    # 配置第一台从库
    [root@db02 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=2
    
    # 配置第二台从库
    [root@db03 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=3
    

    2.查看是否开启GTID

    mysql> show variables like '%gtid%';
    +---------------------------------+-----------+
    | Variable_name                   | Value     |
    +---------------------------------+-----------+
    | binlog_gtid_simple_recovery     | OFF       |
    | enforce_gtid_consistency        | OFF       |
    | gtid_executed                   |           |
    | gtid_mode                       | OFF       |
    | gtid_next                       | AUTOMATIC |
    | gtid_owned                      |           |
    | gtid_purged                     |           |
    | simplified_binlog_gtid_recovery | OFF       |
    +---------------------------------+-----------+
    8 rows in set (0.00 sec)
    

    3.开启GTID

    # 主库配置
    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=1
    log_bin=/usr/local/mysql/data/mysql-bin
    gtid_mode=on
    enforce_gtid_consistency
    log-slave-updates
    
    # 从库1的配置
    [root@db02 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=2
    log_bin=/usr/local/mysql/data/mysql-bin
    gtid_mode=on
    enforce_gtid_consistency
    log-slave-updates
    
    # 从库2的配置
    [root@db02 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=3
    log_bin=/usr/local/mysql/data/mysql-bin
    gtid_mode=on
    enforce_gtid_consistency
    log-slave-updates
    

    4.主库创建用户

    mysql> grant replication slave on *.* to rep@'172.16.1.5%' identified by '123';
    

    5.主库数据同步到从库

    mysqldump -uroot -p -R --triggers --master-data=2 --single-transaction -A > /tmp/full.sql
    scp /tmp/full.sql 172.16.1.51:/tmp
    mysql < /tmp/full.sql
    

    6.从库配置主从

    mysql> change master to
        -> master_host='172.16.1.51',
        -> master_user='rep',
        -> master_password='123',
        -> master_auto_position=1;
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    

    6.GTID 复制和普通复制的区别

    CHANGE MASTER TO
    MASTER_HOST='172.16.1.51',
    MASTER_USER='rep',
    MASTER_PASSWORD='123',
    MASTER_PORT=3307,
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=444,
    MASTER_CONNECT_RETRY=10;
    
    change master to 
    master_host='172.16.1.51',
    master_user='rep',
    master_password='123' ,
    MASTER_AUTO_POSITION=1;
    start slave;
    
    (0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
    (1)额外功能参数(3个)
    (2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;
    (3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
    (4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式
        SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
        告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。
    

    7.GTID 从库误写入操作处理

    查看监控信息:
    Last_SQL_Error: Error 'Can't create database 'oldboy'; database exists' on query. Default database: 'oldboy'. Query: 'create database oldboy'
    
    Retrieved_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-3
    Executed_Gtid_Set:  71bfa52e-4aae-11e9-ab8c-000c293b577e:1-2,
    7ca4a2b7-4aae-11e9-859d-000c298720f6:1
    
    注入空事物的方法:
    
    stop slave;
    set gtid_next='99279e1e-61b7-11e9-a9fc-000c2928f5dd:3';
    begin;commit;
    set gtid_next='AUTOMATIC';
        
    这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID。
    最好的解决方案:重新构建主从环境
    
  • 相关阅读:
    [CAMCOCO][C#]我的系统架构.服务器端.(一)
    开博啦,加油!!
    Django RestFul framework Serializer序列化器的使用(定义)
    Django项目快速搭建
    Django简介
    python搭建虚拟环境
    大专生自学web前端前前后后
    实现资源国际化
    利用ajax实现页面动态修改
    七牛使用
  • 原文地址:https://www.cnblogs.com/Applogize/p/13381512.html
Copyright © 2011-2022 走看看