一、Master和Slave环境确认
MySQL 主从架构权限机制说明
在 MySQL 主从复制架构中,主节点(Master)与从节点(Slave)仅存在数据层面的单向同步关系,二者是相互独立的数据库实例,拥有独立的权限管控体系、用户配置与访问控制规则。主从复制仅同步业务库数据,不会同步 MySQL 系统权限库(mysql 库),因此主节点的授权配置无法作用于从节点。
客户端(CT 机)作为外部访问主体,其访问权限遵循目标实例独立管控原则:
若客户端需查询主节点(Master) 数据,必须由主节点对客户端进行授权;
若客户端需查询从节点(Slave) 数据,必须由从节点对客户端进行授权;
主从之间的复制权限,仅用于保障数据同步链路通畅,与客户端的访问授权无任何关联。
二、CT 机 、 Master 、 Slave的关系
Master可以当作总公司
Slave 当作分公司
Ct机 当作 自己
总公司 Master 授权你 能给总公司写文件 -> 你(CT)能在 Master 写入 Demo 数据;
总公司把文件同步到分公司 Slave -> Slave 有了和 Master 一样的 Demo 数据;
你要去分公司 Slave 查这份同步过来的文件 -> 分公司有自己的门卫(Slave 权限表),总公司的授权没用,必须分公司门卫单独认你(Slave 给 CT 授权)
注意⚠️:所以无论Master还是slave,我们(CT机)在查询(类似远程连接)的那一刻都需要进行授权
拓扑图

三、前置准备 Master 和 Slave配置固定 IP
在 Master 控制台里执行:
1. 查看网卡名
ip link你会看到类似 ens6s18 的网卡名(记下来)
2. 编辑网络配置
sudo nano /etc/netplan/00-installer-config.yaml输入密码 YXwa@2023,编辑模式,把内容改成:
network:
ethernets:
ens6ps18: # 这里换成你查到的网卡名
addresses: [192.168.101.103/24]
gateway4: 192.168.101.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
version: 2如图

3. 应用配置
sudo netplan apply4. 验证 IP
ip a看到
inet 192.168.101.103/24就成功了。

在 Slave 控制台里执行:
1. 查看网卡名
ip link2. 编辑网络配置
sudo vim /etc/netplan/00-installer-config.yaml输入密码 YXwa@2023,把内容改成:
network:
ethernets:
ens6s18: # 这里换成你查到的网卡名
addresses: [192.168.101.11/24]
gateway4: 192.168.101.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
version: 2如图

3. 应用配置
sudo netplan apply4. 验证 IP
ip a看到 inet 192.168.101.104/24 就成功了。

在Master、Slave、CT机上执行
执行代码
# 1. 检查MySQL服务状态
sudo systemctl status mysql
# 2. 关闭防火墙(三机互通必需)
sudo ufw disable
# 3. 测试网络连通性(互相ping)
# Master上执行:
ping 192.168.101.104 -c 3
ping 192.168.101.107 -c 3
# Slave上执行:
ping 192.168.101.103 -c 3
ping 192.168.101.107 -c 3
# 在CT机上执行
ping 192.168.101.103 -c 3
ping 192.168.101.104 -c 3
# 确保0%丢包,网络互通结果图


四、Master 配置
步骤 1:修改 MySQL 配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf替换 [mysqld] 段核心配置(保留原有基础配置):
[mysqld]
# 基础配置(保留)
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
datadir = /var/lib/mysql
# 主库核心配置
bind-address = 0.0.0.0 # 允许所有IP访问(必配,让Slave能连接)
server-id = 1 # 唯一ID,Slave必须不同
log_bin = /var/log/mysql/mysql-bin.log # 开启binlog(记录数据变更)
binlog_format = ROW # 行级复制,数据一致性最高
binlog_do_db = Demo # 仅同步Demo库
binlog_ignore_db = mysql,information_schema,performance_schema # 忽略系统库
max_binlog_size = 100M # binlog文件大小限制结果图


步骤 2:重启 MySQL 生效配置
sudo systemctl restart mysql步骤 3:创建同步账号并授权(允许 Slave IP 访问)
# 登录MySQL(Ubuntu免密登录)
sudo mysql -uroot -pYXwa@2023执行以下 SQL(精准授权给 Slave 的 104 IP):
-- 1. 创建Demo库(提前准备同步库)
CREATE DATABASE IF NOT EXISTS Demo CHARACTER SET utf8mb4;
-- 2. 创建同步账号(仅允许104访问,更安全)
CREATE USER 'yxwa'@'192.168.101.104' IDENTIFIED WITH mysql_native_password BY '123456';
-- 3. 授予主从同步必需权限(最小权限原则)
GRANT REPLICATION SLAVE ON *.* TO 'yxwa'@'192.168.101.104';
-- 4. 刷新权限使配置生效
FLUSH PRIVILEGES;
-- 5. 查看主库状态(记录File和Position,Slave配置用)
SHOW MASTER STATUS;关键输出示例

