MySQL8.0数据库GTID主从同步方案

GTID模式实现MySQL 主从复制

在这里插入图片描述

GTID介绍

从mysql数据库从5.6.5开始新增一种基于GDIT的复制方式。通过GDIT保证每个主库上提交的事务在集群中有一个唯一的ID.这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
GTID (Global Transaction ID) 在整个事务流程中每一个事务 ID 是全局唯一的,且在整个主从复制架构中该 ID 都不会相同。GTID 实际上 是由 UUID+TID 组成的。其中 UUID 是一个 MySQL 实例的唯一标识。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

  • server_uuid:server_uuid 是在 Mysql 首次启动过程中自动生成的一个uuid(128位) 随机值,生成后会将该值存储到数据目录的auto.cnf 中。因为是随机值,所以不同服务器的 Mysql 的server_uuid 都是不相同的。
  • transaction_id(tid):代表了该实例上已经提交的事务数量,是一个整数,初始值是 1 ,每次提交事务的时候分配给这个事务并加1 。
  • GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置。

搭建过程

1、开启数据库GTID

该步骤,主从数据库都要执行。

如果数据库已经在使用了,就按照下面的方式进行开启,首先先检查前置环境:

# 前置检查
mysql> SHOW VARIABLES LIKE 'log_bin';  
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.01 sec)

mysql> SHOW VARIABLES LIKE 'binlog_format';  
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> SELECT trx_id, trx_started, trx_state FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 60; 
Empty set (0.00 sec)

mysql> SELECT trx_id, trx_started, trx_state FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 30;
Empty set (0.00 sec)

mysql> SET GLOBAL enforce_gtid_consistency = WARN; 
Query OK, 0 rows affected (0.00 sec)

mysql> 

环境检查完成后,主数据库,开启数据库GTID:

# 开启GTID
mysql> SET GLOBAL enforce_gtid_consistency = ON; 
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL gtid_mode = OFF_PERMISSIVE; 
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW STATUS LIKE 'Anonymous_gtid_transactions';  
Empty set (0.00 sec)

mysql> SET GLOBAL gtid_mode = ON_PERMISSIVE; 
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW STATUS LIKE 'Anonymous_gtid_transactions'; 
Empty set (0.00 sec)

mysql> SET GLOBAL gtid_mode = ON; 
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW VARIABLES LIKE '%gtid%'; 
+----------------------------------+-------------------------------------------+
| Variable_name                    | Value                                     |
+----------------------------------+-------------------------------------------+
| binlog_gtid_simple_recovery      | ON                                        |
| enforce_gtid_consistency         | ON                                        |
| gtid_executed                    | ec7295d4-478e-11f0-97a3-e0008469f653:1-12 |
| gtid_executed_compression_period | 0                                         |
| gtid_mode                        | ON                                        |
| gtid_next                        | AUTOMATIC                                 |
| gtid_owned                       |                                           |
| gtid_purged                      |                                           |
| session_track_gtids              | OFF                                       |
+----------------------------------+-------------------------------------------+
9 rows in set (0.01 sec)

mysql> SELECT @@GLOBAL.gtid_executed;
+--------------------------------------------+
| @@GLOBAL.gtid_executed                     |
+--------------------------------------------+
| ec7295d4-478e-11f0-97a3-e0008469f653:1-141 |
+--------------------------------------------+
1 row in set (0.00 sec)

如果是初始的数据库,那么可以直接在配置文件里面编写配置:

vim /etc/mysql/mysql.conf.d/mysqld.cnf
server_id = 1
enforce_gtid_consistency = ON
gtid_mode = ON

# 重启数据库即可

2、导出数据库表

使用备份脚本的方式,要在你的备份脚本中加入 GTID 相关标签,核心是添加 --set-gtid-purged=ON(或 AUTO)参数 —— 这是 mysqldump 携带 GTID 信息的关键,同时保留原脚本中适配 GTID 的参数。

