配置MySQL主从复制需先设置主服务器唯一ID并启用二进制日志,创建复制用户并授权,锁定主库获取日志坐标后导出数据;再配置从服务器不同server-id并启用中继日志,导入数据后执行CHANGE MASTER TO指定主库信息,最后启动SLAVE线程并检查复制状态。

创建MySQL数据库时配置复制功能,核心在于配置主服务器和从服务器,让从服务器能够实时或近实时地同步主服务器上的数据变更。这涉及到修改配置文件、创建复制用户、锁定主服务器、导入数据、以及启动从服务器等一系列步骤。
解决方案
-
配置主服务器 (Master Server)
-
修改
my.cnf
文件: 找到MySQL的配置文件(通常是/etc/my.cnf
或/etc/mysql/my.cnf
),并进行如下修改:
[mysqld] server-id=1 # 主服务器唯一ID,必须是唯一的 log_bin=mysql-bin # 启用二进制日志 binlog_do_db=your_database_name # (可选) 只记录特定数据库的变更 #binlog_ignore_db=database_to_ignore # (可选) 忽略特定数据库的变更
server-id
是一个非常重要的参数,它必须是唯一的,用于区分不同的MySQL服务器。log_bin
启用二进制日志,这是复制的基础。binlog_do_db
和binlog_ignore_db
可以用来控制哪些数据库的变更需要被记录。- 重启 MySQL 服务: 修改完配置文件后,需要重启MySQL服务使配置生效。
sudo systemctl restart mysql
-
修改
-
创建复制用户 (Replication User)
在主服务器上创建一个专门用于复制的用户,并授予相应的权限。
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; FLUSH PRIVILEGES;
replication_user
是用户名,your_password
是密码。REPLICATION SLAVE
权限允许该用户从主服务器读取二进制日志。'%'
表示允许来自任何主机的连接,实际环境中应该限制为从服务器的IP地址。 -
锁定主服务器并获取二进制日志坐标
在开始同步数据之前,需要锁定主服务器,并获取当前的二进制日志文件名和位置。
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
FLUSH TABLES WITH READ LOCK
会阻止对主服务器的写入操作,确保数据的一致性。SHOW MASTER STATUS
会显示当前的二进制日志文件名 (File) 和位置 (Position)。 记录下这两个值,稍后在配置从服务器时会用到。 -
备份主服务器数据
使用
mysqldump
工具备份主服务器的数据。这是将数据从主服务器传输到从服务器的最常用方法。mysqldump -u root -p --all-databases --single-transaction --master-data=2 > backup.sql
--all-databases
备份所有数据库,--single-transaction
确保备份的一致性,--master-data=2
会在备份文件中包含CHANGE MASTER TO语句,简化从服务器的配置。解锁主服务器:
UNLOCK TABLES;
-
配置从服务器 (Slave Server)
-
修改
my.cnf
文件: 找到从服务器的MySQL配置文件,并进行如下修改:
[mysqld] server-id=2 # 从服务器唯一ID,必须与主服务器不同 relay-log=relay-mysql-bin # 启用中继日志 #replicate_do_db=your_database_name # (可选) 只复制特定数据库的变更 #replicate_ignore_db=database_to_ignore # (可选) 忽略特定数据库的变更
server-id
必须与主服务器不同。relay-log
启用中继日志,从服务器会先将主服务器的二进制日志写入中继日志,然后再应用到自己的数据库。replicate_do_db
和replicate_ignore_db
可以用来控制哪些数据库的变更需要被复制。- 重启 MySQL 服务: 修改完配置文件后,需要重启MySQL服务使配置生效。
sudo systemctl restart mysql
-
修改
-
导入数据到从服务器
将之前备份的数据导入到从服务器。
mysql -u root -p < backup.sql
-
配置从服务器连接到主服务器
使用
CHANGE MASTER TO
语句配置从服务器连接到主服务器,并指定二进制日志文件名和位置。CHANGE MASTER TO MASTER_HOST='master_server_ip', MASTER_USER='replication_user', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='之前记录的二进制日志文件名', MASTER_LOG_POS=之前记录的二进制日志位置;
master_server_ip
是主服务器的IP地址。MASTER_LOG_FILE
和MASTER_LOG_POS
是之前在主服务器上记录的二进制日志文件名和位置。 -
启动复制
启动从服务器的复制线程。
START SLAVE;
-
检查复制状态
使用
SHOW SLAVE STATUS
命令检查复制状态。SHOW SLAVE STATUS\G
关注
Slave_IO_Running
和Slave_SQL_Running
两个字段,如果都显示Yes
,则表示复制已经成功启动。 还要检查Last_Errno
和Last_Error
字段,如果这两个字段不为 0 和空,则表示复制过程中出现了错误。
如何处理主从复制延迟?
主从复制延迟是指从服务器落后于主服务器的时间。 延迟可能由多种因素引起,例如网络延迟、主服务器的负载、从服务器的硬件性能等。
- 硬件升级: 提升从服务器的硬件配置,例如CPU、内存、磁盘IO等,可以加快数据同步的速度。
- 优化SQL语句: 慢查询会导致复制延迟,优化SQL语句可以提高主服务器的性能,从而减少延迟。
-
使用多线程复制: MySQL 5.6 之后支持多线程复制,可以并行执行多个事务,提高复制效率。 可以通过设置
slave_parallel_workers
参数来启用多线程复制。 -
监控复制状态: 定期检查
SHOW SLAVE STATUS
的输出,及时发现并解决问题。 - 半同步复制: 使用半同步复制,主服务器在提交事务之前,必须等待至少一个从服务器确认收到该事务,从而保证数据的一致性。
主从复制有哪些常见的拓扑结构?
主从复制的拓扑结构有很多种,常见的有:
- 单主单从: 这是最简单的拓扑结构,一个主服务器对应一个从服务器。 适用于读多写少的应用场景。
- 单主多从: 一个主服务器对应多个从服务器。 可以提高读性能,分担主服务器的压力。
- 级联复制: 从服务器同时也是其他从服务器的主服务器。 可以减少主服务器的负载,但会增加延迟。
- 双主复制: 两个服务器互为主从服务器。 需要小心处理并发写入冲突,通常需要额外的冲突解决机制。
- 环状复制: 多个服务器形成一个环,每个服务器都是其他服务器的从服务器。 容错性高,但配置复杂。
如何进行主从切换?
主从切换是指在主服务器发生故障时,将从服务器提升为新的主服务器。 主从切换可以分为手动切换和自动切换两种方式。
-
手动切换:
- 停止旧的主服务器。
- 在新的主服务器上执行
STOP SLAVE
和RESET MASTER
命令。 - 修改应用程序的配置,将数据库连接指向新的主服务器。
-
自动切换:
可以使用一些工具来实现自动切换,例如 MHA (Master High Availability)。 这些工具可以监控主服务器的状态,并在主服务器发生故障时自动将从服务器提升为新的主服务器。自动切换需要更复杂的配置,但也提供了更高的可用性。










