确认主库是否开启 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,不需要手动指定,除非磁盘空间紧张需挪位置。
