MySQL replication
Last updated
Last updated
MySQL 主从复制是一种常见的高可用和读写分离解决方案,下面将详细介绍搭建步骤:
两台或以上 MySQL 服务器(主库和从库)
相同或兼容的 MySQL 版本(建议主从版本一致)
确保网络连通性
足够的磁盘空间
主库
master.example.com
3306
写入操作的主要服务器
从库
slave1.example.com
3306
读取操作或备份的服务器
[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
# Linux系统
sudo systemctl restart mysqld
# 或
sudo service mysql restart
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
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 | | | |
+------------------+----------+--------------+------------------+-------------------+
UNLOCK TABLES;
[mysqld]
server-id = 2 # 唯一ID,不能与主库相同
relay_log = mysql-relay-bin # 启用中继日志
log_bin = mysql-bin # 可选:如果需要链式复制
read_only = 1 # 从库只读
sudo systemctl restart mysqld
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; -- 连接失败重试间隔(秒)
START SLAVE;
SHOW SLAVE STATUS\G
关键检查项:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
(或较小值)
CREATE DATABASE test_replication;
USE test_replication;
CREATE TABLE test_table (id INT, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'Test Data');
USE test_replication;
SELECT * FROM test_table;
查看错误日志:SHOW SLAVE STATUS\G
中的 Last_Error
常见错误及解决:
主键冲突:跳过错误事务(不推荐长期使用)
网络中断:检查网络后自动恢复
数据不一致:可能需要重新同步
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
如果复制差异过大,可能需要:
停止从库复制
备份主库数据并恢复到从库
重新配置复制(使用新的主库状态)
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 |
+------------------+----------+--------------+------------------+----------------------------------------------+
常态下主库查询 slave status 应该返回空
mysql> show slave status;
Empty set (0.00 sec)
返回值为 0
(或 OFF
)表示非只读模式
返回值为 1
(或 ON
)表示只读模式
mysql> select @@read_only;
+-------------+
| @@read_only |
+-------------+
| 0 |
+-------------+
# 主从库配置中添加
gtid_mode = ON
enforce_gtid_consistency = ON
-- 主库安装插件
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;
CHANGE MASTER TO
MASTER_HOST='master1.example.com',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION=1
FOR CHANNEL 'master1';
定期监控复制延迟
定期检查主从数据一致性
考虑使用工具如 pt-table-checksum 和 pt-table-sync 进行数据校验和修复
制定故障切换预案
通过以上步骤,您可以成功搭建 MySQL 主从复制环境。根据实际需求,您还可以进一步配置过滤规则、优化复制性能或实现更复杂的高可用架构。