MySQL 主从复制配置


1. 主服务器准备

1.1 开启二进制日志并设置 server-id

确保主服务器已启用二进制日志并配置唯一的 server-id。编辑主服务器的 MySQL 配置文件(通常位于 /etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf),添加以下内容:

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog-do-db = your_database_name   # 如需复制多个数据库可重复此行,省略则复制全部

重启 MySQL 服务使配置生效:

sudo service mysql restart

1.2 创建复制专用用户

登录主服务器 MySQL,创建用于复制的账号并授权:

CREATE USER 'replica_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;

1.3 锁定主服务器并记录二进制日志位置

为获得一致的数据快照,需要锁定主库并获取当前二进制日志文件名及位置:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记录输出中的 FilePosition 值,后续配置从库时使用。

注意:锁定期间主库将暂停写操作,建议在业务低峰期执行。


2. 备份主服务器数据并传输至从服务器

2.1 导出主库全部数据

在主服务器上执行 mysqldump 导出所有数据库(包含二进制日志位置信息):

mysqldump -u root -p --all-databases --master-data > alldb_backup.sql

--master-data 选项会自动在备份文件中记录当前的二进制日志文件和位置。

2.2 传输备份文件到从服务器

使用 scp 或其他方式将备份文件复制到从服务器:

scp alldb_backup.sql user@slave_ip:/path/to/directory/

3. 从服务器配置

3.1 修改从服务器配置文件

编辑从服务器的 MySQL 配置文件,设置唯一的 server-id 并指定中继日志路径:

[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log

server-id 必须与主服务器不同。

3.2 重启从服务器 MySQL

sudo service mysql restart

3.3 导入主库备份

在从服务器上执行导入操作:

mysql -u root -p < /path/to/alldb_backup.sql

4. 配置从服务器连接主服务器

4.1 查看主库当前二进制日志位置(如备份时未使用 --master-data

如果备份时未使用 --master-data 选项,可登录主库执行:

SHOW MASTER STATUS;

获取当前的 FilePosition 值。

4.2 配置复制参数

登录从服务器 MySQL,执行 CHANGE MASTER TO 命令:

CHANGE MASTER TO 
  MASTER_HOST='master_ip',
  MASTER_USER='replica_user',
  MASTER_PASSWORD='your_password',
  MASTER_LOG_FILE='mysql-bin.xxxxxx',   -- 主库的二进制日志文件名
  MASTER_LOG_POS=xxxx;                  -- 主库的日志位置

4.3 启动复制线程

START SLAVE;

4.4 检查复制状态

SHOW SLAVE STATUS\G

确认以下两个字段均为 Yes

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes

若出现错误,请查看 Last_IO_ErrorLast_SQL_Error 字段。


5. 解除主服务器锁定

从库配置完成并开始复制后,回到主服务器解除全局读锁:

UNLOCK TABLES;

6. 验证主从同步

在主库执行一些写入操作(如插入、更新数据),然后检查从库是否成功同步。


7. 修改同步位置

当需要将复制位置调整到特定时间点或指定 binlog 位置时,可按以下步骤操作。

7.1 查看指定时间段的 binlog 事件

mysqlbinlog --no-defaults --start-datetime="2024-09-06 11:30:00" data/mysql-bin.008596

输出中的 end_log_pos 即为该事件结束后的 binlog 位置。

7.2 修改复制位置

若从库尚未配置过复制关系,使用完整的 CHANGE MASTER TO 命令:

CHANGE MASTER TO 
  MASTER_HOST='master_ip',
  MASTER_USER='replica_user',
  MASTER_PASSWORD='your_password',
  MASTER_LOG_FILE='mysql-bin.xxxxxx',
  MASTER_LOG_POS=xxxx;

若已配置过复制,只需修改日志文件和位置:

CHANGE MASTER TO 
  MASTER_LOG_FILE='mysql-bin.xxxxxx',
  MASTER_LOG_POS=xxxx;

修改后需重启复制:

START SLAVE;

8. 常见问题处理

8.1 主从数据不一致

  • 数据量较大:重新备份主库并恢复到从库,然后重新配置复制。
  • 数据量较小:手动补录缺失数据,然后重启从库复制。

8.2 从库删除数据导致主库删除事件无法应用

当从库执行了删除操作,而主库后续又删除了相同数据时,从库可能因找不到对应行而中断复制。解决方法:

  1. 查看出错的 binlog 内容:

    mysqlbinlog --no-defaults --start-position=85593000 --stop-position=85593055 data/mysql-bin.008596
    
  2. 跳过当前出错的复制事件:

    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE;
    SHOW SLAVE STATUS\G
    

9. 从库提升为主库

当主库故障或需要切换时,可将从库提升为新的主库。

9.1 停止从库复制

STOP SLAVE;

检查复制状态,确保从库已完全同步:

SHOW SLAVE STATUS\G

重点确认 Seconds_Behind_Master0,且 Slave_IO_RunningSlave_SQL_Running 均为 Yes

9.2 记录当前 binlog 位置

在从库上执行:

SHOW MASTER STATUS;

记录 FilePosition,供后续其他从库配置使用。

9.3 修改从库配置

编辑从库(新主库)的配置文件 my.cnf,确保:

  • 没有指向原主库的配置(如 master_host)。
  • 启用二进制日志:
[mysqld]
server-id = 2
log-bin = mysql-bin

重启 MySQL 服务:

sudo service mysql restart

9.4 清除复制信息

RESET SLAVE ALL;

9.5 处理原主库的连接(在原主库上执行,如仍可用)

查看当前连接:

SHOW PROCESSLIST;

终止残留的复制连接:

KILL process_id;

可选:撤销复制用户权限,防止原主库尝试连接:

REVOKE REPLICATION SLAVE ON *.* FROM 'replica_user'@'slave_ip';
FLUSH PRIVILEGES;

posted @ 2026-09-08 18:31  BeginnerY  阅读(3)  评论(0)    收藏  举报