zoukankan      html  css  js  c++  java
  • 四十二、GTID复制

    GTID复制介绍

    全称 Global Transaction ID
    GTID会对每个已提交的事务提供一个唯一的编号,用于区分不同事务,可用于备份恢复,DUMP并发传输,SQL线程并发回放等。

    5.6版本默认没有开启。
    5.7版本默认没有开启也有类似于GTID的功能。

    官方定义如下
    GTID = source_id :transaction_id
    例如:7E11FA47-31CA-19E1-9E56-C43AA21293967:29

    source_id:
    也就是server_uuid,用于取代server_id,是MySQL首次启动自动生成的一个128位全局唯一的一串字符,保存在data/auto.cnf文件中,用于标识一个MySQL数据库实例。

    transaction_id:
    从1开始自增的序号,表示这个主库执行的第n个事务。

    server_id:
    是手工配置在my.cnf文件中的参数,用于表示mysql实例

    GTID相关参数

    重要参数

    gtid-mode=on #开启gtid复制模式
    enforce-gtid-consistency=true #强制GTID的一致性
    log-slave-updates=1 #让slave更新binlog日志
    

    案例

    环境如下:
    主库:master 10.154.0.111
    从库1:slave1 10.154.0.112
    从库2:slave2 10.154.0.113

    为了保证实验环境不受其他因素干扰,先删除从库原来的数据,重新构建主从,生产环境最好做好备份。

    1、如果原来开启了MySQL,需要关闭

    #关闭的几种方式
    $ /etc/init.d/mysqld stop
    $ pkill mysql
    $ pkill mysqld
    
    $ ps -ef | grep mysql
    $ kill -9 xxxx
    

    2、删除data/目录下的文件

    $ rm -rf /usr/local/mysql/data
    

    3、配置/etc/my.cnf

    #master配置文件
    cat > /etc/my.cnf <<EOF
    [mysqld]
    basedir=/usr/local/mysql
    datadir=/usr/local/mysql/data
    socket=/tmp/mysql.sock
    server_id=111
    port=3306
    secure-file-priv=/tmp
    autocommit=0
    log_bin=/data/binlog/mysql-bin
    binlog_format=row
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    [mysql]
    prompt=master [\d]> #这个标签可替换mysql> 样式,用了就知道
    EOF
    
    #slave1配置文件
    cat > /etc/my.cnf <<EOF
    ...
    server_id=112
    ...
    [mysql]
    prompt=slave1 [\d]>
    EOF
    
    #slave2配置文件
    cat > /etc/my.cnf <<EOF
    ...
    server_id=113
    ...
    [mysql]
    prompt=slave2 [\d]>
    EOF
    

    4、初始化数据

    $ mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data
    

    5、启动数据库

    /etc/init.d/mysqld start
    

    6、构建主从

    #在主库master创建授权复制用户
    mysql> grant replication slave  on *.* to repl@'10.154.0.%' identified by '123';
    
    #备份主库,注意不能加--set-gtid-purged=OFF参数,后续会说明
    $ mysqldump -A -B  |gzip >/backup/full20210414.sql.gz
    
    #复制到从库中
    $ scp -rp /backup/full20210414.sql.gz root@10.154.0.112:/backup
    $ scp -rp /backup/full20210414.sql.gz root@10.154.0.113:/backup
    
    #恢复数据
    $ gzip -d full20210414.sql.gz
    $ mysql < /backup/full20210414.sql
    
    #在slave1跟slave2中更改change master to
    mysql> change master to 
    master_host='10.154.0.111',
    master_user='repl',
    master_password='123',
    master_port=3306,
    MASTER_AUTO_POSITION=1;
    
    mysql> start slave;
    

    GTID开启主从复制无需在从库的change master to中写binlog日志名,跟pos号。

    --set-gtid-purged参数说明
    默认值为AUTO,会在备份里插入如下标记,方便从库恢复数据后从哪里开始进行gtid复制,如果为OFF,则从库恢复完成后会从头开始请求主库的GTID。
    SET @@GLOBAL.GTID_PURGED='3d111a50-9355-11eb-b573-000c29a2912e:1-6;

    MASTER_AUTO_POSITION=1参数说明
    读取relaylog最后一个事务GTID,然后向主库索取新的GTID事务。

    7、验证

    #主库
    mysql> show master status;
    3d111a50-9355-11eb-b573-000c29a2912e:1-3
    
    #从库
    mysql> show slave statusG;
    ...
    Retrieved_Gtid_Set: 3d111a50-9355-11eb-b573-000c29a2912e:1-3 #已经接收到的GTID事务
    Executed_Gtid_Set: 3d111a50-9355-11eb-b573-000c29a2912e:1-3, #已经执行到的GTID事务
    

    可以从上述,清楚的看到接收到的GTID事务编号,执行了多少等,精确到每个事务。

    GTID跳过事务冲突

    因为GTID是连续的,不允许空缺的,所以不能简单的skip掉冲突的事务,只能通过注入空事务替换掉冲突的事务。

    stop slave;
    set gtid_next='3d111a50-9355-11eb-b573-000c29a2912e:3'; #这里为报错的GTID号,也就是想跳过的GTID号
    begin;commit; #写入空事务替换
    set gtid_next='AUTOMATIC'; #自动比较GTID,恢复继续进行
    start slave;
    

    GTID复制优点

    1、保证事务全局统一,每个事务都对应一个号码
    2、截取日志方便,判断起点终点方便
    3、直观看到主从工作状态,是否延时,卡在了哪个事务上
    4、并发传输binlog,并发SQL回放
    5、主从复制构建很方便,不再需要binlog文件名,pos号,只需要MASTER_AUTO_POSITION=1


    学习来自:B站课程:GTID复制 P139-143,《MySQL入门与提高实践》第17章

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    什么是socket ??
    WebView的使用
    UIWebView 使用
    UIWebView与JavaScript的交互
    iOS中UIWebView使用JS交互
    iOS app支付宝接口调用的一点总结(补充支付宝SDK&Demo下载地址)
    51单片机 按键,键盘检测
    51单片机 数码管的显示与译码器
    C51数据类型扩充定义
    STC12C5A60S2 内部AD+1602显示
  • 原文地址:https://www.cnblogs.com/tz90/p/14659019.html
Copyright © 2011-2022 走看看