mysql的GTID同步原理介绍及详细配置过程

这篇具有很好参考价值的文章主要介绍了mysql的GTID同步原理介绍及详细配置过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是GTID?

GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID 实际上 是由UUID+TID 组成的。
其中 UUID 是一个 MySQL 实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

下面是一个GTID的具体形式:03a1eb63-c21a-11ec-b07f-000c2987bea6:1-25,冒号分割前边为UUID,后边为TID。

GTID 集合可以包含来自多个 MySQL 实例的事务,它们之间用逗号分隔。

GTID的工作原理

①当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
②binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置GTID_next变量,即告诉Slave,下一个要执行的GTID值。
③sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
④如果有记录,说明该GTID的事务已经执行,slave会忽略。
⑤如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
⑥在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

数据库角色 IP 系统与MySQL版本 有无数据
主数据库 192.168.121.164 RHEL7 MySQL5.7 无数据
从数据库 192.168.121.133 RHEL7 MySQL5.7 无数据

mysql> grant replication slave on \*.* to 'slave'@'192.168.121.%' identified by 'MySql@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

配置主库文件

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-name-resolve
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-name-resolve

log-bin=mysql-bin                        #开启二进制日志
server-id=1                                #服务器ID,必须唯一
gtid-mode=on                              #开启gtid模式
enforce-gtid-consistency=on       #强制gtid一致性,开启后对特定的create table不支持
binlog-format=row                       #默认为mixed混合模式,更改成row复制,为了数据一致性
log-slave-updates=1                    #从库binlog记录主库同步的操作日志
skip-slave-start=1                        #跳过slave复制线程
binlog-ignore-db=mysql

然后重启一下数据库

