MySQL 8.0.35 GTID主从复制常见管理操作

基于二进制包最小化安装,GTID 主从复制架构 + 复制常见管理操作验证

  • 主库:192.168.195.141
  • 从库:192.168.195.142

1. 环境信息

项目 主库 (Master) 从库 (Slave)
IP 192.168.195.141 192.168.195.142
MySQL版本 8.0.35(二进制包,glibc2.17) 8.0.35(二进制包,glibc2.17)
server-id 1 2
gtid_mode ON ON
enforce_gtid_consistency ON ON
角色 Master Slave

2. 清空环境(两台均执行)

bash 复制代码
systemctl stop mysqld
rm -rf /data/mysql/3306/data/*
rm -f /etc/my.cnf
rm -f /etc/systemd/system/mysqld.service
rm -f /etc/sysconfig/mysql
systemctl daemon-reload

3. 编辑配置文件

3.1 主库 /etc/my.cnf(141)

ini 复制代码
[client]
socket = /data/mysql/3306/data/mysql.sock
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
user    = mysql
port    = 3306
socket  = /data/mysql/3306/data/mysql.sock
log_error = /data/mysql/3306/data/mysqld.err
log_timestamps = system
log-bin = mysql-bin
server-id = 1
gtid_mode = ON
enforce_gtid_consistency = ON

参数解释:

  • log-bin = mysql-bin:开启 binlog,主库必须开启。
  • server-id = 1:服务器唯一标识,主从环境中每个实例必须不同。
  • gtid_mode = ON:开启 GTID 复制。GTID(Global Transaction Identifier)为每个事务分配全局唯一ID,格式为 source_id:transaction_id
  • enforce_gtid_consistency = ON:强制 GTID 一致性,只允许事务安全的语句执行。gtid_mode 为 ON 时此参数必须为 ON。

3.2 从库 /etc/my.cnf(142)

ini 复制代码
[client]
socket = /data/mysql/3306/data/mysql.sock
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
user    = mysql
port    = 3306
socket  = /data/mysql/3306/data/mysql.sock
log_error = /data/mysql/3306/data/mysqld.err
log_timestamps = system
server-id = 2
gtid_mode = ON
enforce_gtid_consistency = ON

与主库的区别:

  • server-id = 2:从库的 server-id 必须与主库不同。
  • 从库不需要显式配置 log-bin,MySQL 8.0 默认开启 binlog。

4. 初始化实例(两台均执行)

bash 复制代码
chown mysql.mysql /data/mysql/3306/data/
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize

获取临时密码:

bash 复制代码
grep "temporary password" /data/mysql/3306/data/mysqld.err
# 主库:A temporary password is generated for root@localhost: WaQ:zJjFg8(g
# 从库:A temporary password is generated for root@localhost: Gpugkz=er1/b

5. 配置 systemd 服务(两台均执行)

5.1 创建 /etc/systemd/system/mysqld.service

ini 复制代码
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/data/mysql/3306/data/mysqld.pid
TimeoutSec=0
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --pid-file=/data/mysql/3306/data/mysqld.pid --daemonize $MYSQLD_OPTS
EnvironmentFile=-/etc/sysconfig/mysql
LimitNOFILE = 65535
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

5.2 创建 /etc/sysconfig/mysql

ini 复制代码
MYSQLD_OPTS=

6. 启动实例(两台均执行)

bash 复制代码
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld

7. 修改 root 密码(两台均执行)

bash 复制代码
# 使用临时密码登录后修改
/usr/local/mysql/bin/mysql -uroot -S /data/mysql/3306/data/mysql.sock -p'临时密码' --connect-expired-password -e "alter user user() identified by 'Root@123456';"

8. 搭建 GTID 主从复制

8.1 主库创建复制用户

sql 复制代码
-- 在主库(141)执行
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

8.2 从库建立 GTID 复制

sql 复制代码
-- 在从库(142)执行
CHANGE MASTER TO
MASTER_HOST='192.168.195.141',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_AUTO_POSITION=1,
GET_MASTER_PUBLIC_KEY=1;

START SLAVE;

参数解释:

  • MASTER_AUTO_POSITION=1:使用 GTID 自动定位,无需手动指定 MASTER_LOG_FILEMASTER_LOG_POS。从库 IO 线程连接主库时,会自动交换 GTID 信息,从库告诉主库自己已执行了哪些事务,主库只发送缺失的事务。
  • GET_MASTER_PUBLIC_KEY=1:MySQL 8.0 默认使用 caching_sha2_password 认证插件,非 SSL 连接时需获取主库公钥完成认证。

8.3 验证主从状态

sql 复制代码
-- 在从库(142)执行
show slave status\G
复制代码
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.195.141
                  Master_User: repl
                  Master_Port: 3306
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1614
               Relay_Log_File: MYSQL142-relay-bin.000002
                Relay_Log_Pos: 1830
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
          Exec_Master_Log_Pos: 1614
        Seconds_Behind_Master: 0
             Master_Server_Id: 1
                  Master_UUID: 078fca9e-883c-11f1-83a7-000c29048d1f
           Retrieved_Gtid_Set: 078fca9e-883c-11f1-83a7-000c29048d1f:1-6
            Executed_Gtid_Set: 078fca9e-883c-11f1-83a7-000c29048d1f:1-6
                Auto_Position: 1
         Get_master_public_key: 1

重点关注:

  • Slave_IO_Running: YesSlave_SQL_Running: Yes,两个均为 Yes 代表主从复制搭建成功。
  • Auto_Position: 1,表示使用 GTID 自动定位。
  • Retrieved_Gtid_Set:已从主库获取的 GTID 事务集。
  • Executed_Gtid_Set:已执行的 GTID 事务集。

9. 数据同步测试

主库写入测试数据:

sql 复制代码
-- 在主库(141)执行
CREATE DATABASE test_gtid;
USE test_gtid;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (1,'gtid_data');
SELECT * FROM t1;
-- +----+-----------+
-- | id | name      |
-- +----+-----------+
-- |  1 | gtid_data |
-- +----+-----------+

从库查询验证:

sql 复制代码
-- 在从库(142)执行
SELECT * FROM test_gtid.t1;
-- +----+-----------+
-- | id | name      |
-- +----+-----------+
-- |  1 | gtid_data |
-- +----+-----------+

数据一致,GTID 主从复制工作正常。


10. 复制的常见管理操作

10.1 查看主库状态

sql 复制代码
-- 在主库(141)执行
SHOW MASTER STATUS;
复制代码
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000001 |     1614 |              |                  | 078fca9e-883c-11f1-83a7-000c29048d1f:1-6  |
+------------------+----------+--------------+------------------+-------------------------------------------+

字段含义:

  • File:当前正在写入的 binlog 文件名。
  • Position:当前 binlog 写入位置。
  • Executed_Gtid_Set:已执行的 GTID 事务集。

10.2 查看从库复制状态

sql 复制代码
-- 在从库(142)执行
SHOW SLAVE STATUS\G

常见字段含义:

字段 含义
Master_Host, Master_User, Master_Port 主库的地址、复制用户及端口
Master_Log_File, Read_Master_Log_Pos IO 线程当前正在接收的 binlog 位置
Relay_Master_Log_File, Exec_Master_Log_Pos SQL 线程当前正在重放的 binlog 位置
Slave_IO_Running IO 线程状态:Yes/No/Connecting
Slave_SQL_Running SQL 线程状态:Yes/No
Replicate_Do_XXX, Replicate_Ignore_XXX 基于库表的复制过滤规则
Until_Condition, Until_Log_File, Until_Log_Pos SQL 线程应用到指定位置点时停止
Seconds_Behind_Master 从库相对于主库的延迟(秒)
SQL_Delay, SQL_Remaining_Delay 延迟复制相关,SQL_Delay 为期望延迟时间,SQL_Remaining_Delay 为当前事务还需等待多久
Retrieved_Gtid_Set 接受过的事务所对应的 GTID 集
Executed_Gtid_Set 从库执行过的事务所对应的 GTID 集
Auto_Position 对应 CHANGE MASTER TO 中的 MASTER_AUTO_POSITION
Channel_Name Channel 名,常用于多源复制

10.3 主库查看从库信息

方式一:SHOW PROCESSLIST

sql 复制代码
-- 在主库(141)执行
SHOW PROCESSLIST;
复制代码
+----+-----------------+---------------------+------+-------------+--------+--------------------------------------------------+------------------+
| Id | User            | Host                | db   | Command     | Time   | State                                            | Info             |
+----+-----------------+---------------------+------+-------------+--------+--------------------------------------------------+------------------+
|  5 | event_scheduler | localhost           | NULL | Daemon      | 1414   | Waiting on empty queue                           | NULL             |
| 40 | repl            | 192.168.195.142:56338 | NULL | Binlog Dump GTID | 100 | Source has sent all binlog to replica; waiting for more updates | NULL |
| 43 | root            | localhost           | NULL | Query       | 0      | init                                             | show processlist |
+----+-----------------+---------------------+------+-------------+--------+--------------------------------------------------+------------------+

注意 :GTID 复制下,主库的 Binlog Dump 线程显示为 Binlog Dump GTID

方式二:SHOW REPLICAS(MySQL 8.0 新语法,等同于 SHOW SLAVE HOSTS)

sql 复制代码
-- 在主库(141)执行
SHOW REPLICAS;
复制代码
+-----------+------+-------+-----------+--------------------------------------+
| Server_Id | Host | Port  | Source_Id | Replica_UUID                         |
+-----------+------+-------+-----------+--------------------------------------+
|         2 |      |  3306 |         1 | 078f6fdb-883c-11f1-978f-000c29a59955 |
+-----------+------+-------+-----------+--------------------------------------+

10.4 查看当前实例拥有的 Binlog

sql 复制代码
SHOW BINARY LOGS;
-- 或
SHOW MASTER LOGS;
复制代码
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 |      1614 | No        |
+------------------+-----------+-----------+

10.5 切换日志

sql 复制代码
-- 在主库(141)执行
FLUSH BINARY LOGS;

该命令会关闭当前的 binlog,并重新打开一个新的 binlog。

验证:

sql 复制代码
SHOW BINARY LOGS;
复制代码
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 |      1805 | No        |
| mysql-bin.000002 |       197 | No        |
+------------------+-----------+-----------+

10.6 删除 Binlog

sql 复制代码
-- 基于文件名删除(删除指定文件之前的 binlog)
PURGE BINARY LOGS TO 'mysql-bin.000003';

-- 基于时间点删除
PURGE BINARY LOGS BEFORE '2024-01-14 09:10:20';

注意事项:

  1. PURGE BINARY LOGS TO 'mysql-bin.000003' 只会删除 mysql-bin.000003 之前的 binlog。
  2. 在 GTID 复制中,执行 PURGE BINARY LOGS 操作还会同步修改 gtid_purged 的值。
  3. 在正常的主从复制环境中,PURGE 前需确保从库已读取要删除的 binlog。

验证:

sql 复制代码
-- 删除前
SHOW BINARY LOGS;
-- +------------------+-----------+-----------+
-- | Log_name         | File_size | Encrypted |
-- +------------------+-----------+-----------+
-- | mysql-bin.000001 |       180 | No        |
-- | mysql-bin.000002 |      1805 | No        |
-- | mysql-bin.000003 |       197 | No        |
-- +------------------+-----------+-----------+

PURGE BINARY LOGS TO 'mysql-bin.000003';

-- 删除后
SHOW BINARY LOGS;
-- +------------------+-----------+-----------+
-- | Log_name         | File_size | Encrypted |
-- +------------------+-----------+-----------+
-- | mysql-bin.000003 |       197 | No        |
-- +------------------+-----------+-----------+

SHOW MASTER STATUS;
-- Executed_Gtid_Set 不变,gtid_purged 更新

10.7 查看 Binlog 的内容

sql 复制代码
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
sql 复制代码
-- 示例
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
复制代码
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                             |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         126 | Server ver: 8.0.35, Binlog ver: 4               |
| mysql-bin.000001 | 126 | Previous_gtids |         1 |         157 |                                                  |
| mysql-bin.000001 | 157 | Stop           |         1 |         180 |                                                  |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------+

如果不指定 log_name,则默认是 SHOW BINARY LOGS 中的第一个 binlog。

10.8 停止/启动复制

停止复制:

sql 复制代码
-- 停止 IO 线程和 SQL 线程
STOP SLAVE;

-- 单独停止 IO 线程
STOP SLAVE IO_THREAD;

-- 单独停止 SQL 线程
STOP SLAVE SQL_THREAD;

启动复制:

sql 复制代码
-- 启动 IO 线程和 SQL 线程
START SLAVE;

-- 单独启动 IO 线程
START SLAVE IO_THREAD;

-- 单独启动 SQL 线程
START SLAVE SQL_THREAD;

验证:

sql 复制代码
-- 单独停止 IO 线程
STOP SLAVE IO_THREAD;
SHOW SLAVE STATUS\G
-- Slave_IO_Running: No
-- Slave_SQL_Running: Yes

-- 重新启动 IO 线程
START SLAVE IO_THREAD;
SHOW SLAVE STATUS\G
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes

-- 单独停止 SQL 线程
STOP SLAVE SQL_THREAD;
SHOW SLAVE STATUS\G
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: No

-- 重新启动 SQL 线程
START SLAVE SQL_THREAD;
SHOW SLAVE STATUS\G
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes

10.9 修改复制选项(CHANGE MASTER TO)

在开启复制后,如果要修改某个选项的值,需在停止复制后重新执行 CHANGE MASTER TO 语句,但只需指定对应的选项,不用带上其它选项。

sql 复制代码
-- 示例:修改复制用户密码
-- 1. 主库修改密码
ALTER USER 'repl'@'%' IDENTIFIED BY 'repl_new_123';

-- 2. 从库更新复制密码
STOP SLAVE;
CHANGE MASTER TO MASTER_PASSWORD='repl_new_123';
START SLAVE;

-- 验证
SHOW SLAVE STATUS\G
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes

10.10 START SLAVE UNTIL(SQL 线程应用到指定位置后停止)

START SLAVE 支持 until_option,让 SQL 线程应用在指定位置点时停止。

完整语法:

sql 复制代码
START {SLAVE | REPLICA} [thread_types] [until_option] [connection_options] [channel_option]

until_option:
    UNTIL { {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set
          | MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
          | SOURCE_LOG_FILE = 'log_name', SOURCE_LOG_POS = log_pos
          | RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
          | SQL_AFTER_MTS_GAPS }

GTID 复制中的 until_option:

  • SQL_BEFORE_GTIDS:SQL 线程在应用到指定 GTID 事务时(不包括该事务)停止。
  • SQL_AFTER_GTIDS:SQL 线程在应用完指定 GTID 事务后停止。

示例:SQL_AFTER_GTIDS

sql 复制代码
-- 假设主库当前 Executed_Gtid_Set 为 078fca9e-...:1-17
-- 让从库执行完事务16后停止
STOP SLAVE;
START SLAVE UNTIL SQL_AFTER_GTIDS='078fca9e-883c-11f1-83a7-000c29048d1f:16';

验证:

sql 复制代码
SHOW SLAVE STATUS\G
-- Slave_SQL_Running: No
-- Until_Condition: SQL_AFTER_GTIDS
-- Executed_Gtid_Set: 078fca9e-883c-11f1-83a7-000c29048d1f:1-16

注意事项:

  1. until_option 只对 SQL 线程有效果,对 IO 线程没有效果。
  2. 在 GTID 复制中,也可指定位置点。
  3. 执行 STOP SLAVE 会清空 until_option。

恢复正常复制:

sql 复制代码
START SLAVE;
-- Until_Condition 恢复为 None

10.11 GTID 复制中跳过指定事务

在 GTID 复制中,跳过事务的本质是注入空事务

步骤:

  1. 查看从库报错信息,确定冲突的 GTID 事务号。
  2. 停止复制。
  3. 设置 gtid_next 为冲突事务的 GTID 值。
  4. 执行空事务(BEGIN; COMMIT;)。
  5. 恢复 gtid_next 为 AUTOMATIC。
  6. 启动复制。

示例:

sql 复制代码
-- 1. 查看报错信息
SHOW SLAVE STATUS\G
-- Last_SQL_Error: Error 'Table 't3' already exists' on query...
-- Executed_Gtid_Set: 078fca9e-883c-11f1-83a7-000c29048d1f:1-10

-- 2. 确定冲突事务:Executed_Gtid_Set 最大值 + 1 = 11
--    或直接从 Last_SQL_Error 中获取事务号

-- 3. 注入空事务跳过
STOP SLAVE;
SET SESSION gtid_next='078fca9e-883c-11f1-83a7-000c29048d1f:11';
BEGIN;
COMMIT;
SET SESSION gtid_next='automatic';
START SLAVE;

-- 4. 验证
SHOW SLAVE STATUS\G
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Last_SQL_Error: (空)

与位置点复制的区别:

  • 位置点复制:STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;
  • GTID 复制:注入空事务,需明确指定要跳过的 GTID 值。

10.12 操作不写入 Binlog

sql 复制代码
SET SESSION sql_log_bin=0;
-- 此会话中的操作不会写入 binlog,也不会复制到从库
-- ... 执行操作 ...
SET SESSION sql_log_bin=1;

验证:

sql 复制代码
-- 主库
SHOW MASTER STATUS;
-- File: mysql-bin.000003, Position: 1884, Executed_Gtid_Set: 078fca9e-...:1-12

SET SESSION sql_log_bin=0;
CREATE DATABASE test_nobinlog;
USE test_nobinlog;
CREATE TABLE t1 (id INT PRIMARY KEY, val VARCHAR(20));
INSERT INTO t1 VALUES (1,'no_binlog_data');
SET SESSION sql_log_bin=1;

SHOW MASTER STATUS;
-- File: mysql-bin.000003, Position: 1884, Executed_Gtid_Set: 078fca9e-...:1-12
-- Position 和 Executed_Gtid_Set 没有变化,说明操作未写入 binlog

-- 从库验证
SHOW DATABASES LIKE 'test_nobinlog';
-- Empty set(从库没有该库,验证 sql_log_bin=0 生效)

10.13 判断主库操作是否已在从库执行

GTID 复制:WAIT_FOR_EXECUTED_GTID_SET

sql 复制代码
SELECT WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout])

给出 GTID 集合,如果从库已执行完这些事务则立即返回 1,否则阻塞等待。可指定 timeout(秒),超时返回 -1。

示例:

sql 复制代码
-- 主库写入数据后查看 GTID
-- SHOW MASTER STATUS → Executed_Gtid_Set: 078fca9e-...:1-14

-- 从库等待该 GTID 集合执行完毕
SELECT WAIT_FOR_EXECUTED_GTID_SET('078fca9e-883c-11f1-83a7-000c29048d1f:1-14', 5);
-- 返回 1 表示已执行完毕

位置点复制:MASTER_POS_WAIT

sql 复制代码
SELECT MASTER_POS_WAIT('master_log_file', master_log_pos [, timeout][, channel])

给出具体的 binlog 及位置点,如果从库 SQL 线程还没重放到这个位置,该命令会一直阻塞。超时返回 -1。

示例:

sql 复制代码
-- 主库 SHOW MASTER STATUS → File: mysql-bin.000001, Position: 1614

-- 从库等待
SELECT MASTER_POS_WAIT('mysql-bin.000001', 1614, 5);
-- 返回 0 表示已执行到指定位置

10.14 RESET MASTER

该命令会执行以下操作:

  1. 删除所有的 binlog,并从头开始生成一个新的 binlog。
  2. 清空 binlog 索引文件(mysql-bin.index)。
  3. 在 GTID 复制中,会同时清空变量 gtid_executed、gtid_purged 及表 mysql.gtid_executed 的内容。

示例:

sql 复制代码
-- 执行前
SHOW BINARY LOGS;
-- +------------------+-----------+-----------+
-- | Log_name         | File_size | Encrypted |
-- +------------------+-----------+-----------+
-- | mysql-bin.000003 |      3302 | No        |
-- +------------------+-----------+-----------+

SHOW VARIABLES LIKE 'gtid_executed';
-- 078fca9e-883c-11f1-83a7-000c29048d1f:1-17

RESET MASTER;

-- 执行后
SHOW BINARY LOGS;
-- +------------------+-----------+-----------+
-- | Log_name         | File_size | Encrypted |
-- +------------------+-----------+-----------+
-- | mysql-bin.000001 |       157 | No        |
-- +------------------+-----------+-----------+

SHOW VARIABLES LIKE 'gtid_executed';
-- (空)

注意事项:

  1. 在正常的主从复制环境中,切记不要在主库上执行 RESET MASTER,否则会导致主从复制中断甚至数据不一致。
  2. 执行完 RESET MASTER,默认第一个 binlog 序号为 000001,也可通过 RESET MASTER TO xxx 显式指定序号。

10.15 RESET SLAVE

该命令会执行以下操作:

  1. 删除所有的 relay log,并从头开始生成一个新的 relay log。
  2. 清空 relay log 索引文件。
  3. 清空 mysql.slave_relay_log_info 表的内容。
  4. 清除 mysql.slave_master_info 表中 binlog 的位置点信息(Master_log_name 和 Master_log_pos),但保留连接信息

验证:

sql 复制代码
STOP SLAVE;
RESET SLAVE;

-- 连接信息仍然保留
SELECT Host, User_name, User_password, Port FROM mysql.slave_master_info;
-- Host: 192.168.195.141
-- User_name: repl
-- User_password: 123456
-- Port: 3306

-- 可直接通过 START SLAVE 重启复制(GTID 复制中,因为 gtid_purged,这样操作没有问题)
START SLAVE;

注意: 基于位置点的复制中,RESET SLAVE 后直接 START SLAVE 会导致 IO 线程从主库现有的第一个 binlog 开始重新拉取,容易导致主从数据不一致。

10.16 RESET SLAVE ALL

相对于 RESET SLAVE,RESET SLAVE ALL 会直接清空 mysql.slave_master_info 表的所有内容,包括连接信息。

验证:

sql 复制代码
STOP SLAVE;
RESET SLAVE ALL;

-- 连接信息全部清除
SELECT COUNT(*) FROM mysql.slave_master_info;
-- 0

SHOW SLAVE STATUS\G
-- Empty set(无输出)

-- 需要重新执行 CHANGE MASTER TO 才能建立复制

注意事项:

  1. 无论是 RESET SLAVE 还是 RESET SLAVE ALL,执行前必须停止复制。
  2. 两者都不会清除 GTID 相关的任何信息。

10.17 重放 Relay Log

sql 复制代码
CHANGE MASTER TO
RELAY_LOG_FILE = 'relay_log_name',
RELAY_LOG_POS = relay_log_pos;

指定从库 relay log 的位置点重新开始重放,对应 SHOW SLAVE STATUS 中的 Relay_Log_File 和 Relay_Log_Pos。


11. GTID 相关参数确认

11.1 主库(141)

复制代码
gtid_mode                = ON
enforce_gtid_consistency = ON
gtid_executed            = 078fca9e-883c-11f1-83a7-000c29048d1f:1-6
gtid_next                = AUTOMATIC
gtid_purged              = 

11.2 从库(142)

复制代码
gtid_mode                = ON
enforce_gtid_consistency = ON
gtid_executed            = 078fca9e-883c-11f1-83a7-000c29048d1f:1-6
gtid_next                = AUTOMATIC
gtid_purged              = 

说明:

  • gtid_next = AUTOMATIC:自动获取下一个 GTID 值,默认值。
  • 从库的 gtid_executed 包含主库的 GTID 事务(通过复制获取)。

12. 从库 show processlist 说明

sql 复制代码
-- 在从库(142)执行
show processlist;
复制代码
+----+-------------+-----------------+------+---------+--------+--------------------------------------------------+------------------+
| Id | User        | Host            | db   | Command | Time   | State                                            | Info             |
+----+-------------+-----------------+------+---------+--------+--------------------------------------------------+------------------+
|  5 | event_scheduler | localhost   | NULL | Daemon  | 1431   | Waiting on empty queue                           | NULL             |
| 106| system user | connecting host | NULL | Connect | 117    | Waiting for source to send event                 | NULL             |
| 107| system user |                 | NULL | Query   | 80     | Replica has read all relay log; waiting for more updates | NULL  |
| 108| system user |                 | NULL | Query   | 80     | Waiting for an event from Coordinator            | NULL             |
| 109| system user |                 | NULL | Connect | 117    | Waiting for an event from Coordinator            | NULL             |
| 110| system user |                 | NULL | Connect | 117    | Waiting for an event from Coordinator            | NULL             |
| 111| system user |                 | NULL | Connect | 117    | Waiting for an event from Coordinator            | NULL             |
| 115| root        | localhost       | NULL | Query   | 0      | init                                             | show processlist |
+----+-------------+-----------------+------+---------+--------+--------------------------------------------------+------------------+
  • 106IO 线程(Waiting for source to send event)
  • 107协调线程(Replica has read all relay log; waiting for more updates)
  • 108-111SQL 工作线程(Waiting for an event from Coordinator)

13. 连接信息

bash 复制代码
# 主库(141)
/usr/local/mysql/bin/mysql -uroot -S /data/mysql/3306/data/mysql.sock -p'Root@123456'

# 从库(142)
/usr/local/mysql/bin/mysql -uroot -S /data/mysql/3306/data/mysql.sock -p'Root@123456'

14. 管理操作验证汇总

序号 操作 命令 验证结果
1 查看主库状态 SHOW MASTER STATUS ✅ 显示 File、Position、Executed_Gtid_Set
2 查看从库状态 SHOW SLAVE STATUS ✅ IO/SQL 线程均为 Yes,Auto_Position=1
3 主库查看从库信息 SHOW PROCESSLIST / SHOW REPLICAS ✅ 显示 Binlog Dump GTID 线程和从库信息
4 查看 Binlog 列表 SHOW BINARY LOGS ✅ 显示所有 binlog 文件及大小
5 切换日志 FLUSH BINARY LOGS ✅ 生成新 binlog 文件
6 删除 Binlog PURGE BINARY LOGS TO ✅ 删除指定文件之前的 binlog,同步更新 gtid_purged
7 查看 Binlog 内容 SHOW BINLOG EVENTS ✅ 显示 Format_desc、Previous_gtids 等事件
8 停止/启动 IO 线程 STOP/START SLAVE IO_THREAD ✅ IO 线程可单独控制
9 停止/启动 SQL 线程 STOP/START SLAVE SQL_THREAD ✅ SQL 线程可单独控制
10 修改复制选项 CHANGE MASTER TO MASTER_PASSWORD ✅ 停止复制后修改,重启后生效
11 START SLAVE UNTIL START SLAVE UNTIL SQL_AFTER_GTIDS ✅ SQL 线程执行到指定 GTID 后停止
12 GTID 跳过事务 SET gtid_next + 空事务 ✅ 注入空事务跳过冲突,复制恢复正常
13 操作不写 binlog SET sql_log_bin=0 ✅ Position 和 GTID 不变,从库无数据
14 WAIT_FOR_EXECUTED_GTID_SET SELECT WAIT_FOR_EXECUTED_GTID_SET ✅ 返回 1 表示已执行完毕
15 MASTER_POS_WAIT SELECT MASTER_POS_WAIT ✅ 返回 0 表示已执行到指定位置
16 RESET MASTER RESET MASTER ✅ 清空所有 binlog 和 GTID 信息
17 RESET SLAVE RESET SLAVE ✅ 清空 relay log,保留连接信息
18 RESET SLAVE ALL RESET SLAVE ALL ✅ 清空所有连接信息,需重新 CHANGE MASTER TO
相关推荐
网安墨雨2 小时前
MySQL数据库 SQL语句详解
自动化测试·软件测试·数据库·python·sql·mysql
muddjsv3 小时前
SQLite与MySQL/PostgreSQL本质区别:运行模型、并发、部署、权限全方位对比
mysql·postgresql·sqlite
Mico185 小时前
MySQL 8.0.35 GTID + 延迟复制 + 过滤复制搭建
mysql·dba
会编程的土豆6 小时前
结构体 struct:用代码描述用户、订单、座位
数据库·mysql·golang
瞬间&永恒~19 小时前
【MySQL】4-6:在同一个主机上使用 systemd 运行多个 MySQL服务器
服务器·数据库·mysql
一嘴一个橘子21 小时前
MysqL 哪些情况适合创建索引
mysql
时间的拾荒人21 小时前
MySQL C语言连接 - 从入门到实战
android·c语言·mysql
Database_Cool_1 天前
云数据库控制台好不好用、能不能可视化操作:阿里云 RDS MySQL 控制台体验详解
数据库·mysql·阿里云
番茄炒鸡蛋加糖1 天前
MySQL 实战调优& 分表基础
数据库·mysql