主库必须开启binlog并设置唯一server-id;创建专用复制账号repl并授权replication slave;锁表获取binlog位置后导出数据;从库配置不同server-id并执行change master to启动复制;检查slave_io_running和slave_sql_running均为yes。

确认主库是否开启 binlog 并设置唯一 server-id
MySQL 主从复制依赖于主库的二进制日志(binlog),如果没开,从库根本收不到任何变更。先登录主库执行:
SHOW VARIABLES LIKE 'log_bin';
返回 ON 才算开启;否则需在主库配置文件(通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)的 [mysqld] 段落里加:
log-bin = mysql-bin server-id = 1
注意:server-id 必须是正整数,且主从不能重复;主库设为 1,从库建议用 2、3 等递增数字,不能为 0(MySQL 5.7+ 默认是 0,不显式设置会导致复制失败)。
在主库创建用于复制的专用账号
不要复用 root 或应用账号——权限过大不安全,且 MySQL 8.0+ 默认要求复制账号必须有 REPLICATION SLAVE 权限,还必须启用 SSL 或显式禁用(视版本而定)。执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_secure_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
如果主库启用了 require_secure_transport=ON(推荐),则从库连接时需走加密通道;否则可临时加一句:
SET GLOBAL require_secure_transport = OFF;
但生产环境更建议配好 TLS,而不是关掉它。
获取主库当前 binlog 位置并导出数据
主从起始同步点必须一致,否则从库会漏数据或报错 Could not find first log file name in binary log index file。操作分两步:
- 锁表并查位置:
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
记下输出中的File(如mysql-bin.000003)和Position(如154) - 另开终端,用
mysqldump导出(不锁表也可用--single-transaction,但需确保引擎是 InnoDB):mysqldump -u root -p --all-databases --master-data=2 > full_backup.sql
--master-data=2会把CHANGE MASTER TO语句注释写进 dump 文件,方便后续恢复 - 导完立刻解锁:
UNLOCK TABLES;
从库配置与启动复制链路
从库配置文件同样要设 server-id(不能和主库一样),且建议开启 read_only=1 防误写。导入主库 dump 后,执行:
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='your_secure_password', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=154;
然后启动:
START SLAVE;
检查状态:
SHOW SLAVE STATUS\G
重点关注两个字段:Slave_IO_Running 和 Slave_SQL_Running 都要是 Yes;如果其中一个是 No,看 Seconds_Behind_Master 和 Last_IO_Error / Last_SQL_Error 定位问题。常见坑包括:网络不通、账号密码错、主库 binlog 被删、从库已有同名表导致 SQL 线程卡住。
从库的 relay-log 默认存在数据目录下,名字形如 hostname-relay-bin.xxxxxx,不需要手动指定,除非磁盘空间紧张需挪位置。










