基于二进制包最小化安装,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 |
| 延迟复制 | --- | MASTER_DELAY=60 |
| 角色 | Master | Slave |
2. 安装 MySQL(两台均执行)
2.1 创建用户与组
bash
groupadd mysql
useradd -g mysql mysql
2.2 解压二进制包
bash
cd /usr/local/
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.35-linux-glibc2.17-x86_64.tar.xz
tar xvf mysql-8.0.35-linux-glibc2.17-x86_64.tar.xz
ln -s mysql-8.0.35-linux-glibc2.17-x86_64 mysql
验证:
bash
/usr/local/mysql/bin/mysql --version
# /usr/local/mysql/bin/mysql Ver 8.0.35 for Linux on x86_64 (MySQL Community Server - GPL)
2.3 创建数据目录
bash
mkdir -p /data/mysql/3306/data
chown mysql.mysql /data/mysql/3306/data/
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 一致性,只允许事务安全的语句执行。
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
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize
获取临时密码:
bash
grep "temporary password" /data/mysql/3306/data/mysqld.err
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
sql
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 自动定位,无需手动指定 binlog 文件和位置。GET_MASTER_PUBLIC_KEY=1:MySQL 8.0 默认使用 caching_sha2_password 认证插件,非 SSL 连接时需获取主库公钥完成认证。
8.3 验证主从状态
sql
-- 在从库(142)执行
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Auto_Position: 1
9. 延迟复制
9.1 什么是延迟复制
延迟复制是指从库的 SQL 线程在执行主库的事务时,故意延迟指定的时间。这样当主库发生误操作(如误删数据)时,从库还有一段时间的数据是正确的,可以用来恢复数据。
9.2 搭建延迟复制
方式一:搭建时设置
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,
MASTER_DELAY=60;
方式二:运行时设置(推荐,无需重建复制)
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE MASTER TO MASTER_DELAY = 60;
START SLAVE;
参数解释:
MASTER_DELAY = 60:设置从库延迟 60 秒执行主库的事务。单位为秒,常用值如 3600(1小时)、28800(8小时)等。
9.3 验证延迟复制
sql
-- 在从库(142)执行
show slave status\G
SQL_Delay: 60
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
输出解释:
SQL_Delay: 60:期望延迟时间,即 CHANGE MASTER TO 语句中设置的 MASTER_DELAY 值。SQL_Remaining_Delay: NULL:当前没有需要等待的事务。当有事务在等待延迟时,此值显示剩余等待秒数。Slave_SQL_Running_State:当事务在等待延迟时,显示Waiting until SOURCE_DELAY seconds after source executed event。
9.4 延迟效果测试
步骤1:主库写入数据
sql
-- 在主库(141)执行
CREATE DATABASE test_delay;
USE test_delay;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (1,'delay_test');
SELECT *, NOW() AS now_time FROM t1;
-- +----+------------+---------------------+
-- | id | name | now_time |
-- +----+------------+---------------------+
-- | 1 | delay_test | 2026-07-23 23:13:57 |
-- +----+------------+---------------------+
步骤2:立即在从库查询(DDL 不受延迟影响,DML 受延迟影响)
sql
-- 在从库(142)执行,立即查询
USE test_delay;
SHOW TABLES;
-- t1 表已存在(DDL 不受延迟影响)
SELECT * FROM t1;
-- Empty set(INSERT 还在等待 60 秒延迟)
步骤3:查看延迟状态
sql
-- 在从库(142)执行
show slave status\G
SQL_Delay: 60
SQL_Remaining_Delay: 32
Slave_SQL_Running_State: Waiting until SOURCE_DELAY seconds after source executed event
SQL_Remaining_Delay: 32表示还有 32 秒才执行 INSERT 事务。
步骤4:等待 60 秒后查询
sql
-- 在从库(142)执行,等待约 60 秒后
SELECT * FROM test_delay.t1;
-- +----+------------+
-- | id | name |
-- +----+------------+
-- | 1 | delay_test |
-- +----+------------+
数据在约 60 秒后同步到从库,延迟复制验证成功。
9.5 取消延迟复制
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE MASTER TO MASTER_DELAY = 0;
START SLAVE;
10. 过滤复制
10.1 什么是过滤复制
过滤复制允许从库选择性地复制主库的数据。可以指定只复制某些库/表,或忽略某些库/表,甚至将主库的某个库重写到从库的另一个库中。
10.2 过滤复制语法
sql
CHANGE REPLICATION FILTER filter[, filter] [, ...] [FOR CHANNEL channel]
filter: {
REPLICATE_DO_DB = (db_list)
| REPLICATE_IGNORE_DB = (db_list)
| REPLICATE_DO_TABLE = (tbl_list)
| REPLICATE_IGNORE_TABLE = (tbl_list)
| REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
| REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
| REPLICATE_REWRITE_DB = (db_pair_list)
}
注意:
- 不指定
FOR CHANNEL,默认创建全局规则,对所有 Channel 生效。- 执行
CHANGE REPLICATION FILTER后,对应的规则会写入参数文件。- 清除过滤规则:将对应规则设为空列表,如
CHANGE REPLICATION FILTER REPLICATE_DO_DB = ()。
10.3 准备测试数据
在主库创建多个测试库和表:
sql
-- 在主库(141)执行
CREATE DATABASE db_do;
CREATE DATABASE db_ignore;
CREATE DATABASE db_other;
CREATE DATABASE dbA;
CREATE DATABASE dbB;
USE db_do;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
CREATE TABLE t2 (id INT PRIMARY KEY, name VARCHAR(20));
CREATE TABLE t_old1 (id INT PRIMARY KEY, name VARCHAR(20));
CREATE TABLE t_new1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (1,'db_do_t1');
INSERT INTO t2 VALUES (2,'db_do_t2');
INSERT INTO t_old1 VALUES (3,'old_data');
INSERT INTO t_new1 VALUES (4,'new_data');
USE db_ignore;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (5,'db_ignore_t1');
USE db_other;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (6,'db_other_t1');
USE dbA;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (7,'dbA_t1');
10.4 REPLICATE_DO_DB --- 只复制指定库
含义: 只复制指定库的操作,其他库的操作被忽略。相当于 --replicate-do-db。
设置:
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db_do);
START SLAVE;
验证:
sql
-- 查看过滤规则
show slave status\G
-- Replicate_Do_DB: db_do
在主库插入新数据:
sql
-- 在主库(141)执行
INSERT INTO db_do.t1 VALUES (100,'do_db_new');
INSERT INTO db_ignore.t1 VALUES (101,'ignore_db_new');
INSERT INTO db_other.t1 VALUES (102,'other_db_new');
在从库查询:
sql
-- 在从库(142)执行
SELECT * FROM db_do.t1 WHERE id=100;
-- +-----+------------+
-- | id | name |
-- +-----+------------+
-- | 100 | do_db_new | ✅ 已同步
-- +-----+------------+
SELECT * FROM db_ignore.t1 WHERE id=101;
-- Empty set ❌ 未同步(被过滤)
SELECT * FROM db_other.t1 WHERE id=102;
-- Empty set ❌ 未同步(被过滤)
结论: 只有 db_do 库的数据被复制,db_ignore 和 db_other 库的数据被过滤。
10.5 REPLICATE_IGNORE_DB --- 忽略指定库
含义: 忽略指定库的操作,其他库正常复制。相当于 --replicate-ignore-db。
设置:
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = (db_ignore);
START SLAVE;
注意: 设置 IGNORE_DB 前需先清除 DO_DB(设为空列表),否则 DO_DB 优先级更高。
验证:
sql
-- 查看过滤规则
show slave status\G
-- Replicate_Ignore_DB: db_ignore
在主库插入新数据:
sql
-- 在主库(141)执行
INSERT INTO db_do.t1 VALUES (9999,'do_db_9999');
INSERT INTO db_ignore.t1 VALUES (9998,'ignore_db_9998');
INSERT INTO db_other.t1 VALUES (9997,'other_db_9997');
在从库查询:
sql
-- 在从库(142)执行
SELECT * FROM db_do.t1 WHERE id=9999;
-- +------+-------------+
-- | id | name |
-- +------+-------------+
-- | 9999 | do_db_9999 | ✅ 已同步
-- +------+-------------+
SELECT * FROM db_ignore.t1 WHERE id=9998;
-- Empty set ❌ 未同步(被 IGNORE_DB 过滤)
SELECT * FROM db_other.t1 WHERE id=9997;
-- +------+---------------+
-- | id | name |
-- +------+---------------+
-- | 9997 | other_db_9997 | ✅ 已同步
-- +------+---------------+
结论: db_ignore 库的数据被忽略,db_do 和 db_other 库的数据正常复制。
10.6 REPLICATE_DO_TABLE --- 只复制指定表
含义: 只复制指定表的操作,其他表的操作被忽略。相当于 --replicate-do-table。需要指定完整的表名(db_name.table_name)。
设置:
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (), REPLICATE_DO_TABLE = (db_do.t1);
START SLAVE;
验证:
sql
-- 查看过滤规则
show slave status\G
-- Replicate_Do_Table: db_do.t1
在主库插入新数据:
sql
-- 在主库(141)执行
REPLACE INTO db_do.t1 VALUES (111111,'do_t1_111111');
REPLACE INTO db_do.t2 VALUES (222222,'do_t2_222222');
在从库查询:
sql
-- 在从库(142)执行
SELECT * FROM db_do.t1 WHERE id=111111;
-- +--------+----------------+
-- | id | name |
-- +--------+----------------+
-- | 111111 | do_t1_111111 | ✅ 已同步(在 DO_TABLE 列表中)
-- +--------+----------------+
SELECT * FROM db_do.t2 WHERE id=222222;
-- Empty set ❌ 未同步(不在 DO_TABLE 列表中)
结论: 只有 db_do.t1 表的数据被复制,db_do.t2 表的数据被过滤。
10.7 REPLICATE_IGNORE_TABLE --- 忽略指定表
含义: 忽略指定表的操作,其他表正常复制。相当于 --replicate-ignore-table。
设置:
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = (), REPLICATE_IGNORE_TABLE = (db_do.t2);
START SLAVE;
验证:
sql
-- 查看过滤规则
show slave status\G
-- Replicate_Ignore_Table: db_do.t2
在主库插入新数据:
sql
-- 在主库(141)执行
REPLACE INTO db_do.t1 VALUES (333333,'ignore_t1_333333');
REPLACE INTO db_do.t2 VALUES (444444,'ignore_t2_444444');
在从库查询:
sql
-- 在从库(142)执行
SELECT * FROM db_do.t1 WHERE id=333333;
-- +--------+-------------------+
-- | id | name |
-- +--------+-------------------+
-- | 333333 | ignore_t1_333333 | ✅ 已同步
-- +--------+-------------------+
SELECT * FROM db_do.t2 WHERE id=444444;
-- Empty set ❌ 未同步(被 IGNORE_TABLE 过滤)
结论: db_do.t2 表的数据被忽略,db_do.t1 表的数据正常复制。
10.8 REPLICATE_WILD_DO_TABLE --- 通配符匹配复制指定表
含义: 复制匹配通配符模式的表的操作,支持 % 通配符。相当于 --replicate-wild-do-table。
设置:
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = (), REPLICATE_WILD_DO_TABLE = ('db_do.t_old%');
START SLAVE;
通配符说明:
%匹配任意字符序列。db_do.t_old%匹配db_do.t_old1、db_do.t_old2、db_do.t_old_data等。
验证:
sql
-- 查看过滤规则
show slave status\G
-- Replicate_Wild_Do_Table: db_do.t_old%
在主库更新数据:
sql
-- 在主库(141)执行
REPLACE INTO db_do.t_old1 VALUES (3,'old_data_v2');
REPLACE INTO db_do.t_new1 VALUES (4,'new_data_v2');
在从库查询:
sql
-- 在从库(142)执行
SELECT * FROM db_do.t_old1 WHERE id=3;
-- +----+-------------+
-- | id | name |
-- +----+-------------+
-- | 3 | old_data_v2 | ✅ 已同步(匹配 db_do.t_old%)
-- +----+-------------+
SELECT * FROM db_do.t_new1 WHERE id=4;
-- +----+-----------+
-- | id | name |
-- +----+-----------+
-- | 4 | new_data | ❌ 未更新(不匹配 db_do.t_old%)
-- +----+-----------+
结论: 只有匹配 db_do.t_old% 模式的表(如 t_old1)被复制,不匹配的表(如 t_new1)被过滤。
10.9 REPLICATE_WILD_IGNORE_TABLE --- 通配符忽略指定表
含义: 忽略匹配通配符模式的表的操作,支持 % 通配符。相当于 --replicate-wild-ignore-table。
设置:
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = (), REPLICATE_WILD_IGNORE_TABLE = ('db_do.t_new%');
START SLAVE;
验证:
sql
-- 查看过滤规则
show slave status\G
-- Replicate_Wild_Ignore_Table: db_do.t_new%
在主库更新数据:
sql
-- 在主库(141)执行
REPLACE INTO db_do.t_old1 VALUES (3,'old_data_v3');
REPLACE INTO db_do.t_new1 VALUES (4,'new_data_v3');
在从库查询:
sql
-- 在从库(142)执行
SELECT * FROM db_do.t_old1 WHERE id=3;
-- +----+-------------+
-- | id | name |
-- +----+-------------+
-- | 3 | old_data_v3 | ✅ 已同步(不匹配 db_do.t_new%)
-- +----+-------------+
SELECT * FROM db_do.t_new1 WHERE id=4;
-- +----+-----------+
-- | id | name |
-- +----+-----------+
-- | 4 | new_data | ❌ 未更新(匹配 db_do.t_new%,被忽略)
-- +----+-----------+
结论: 匹配 db_do.t_new% 模式的表(如 t_new1)被忽略,其他表正常复制。
10.10 REPLICATE_REWRITE_DB --- 库名重写
含义: 将主库 A 库的操作重写到从库 B 库中。相当于 --replicate-rewrite-db。格式为 ((from_db, to_db))。
设置:
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = (), REPLICATE_REWRITE_DB = ((dbA, dbB));
START SLAVE;
注意: REWRITE_DB 只重写 DML(INSERT/UPDATE/DELETE)中的库名,DDL(CREATE TABLE 等)也会被重写。从库需要确保目标库(dbB)和对应的表结构已存在。
验证:
sql
-- 查看过滤规则
show slave status\G
-- Replicate_Rewrite_DB: (dbA, dbB)
在主库 dbA 插入数据:
sql
-- 在主库(141)执行
INSERT INTO dbA.t1 VALUES (100001,'dbA_rewrite_100001');
在从库查询:
sql
-- 在从库(142)执行
SELECT * FROM dbB.t1;
-- +--------+------------------------+
-- | id | name |
-- +--------+------------------------+
-- | 100001 | dbA_rewrite_100001 | ✅ 主库 dbA 的数据重写到从库 dbB
-- +--------+------------------------+
SELECT * FROM dbA.t1;
-- +----+----------+
-- | id | name |
-- +----+----------+
-- | 7 | dbA_t1 | (只有旧数据,新数据被重写到 dbB)
-- +----+----------+
结论: 主库 dbA 的 DML 操作被重写到从库的 dbB 中,从库 dbA 中不会收到新数据。
10.11 清除所有过滤规则
sql
-- 在从库(142)执行
STOP SLAVE;
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (),
REPLICATE_IGNORE_DB = (),
REPLICATE_DO_TABLE = (),
REPLICATE_IGNORE_TABLE = (),
REPLICATE_WILD_DO_TABLE = (),
REPLICATE_WILD_IGNORE_TABLE = (),
REPLICATE_REWRITE_DB = ();
START SLAVE;
注意: 将对应规则设为空列表
()即可清除该规则。清除后所有库/表恢复正常复制。
11. 过滤复制规则优先级
MySQL 过滤复制的检查顺序如下(从上到下,匹配即停止):
- REPLICATE_DO_DB / REPLICATE_IGNORE_DB
- REPLICATE_DO_TABLE / REPLICATE_IGNORE_TABLE
- REPLICATE_WILD_DO_TABLE / REPLICATE_WILD_IGNORE_TABLE
重要规则:
- DO 规则和 IGNORE 规则不要同时使用在同一级别(如同时设置 DO_DB 和 IGNORE_DB),否则行为可能不符合预期。
- REPLICATE_REWRITE_DB 在 DO/IGNORE 规则之前执行,先将库名重写,然后再按重写后的库名进行过滤判断。
- 设置新的过滤规则前,建议先清除旧的过滤规则(设为空列表),避免规则叠加。
12. 过滤复制规则汇总
| 规则 | 含义 | 示例 |
|---|---|---|
| REPLICATE_DO_DB | 只复制指定库 | REPLICATE_DO_DB = (db1, db2) |
| REPLICATE_IGNORE_DB | 忽略指定库 | REPLICATE_IGNORE_DB = (db1) |
| REPLICATE_DO_TABLE | 只复制指定表 | REPLICATE_DO_TABLE = (db1.t1) |
| REPLICATE_IGNORE_TABLE | 忽略指定表 | REPLICATE_IGNORE_TABLE = (db1.t1) |
| REPLICATE_WILD_DO_TABLE | 通配符复制指定表 | REPLICATE_WILD_DO_TABLE = ('db1.old%') |
| REPLICATE_WILD_IGNORE_TABLE | 通配符忽略指定表 | REPLICATE_WILD_IGNORE_TABLE = ('db1.new%') |
| REPLICATE_REWRITE_DB | 库名重写 | REPLICATE_REWRITE_DB = ((dbA, dbB)) |
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. 当前环境最终状态
14.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
14.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
14.3 从库复制状态
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
SQL_Delay: 60
Auto_Position: 1
Get_master_public_key: 1