# 增加--set-gtid-purged=ON参数
mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \
    --all-databases \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --source-data=2 \
    --flush-logs \
    --max-allowed-packet=512M \
    --set-gtid-purged=ON \
    > "$BACKUP_FILE" 2>> "$LOG_FILE"

数据库备份脚本参考以下文章:

https://blog.youkuaiyun.com/2401_83649605/article/details/154486622?spm=1001.2014.3001.5502

3、导入从数据库

使用上面的脚本的话,可以直接这样执行导入操作:

# 输入数据库密码即可(tips:最好主从数据库密码一致,没别的意思就是方便)
$ gunzip < mysql_full_backup_20251105_105304.sql.gz | mysql -u root -p

4、开启主从配置

根据个人环境更改相应配置:

RESET SLAVE ALL; 

CHANGE MASTER TO
  MASTER_HOST='192.168.119.1',
  MASTER_PORT=3306,
  MASTER_USER='repl',                   # 主从同步用户,自行创建
  MASTER_PASSWORD='mysql_password',		# repl用户密码
  MASTER_CONNECT_RETRY=10,
  MASTER_AUTO_POSITION=1;      # id:1-xxx 冒号后面的数字

START SLAVE IO_THREAD;
START SLAVE SQL_THREAD;

验证主从配置:

# 已经开启了主从同步
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.119.3
                  Master_User: repl
                  Master_Port: 12105
                Connect_Retry: 10
              Master_Log_File: binlog.000236
          Read_Master_Log_Pos: 1258
               Relay_Log_File: master-relay-bin.000002
                Relay_Log_Pos: 596
        Relay_Master_Log_File: binlog.000236
             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: 1258
              Relay_Log_Space: 969
              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: 1
                  Master_UUID: e0674f87-4791-11f0-8c77-24a52cab5029
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica 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: e0674f87-4791-11f0-8c77-24a52cab5029:5
            Executed_Gtid_Set: e0674f87-4791-11f0-8c77-24a52cab5029:1-5
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

# 接下来等待主从数据同步
# 当满足以下条件时,说明主从数据完全一致,同步进入稳定状态:
# Seconds_Behind_Master=0;
# 从库Executed_Gtid_Set = 主库gtid_executed;
# 主库执行测试事务(如INSERT/UPDATE),从库能实时同步(延迟≤1 秒)。

主从同步状态判断依据:

Master_Log_FileRead_Master_Log_Pos 这两个参数合起来表示的是读到的主库的最新位点,第一参数是代表读取到了哪个文件,第二个是读取到的文件的位置。

Relay_Master_Log_FileExec_Master_Log_Pos,这两个参数合起来表示的是从库执行的最新位点。

如果红色框起来的两个参数:Master_Log_FileRelay_Master_Log_File 相等,则说明从库读到的最新文件和主库上生成的文件相同,这里都是 mysql-bin.000934。

如果蓝色框起来的两个参数 Read_Master_Log_PosExec_Master_Log_Pos 相等,则说明从库读到的日志文件的位置和从库上执行日志文件的位置相同,这里都是 59521082。

当上面两组参数都相等时,则说明没有延迟。

