mysql安装完成后如何配置复制账号_mysql主从权限设置

来源:这里教程网 时间:2026-02-28 20:46:36 作者:

主库上创建复制账号必须用 REPLICATION SLAVE 权限

MySQL 主从复制依赖 binlog,从库通过 I/O 线程连接主库并拉取日志,这个连接必须由一个专用账号完成。该账号不能只给

SELECT
ALL PRIVILEGES
,否则从库启动时会报错:
ERROR 2003 (HY000): Can't connect to MySQL server
或更隐蔽的
Slave_IO_Running: No
Seconds_Behind_Master: NULL

正确做法是显式授予

REPLICATION SLAVE
权限(MySQL 5.7+)或
REPLICATION CLIENT, REPLICATION SLAVE
(旧版本兼容):

CREATE USER 'repl'@'%' IDENTIFIED BY 'your_strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
账号主机名建议用具体从库 IP(如
'repl'@'192.168.1.10'
),避免开放
'repl'@'%'
增加攻击面
密码必须满足当前 MySQL 的密码策略(如
validate_password.length
),否则
CREATE USER
会失败
执行后务必运行
FLUSH PRIVILEGES
,否则权限不生效

配置前先确认主库已开启 binlog 并设好 server-id

复制账号只是“钥匙”,主库本身得是“可复制状态”。如果

my.cnf
中没启用 binlog 或
server-id
为 0/未设置,从库即使连上也拿不到任何日志。

检查并修改主库配置文件(通常是

/etc/my.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
):

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7
server-id
必须是唯一正整数,主从不能相同;若为 0,
SHOW MASTER STATUS
将返回空
log-bin
名称可自定义,但后续
CHANGE MASTER TO
中的
MASTER_LOG_FILE
必须严格匹配
binlog-format = ROW
是推荐值,避免语句级复制在函数、时间函数等场景下的不一致
改完配置需重启 MySQL(
systemctl restart mysql
),不是 reload

从库 CHANGE MASTER TO 的关键参数不能抄错

从库执行

CHANGE MASTER TO
是把复制关系“绑定”到主库账号和日志位置。参数写错一个字符(比如端口漏写、密码多空格),都会导致
START SLAVE
后立刻失败。

典型命令(假设主库 IP 是 192.168.1.5,复制账号为 repl,密码为 abc123):

CHANGE MASTER TO
  MASTER_HOST='192.168.1.5',
  MASTER_USER='repl',
  MASTER_PASSWORD='abc123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;
MASTER_LOG_FILE
MASTER_LOG_POS
必须来自主库执行
SHOW MASTER STATUS
的输出,不能凭空猜测或沿用旧值
MASTER_PASSWORD
在 MySQL 8.0.23+ 默认被弃用,应改用
MASTER_AUTO_POSITION = 1
+ GTID 模式(需主从都开启
gtid_mode=ON
如果主库启用了 SSL,还需加上
MASTER_SSL=1
及对应证书参数,否则连接被拒绝

验证复制状态时重点看两个 Running 和 Seconds_Behind_Master

执行

START SLAVE
后,不能只看有没有报错,必须查状态:

SHOW SLAVE STATUS\G

重点关注三行:

Slave_IO_Running: Yes
—— 表示从库能连上主库并读取 binlog;如果是
No
,先查
Last_IO_Error
Slave_SQL_Running: Yes
—— 表示从库能正常解析并执行 relay log;如果是
No
,看
Last_SQL_Error
,常见于主从表结构不一致或重复键冲突
Seconds_Behind_Master: 0
(或稳定小数值)—— 表示复制延迟低;若为
NULL
,说明 SQL 线程没跑起来;若持续增大,可能是从库负载高或大事务阻塞

真正容易被忽略的是:即使两个

Running
都是
Yes
,如果
Seconds_Behind_Master
长期 > 0,复制其实已经“假活”——它在同步,但永远追不上。

相关推荐