步骤4: 创建同步帐号授权CT机 (允许CT IP 访问)
CREATE USER 'root'@'192.168.101.107' IDENTIFIED BY '654321';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.101.107' WITH GRANT OPTION;
FLUSH PRIVILEGES;步骤5: CT上连接测试master
# 装 MySQL 客户端
apt update && apt install -y mysql-client
# 测试
mysql -h 192.168.101.103 -u root -p654321 --skip-ssl -e "SELECT VERSION();"结果图

五、Slave 配置
步骤 1:修改 MySQL 配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf替换 [mysqld] 段核心配置:
[mysqld]
# 基础配置(保留)
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
datadir = /var/lib/mysql
# 从库核心配置
bind-address = 0.0.0.0
server-id = 2 # 必须与Master的1不同
relay-log = /var/log/mysql/relay-bin.log # 开启中继日志(存储Master的binlog)
read_only = 1 # 从库只读(防止误写)
super_read_only = 0 # 先关闭,创建库后再开启(验证用)
replicate_do_db = Demo # 仅同步Demo库
replicate_ignore_db = mysql,information_schema,performance_schema结果图


步骤 2:重启 MySQL 生效配置
sudo systemctl restart mysql步骤 3:绑定 Master 并启动同步
# 登录MySQL
sudo mysql -uroot执行以下 SQL(替换 Master 的 File 和 Position):
-- 1. 提前创建Demo库(与Master一致)
CREATE DATABASE IF NOT EXISTS Demo CHARACTER SET utf8mb4;
-- 2. 停止旧同步(首次配置也建议执行)
STOP SLAVE;
-- 3. 重置同步状态(清空旧配置)
RESET SLAVE ALL;
-- 4. 绑定Master(核心命令,IP填103)
CHANGE MASTER TO
MASTER_HOST='192.168.101.103', # Master的IP(103)
MASTER_USER='yxwa',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003', # 替换为Master的File值
MASTER_LOG_POS=2657, # 替换为Master的Position值
GET_MASTER_PUBLIC_KEY=1; # MySQL8.0必需(解决认证)
-- 5. 启动主从同步
START SLAVE;
-- 6. 查看同步状态(验证是否成功)
SHOW SLAVE STATUS\G;解析
这一套 SQL 执行完成后,Slave 就会:
连接到指定的 Master 节点
从指定的日志位置开始,实时同步 Master 上
Demo库的所有增删改操作最终实现 Master 写,Slave 自动同步 的主从架构
结果图

步骤 4:验证同步状态
执行 SHOW SLAVE STATUS\G; 后,重点检查以下字段:
步骤5 :在Slave上给CT 授权并验证
-- 在 Slave 上执行
CREATE USER 'root'@'192.168.101.107' IDENTIFIED BY '654321';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.101.107' WITH GRANT OPTION;
FLUSH PRIVILEGES;步骤6: CT上连接测试Slave
mysql -h 192.168.101.104 -u root -p654321 --skip-ssl -e "SELECT VERSION();"结果图

六、验证主从同步效果
步骤 1:Master 写入测试数据
USE Demo;
CREATE TABLE IF NOT EXISTS sync_test (
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(50),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO sync_test (content) VALUES ('cesshi1'),('ceshi2');步骤 2:Slave 查询验证
USE Demo;
SELECT * FROM sync_test;结果图:

步骤3:CT 查询验证
# 验证CT机 在 Master上 是否能得到数据
mysql -h 192.168.101.103 -u root -p654321 --skip-ssl -e "USE Demo; SELECT * FROM sync_test;"
# 验证 CT机 在 Slave 上 是否能得到数据
mysql -h 192.168.101.104 -u root -p654321 --skip-ssl -e "USE Demo; SELECT * FROM sync_test;"结果图

七、常见问题排查
1. Slave_IO_Running: No
原因:网络不通 / 账号密码错误 / IP 授权错误
# Slave上测试连接Master
mysql -uyxwa -p123456 -h192.168.101.103能登录则账号密码正常,否则检查 Master 的账号授权(确保是192.168.101.104)
2. Slave_SQL_Running: No
原因:数据不一致(如 Demo 库表已存在)
解决:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;总结
核心配置:Master(103)开启 binlog 并授权 104 访问,Slave(104)绑定 103 的 IP 和同步参数,确保
server-id不同。成功标志:Slave 的
Slave_IO_Running和Slave_SQL_Running均为Yes,且能查询到 Master 写入的数据。关键注意:双机场景必须确保网络互通,Master 的
bind-address为0.0.0.0,同步账号精准授权给 Slave 的 104 IP。权限问题:主(Madter)和从(Slave)的关系只是数据同步,类似多一个备份,但主和从数据库是单独的,想有独自的权限表单,因此主节点的授权配置无法作用于从节点