<think>嗯,用户想验证MySQL 8.0主从同步是否正常。首先,我需要回忆一下MySQL主从同步的基本检查方法。通常,主从同步的状态可以通过在从库上执行`SHOW SLAVE STATUS`命令来查看。不过,用户可能还需要具体的步骤和需要注意的指标。 首先,用户可能需要知道如何连接到从库的MySQL实例。这需要正确的登录命令,比如`mysql -u用户名 -p密码 -P端口`。然后,执行`SHOW SLAVE STATUS\G`来获取详细的同步信息。这时候,关键字段是Slave_IO_Running和Slave_SQL_Running,这两个必须都是Yes,否则同步有问题。此外,Seconds_Behind_Master表示复制延迟,如果这个值持续很高,可能意味着有延迟问题。 接下来,用户可能还需要检查主库和从库的数据一致性。这时候,可以使用`SHOW MASTER STATUS`在主库上查看当前的二进制日志位置和文件,然后在从库上对比`Relay_Master_Log_File`和`Exec_Master_Log_Pos`是否匹配。如果一致,说明从库已经同步到最新的位置。 另外,用户可能不知道如何处理常见错误。比如,如果Slave_SQL线程报错,可能需要跳过错误或者重新同步数据。这时候,可以使用`STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;`来跳过错误,但这需要谨慎操作。对于数据不一致的情况,可能需要使用mysqldump或者克隆工具重新建立从库。 还有,用户提到的引用中有关于脚本监控的内容,比如检查两个线程的状态是否为Yes。可能用户有自动化监控的需求,这时候可以建议编写脚本定期检查`SHOW SLAVE STATUS`的输出,并在状态异常时报警。 需要注意的是,MySQL 8.0可能有新的特性或变化,比如默认的身份验证插件可能不同,或者在复制配置中的某些参数需要调整。例如,确保主库的`server_id`唯一,启用二进制日志,以及正确配置从库的连接信息。 用户可能还关心如何验证数据是否实时同步。可以建议在主库上执行写操作,比如插入一条测试数据,然后在从库查询是否存在该数据,以确认同步是否实时生效。 最后,用户可能需要了解如何通过日志排查问题。检查MySQL的错误日志,查看是否有复制相关的错误信息,这有助于快速定位问题原因。比如,网络中断、权限问题或者表结构不一致都可能导致同步失败。 总结起来,回答需要分步骤详细说明检查方法,包括命令、关键指标、数据一致性验证、常见错误处理,以及日志检查等。同时,结合用户提供的引用中的脚本监控方法,可以推荐自动化检查的方案,确保主从状态持续正常。</think>### MySQL 8.0主从同步状态验证方法 #### **1. 检查从库同步状态** 登录从库MySQL执行以下命令: ```sql SHOW SLAVE STATUS\G ``` **关键指标验证:** - `Slave_IO_Running` 和 `Slave_SQL_Running` 必须均为 `Yes`,否则同步异常[^1] - `Seconds_Behind_Master` 应为 `0` 或较小数值(表示无延迟) - `Last_IO_Error` 和 `Last_SQL_Error` 需为空 - `Relay_Master_Log_File` 应与主库的 `File`(通过 `SHOW MASTER STATUS` 获取)一致 #### **2. 主从数据一致性验证** **主库操作:** ```sql SHOW MASTER STATUS; -- 记录File和Position CREATE DATABASE sync_test; -- 创建测试对象 INSERT INTO test_table VALUES (NOW()); -- 插入测试数据 ``` **从库验证:** ```sql SHOW DATABASES; -- 检查sync_test是否存在 SELECT * FROM test_table; -- 确认新插入数据已同步 ``` #### **3. 错误排查方法** - **线程未运行**:检查网络连接、主从账号权限(需`REPLICATION SLAVE`权限)、`server_id`唯一性 - **数据不一致**:使用`mysqldump`重新同步或`mysqlpump`克隆工具[^2] - **GTID模式异常**:需确保`gtid_mode=ON`且`enforce_gtid_consistency=ON` #### **4. 监控脚本示例** 编写自动化检测脚本(Python示例): ```python import pymysql slave_conn = pymysql.connect(host='从库IP', user='monitor', password='密码') cursor = slave_conn.cursor() cursor.execute("SHOW SLAVE STATUS") result = cursor.fetchone() if result[9] == 'Yes' and result[10] == 'Yes': print("主从同步正常") else: print(f"同步异常: IO线程状态={result[9]}, SQL线程状态={result[10]}") ``` #### **5. 日志检查** 查看从库错误日志定位问题: ```bash tail -100 /var/log/mysql/mysql-error.log ``` 常见错误包含网络中断、主键冲突、表结构不一致等[^3]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值