MySQL replication
MySQL 主从复制是一种常见的高可用和读写分离解决方案,下面将详细介绍搭建步骤:
1 准备工作
1.1 环境要求
两台或以上 MySQL 服务器(主库和从库)
相同或兼容的 MySQL 版本(建议主从版本一致)
确保网络连通性
足够的磁盘空间
1.2 服务器规划
角色
主机名/IP
端口
说明
主库
master.example.com
3306
写入操作的主要服务器
从库
slave1.example.com
3306
读取操作或备份的服务器
2 主库配置
2.1 修改主库配置文件 (my.cnf/my.ini)
[mysqld]
server-id = 1 # 唯一ID,主库通常为1
log_bin = mysql-bin # 启用二进制日志
binlog_format = ROW # 推荐使用ROW格式
binlog_do_db = your_database # 可选:指定要复制的数据库
expire_logs_days = 10 # 二进制日志保留天数
sync_binlog = 1 # 每次事务提交都写入磁盘
2.2 重启 MySQL 服务
# Linux系统
sudo systemctl restart mysqld
# 或
sudo service mysql restart
2.3 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
2.4 获取主库状态
FLUSH TABLES WITH READ LOCK; -- 锁定表,防止数据变化
SHOW MASTER STATUS;
记录输出结果(File 和 Position 值),例如:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 107 | | | |
+------------------+----------+--------------+------------------+-------------------+
2.5 解锁表(可选,如果需要继续写入)
UNLOCK TABLES;
3 从库配置
3.1 修改从库配置文件 (my.cnf/my.ini)
[mysqld]
server-id = 2 # 唯一ID,不能与主库相同
relay_log = mysql-relay-bin # 启用中继日志
log_bin = mysql-bin # 可选:如果需要链式复制
read_only = 1 # 从库只读
3.2 重启 MySQL 服务
sudo systemctl restart mysqld
3.3 配置复制
CHANGE MASTER TO
MASTER_HOST='master.example.com',
MASTER_USER='repl',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000003', -- 主库状态中的File值
MASTER_LOG_POS=107, -- 主库状态中的Position值
MASTER_CONNECT_RETRY=10; -- 连接失败重试间隔(秒)
3.4 启动复制
START SLAVE;
3.5 检查复制状态
SHOW SLAVE STATUS\G
关键检查项:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
(或较小值)
4 验证复制
4.1 在主库创建测试数据
CREATE DATABASE test_replication;
USE test_replication;
CREATE TABLE test_table (id INT, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'Test Data');
4.2 在从库检查数据
USE test_replication;
SELECT * FROM test_table;
5 常见问题处理
5.1 复制错误处理
查看错误日志:
SHOW SLAVE STATUS\G
中的Last_Error
常见错误及解决:
主键冲突:跳过错误事务(不推荐长期使用)
网络中断:检查网络后自动恢复
数据不一致:可能需要重新同步
5.2 跳过错误事务(谨慎使用)
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
5.3 重新同步数据
如果复制差异过大,可能需要:
停止从库复制
备份主库数据并恢复到从库
重新配置复制(使用新的主库状态)
5.4 主库状态检查
5.4.1 show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------------+
| mysql-bin.000002 | 5202671 | | | 5f3b8a59-4a9a-11f0-9639-faf60001371b:1-18995 |
+------------------+----------+--------------+------------------+----------------------------------------------+
5.4.2 show slave status;
常态下主库查询 slave status 应该返回空
mysql> show slave status;
Empty set (0.00 sec)
5.4.3 select @@read_only;
返回值为
0
(或OFF
)表示非只读模式返回值为
1
(或ON
)表示只读模式
mysql> select @@read_only;
+-------------+
| @@read_only |
+-------------+
| 0 |
+-------------+
6 高级配置(可选)
6.1 GTID 复制(MySQL 5.6+)
# 主从库配置中添加
gtid_mode = ON
enforce_gtid_consistency = ON
6.2 半同步复制(提高数据安全性)
-- 主库安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
-- 从库安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
6.3 多源复制(一个从库复制多个主库)
CHANGE MASTER TO
MASTER_HOST='master1.example.com',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION=1
FOR CHANNEL 'master1';
7 维护建议
定期监控复制延迟
定期检查主从数据一致性
考虑使用工具如 pt-table-checksum 和 pt-table-sync 进行数据校验和修复
制定故障切换预案
通过以上步骤,您可以成功搭建 MySQL 主从复制环境。根据实际需求,您还可以进一步配置过滤规则、优化复制性能或实现更复杂的高可用架构。
Last updated