[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# systemctl status mysqld 

查看GTID模式状态

[root@localhost ~]# mysql -uroot -pMySql@123 -e 'show variables like "%GTID%";'

+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+

配置从库文件

[root@localhost ~]#  vim /etc/my.cnf
[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-name-resolve

log-bin=mysql-bin
server-id=2
gtid-mode=on  
enforce-gtid-consistency=on          
binlog-format=row
log-slave-updates=1
skip-slave-start=1

然后重启一下数据库

[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# systemctl status mysqld 

查看GTID模式状态

[root@localhost ~]# mysql -uroot -pMySql@123 -e 'show variables like "%GTID%";'

+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+

开启主从同步

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to
     master_host='192.168.121.164',
     master_user='slave',
     master_password='MySql@123',
     master_auto_position=1;

使用GTID方式同步的时候,必须指定master_auto_position=1
GTID使用master_auto_position=1代替了基于binlog和position号的主从同步方式,更便于主从同步的搭建

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.11
                  Master_User: Jaking
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: server12-relay-bin.000002
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 577
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 11
                  Master_UUID: 03a1eb63-c21a-11ec-b07f-000c2987bea6
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql gtid,数据库,mysql,adb,数据库,linux,运维

然后进行数据测试

create table aa(nid int,stuname char(15),sex int);

insert into aa value (2001,'tom',1),(2002,'mary',0),(2003,'cak',1);

select * from aa; 

mysql gtid,数据库,mysql,adb,数据库,linux,运维

然后去从库查看数据

mysql gtid,数据库,mysql,adb,数据库,linux,运维

发现库已经有了,到这里已经可以差不多了

当然还是要看下表了,结果还是正常的

mysql gtid,数据库,mysql,adb,数据库,linux,运维

这时候我们可以看下两个库的状态

查看主库状态

mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 |     1620 |              |                  | 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

mysql gtid,数据库,mysql,adb,数据库,linux,运维

查看从库状态

mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 |     1584 |              |                  | 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

mysql gtid,数据库,mysql,adb,数据库,linux,运维

到这里就完成辣

还有可以测试一下从库停机后,主库仍在写入数据,从库恢复后能否自动同步数据

从库停掉主从同步

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.10.11
                  Master_User: Jaking
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 1620
               Relay_Log_File: server12-relay-bin.000002
                Relay_Log_Pos: 1833
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1620
              Relay_Log_Space: 2043
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 11
                  Master_UUID: 03a1eb63-c21a-11ec-b07f-000c2987bea6
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6
            Executed_Gtid_Set: 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql gtid,数据库,mysql,adb,数据库,linux,运维

然后去主库添加数据

mysql gtid,数据库,mysql,adb,数据库,linux,运维

查看从库

mysql gtid,数据库,mysql,adb,数据库,linux,运维

是没有同步信息过来的,因为我们没有开启同步

然后我们开启同步

mysql> stop slave;
mysql> reset slave all;
mysql> change master to
     master_host='192.168.121.164',
     master_user='slave',
     master_password='MySql@123',
     master_auto_position=1;

mysql> start slave;

mysql gtid,数据库,mysql,adb,数据库,linux,运维

所有测试就完成了。

祝大家都能成功。文章来源地址https://www.toymoban.com/news/detail-771450.html

到了这里,关于mysql的GTID同步原理介绍及详细配置过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 基于 GTID 主从复制

    GTID 定义 GTID 是 MySQL 事务标识 ,为每一个提交的事务都生成一个标识,并且是 全局唯一 的,这个特性是从 MySQL5.6 引进的。 组成 GTID 是由 UUID + TID,UUID 是MySQL的 唯一标识 ,每个MySQL实例之间都是不同的。TID是代表了该实例上已经提交的事务数量,并且随着 事务提交 单调递

    2024年01月16日
    浏览(78)
  • MySQL GTID 主从复制错误修复方法

    简介:  GTID 复制错误修复方法 MySQL 传统的主从复制方式使用 master_log_files 和 master_log_pos 两个参数来确定复制位点。当出现复制错误时,可以设置跳过出错的事务来恢复同步,MySQL 提供了 sql_slave_skip_counter 参数来实现此功能。使用方法如下: 如果使用 GTID 的主从复制方式,

    2024年02月12日
    浏览(47)
  • MySQL主从复制(基于GTID--事务ID方式)

    关于gitd的介绍 MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善; mysql数据库从5.6.5开始新增一种基于GDIT的复制方式。通过GDIT保证每个主库上提交的事务在集群中有一个唯一的ID.这种方式强化了数据库的主备一致性,故障恢复以及容错能力。 GTID (Global Transaction ID) 在整个事务流程

    2024年02月07日
    浏览(41)
  • mysql的gtid主从复制,从库误操作更新操作,

    一:查看mysql的从库,发现sql进程状态 “no”.提示执行传输过来的binlog日志,执行失败, 二:查看主库对应的二进制日志的gtid地方。插入一些数据。 # mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001 |grep -A 100 \\\"560d72ff-b057-11ee-84ba-5254005c1b84:8\\\" 三:从日志来看是写入错了, 1:第一

    2024年02月02日
    浏览(46)
  • MySQL8.0+数据库GTID主从模式搭建

    参见: MySQL数据库8.0+版本部署安装-CSDN博客 部署环境[例]: 主库:192.168.179.153:3306 从库:192.168.179.154:3306 主从库开启GTID模式 // 主从库均修改,修改从库配置文件,在[mysqld]下添加如下配置 $ vim /etc/my.cnf gtid_mode = on enforce_gtid_consistency = on 需检查server-id配置,为主从架构中的所有

    2024年02月04日
    浏览(66)
  • mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

    一 前言   MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到“Got fatal error 1236 from master when reading data from binary log” 这类的报错/报警。本文整理了常见的几种 error 1236 报错

    2024年02月12日
    浏览(43)
  • IAR9.30以上版本安装、注册、新建工程和配置过程详细介绍

    IAR 一般是指一款嵌入式软件的集成开发环境,类似于 MDK-Keil 这款软件。IAR 的官网: https://www.iar.com/ IAR 对于不同的内核处理器,是对应不同的 IAR 软件的,IAR 到目前为止支持大部分的MCU,比如8051系列、ARM架构系列、MSP430系列、AVR系列等等这些常用的芯片架构。 对于 ARM 架构

    2024年02月03日
    浏览(44)
  • MySQL 字符集概念与原理及如何配置字符集 - 超详细图文详解

    目录 一、字符集概念 1、字符(Character) 2、字符编码 3、字符集(Character set) 二、字符集原理 1、ASCII字符集 2、GB2312 3、GBK 4、GB18030 5、BIG5 6、Unicode 编码 三、字符序 四、MySQL字符集 字符序 1、mysql 字符集 2、mysql 字符序 3、字符集与字符序的关系 五、MySQL 数据存储字符集

    2024年02月04日
    浏览(56)
  • MYSQL_GTIDS_SLAVE服务器报错1236

    1.slave服务器 老规矩看报错信息: Got fatal error 1236 from master when reading data from binary log: \\\'Slave has more GTIDs than the master has, using the master\\\'s SERVER_UUID. This may indicate that the end of the binary log was truncated or that the last binary log file was lost, e.g., after a power or disk failure when sync_binlog != 1. The mas

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包