基于二进制包最小化安装,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_FILE和MASTER_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: Yes和Slave_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';
注意事项:
PURGE BINARY LOGS TO 'mysql-bin.000003'只会删除 mysql-bin.000003 之前的 binlog。- 在 GTID 复制中,执行 PURGE BINARY LOGS 操作还会同步修改 gtid_purged 的值。
- 在正常的主从复制环境中,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
注意事项:
- until_option 只对 SQL 线程有效果,对 IO 线程没有效果。
- 在 GTID 复制中,也可指定位置点。
- 执行 STOP SLAVE 会清空 until_option。
恢复正常复制:
sql
START SLAVE;
-- Until_Condition 恢复为 None
10.11 GTID 复制中跳过指定事务
在 GTID 复制中,跳过事务的本质是注入空事务。
步骤:
- 查看从库报错信息,确定冲突的 GTID 事务号。
- 停止复制。
- 设置
gtid_next为冲突事务的 GTID 值。 - 执行空事务(BEGIN; COMMIT;)。
- 恢复
gtid_next为 AUTOMATIC。 - 启动复制。
示例:
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
该命令会执行以下操作:
- 删除所有的 binlog,并从头开始生成一个新的 binlog。
- 清空 binlog 索引文件(mysql-bin.index)。
- 在 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';
-- (空)
注意事项:
- 在正常的主从复制环境中,切记不要在主库上执行 RESET MASTER,否则会导致主从复制中断甚至数据不一致。
- 执行完 RESET MASTER,默认第一个 binlog 序号为 000001,也可通过
RESET MASTER TO xxx显式指定序号。
10.15 RESET SLAVE
该命令会执行以下操作:
- 删除所有的 relay log,并从头开始生成一个新的 relay log。
- 清空 relay log 索引文件。
- 清空 mysql.slave_relay_log_info 表的内容。
- 清除 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 才能建立复制
注意事项:
- 无论是 RESET SLAVE 还是 RESET SLAVE ALL,执行前必须停止复制。
- 两者都不会清除 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 |
+----+-------------+-----------------+------+---------+--------+--------------------------------------------------+------------------+
- 106 是 IO 线程(Waiting for source to send event)
- 107 是 协调线程(Replica has read all relay log; waiting for more updates)
- 108-111 是 SQL 工作线程(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 |