如何搭建 MySQL 主从复制数据库
在现代数据库架构中,主从复制是一种常见的高可用性和备份方案。通过主从复制,主数据库(Master)负责处理写操作,而从数据库(Slave)只负责同步主库的数据并用作备份存储。本文将详细介绍如何搭建一个 MySQL 主从复制系统,并解答常见问题。
1. 确定数据库类型
本文以 MySQL 为例进行说明。如果你使用的是其他数据库(如 PostgreSQL 或 MongoDB),请告诉我,我可以提供相应的配置方法!
2. 准备环境
确保以下条件满足:
- 主数据库和从数据库运行在同一网络中,或者可以通过公网互通。
- 主数据库和从数据库的版本尽量一致,避免兼容性问题。
- 数据库服务器已安装并正常运行。
假设:
- 主数据库的 IP 地址为
192.168.1.100
- 从数据库的 IP 地址为
192.168.1.101
3. 配置主数据库(Master)
3.1 编辑 MySQL 配置文件
在主数据库上,编辑 MySQL 的配置文件(通常是 /etc/mysql/my.cnf
或 /etc/my.cnf
),添加以下内容:
[mysqld]
server-id=1 # 唯一标识主数据库
log-bin=mysql-bin # 开启二进制日志
binlog-do-db=your_database # 指定需要复制的数据库(可选)
server-id
必须是唯一的,通常主数据库设置为1
。log-bin
是开启主从复制的核心配置。binlog-do-db
用于指定需要同步的数据库,如果需要同步所有数据库,可以省略此配置。
保存文件后,重启 MySQL 服务:
sudo systemctl restart mysql
3.2 创建复制用户
登录主数据库,创建一个专门用于主从复制的用户:
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
replication_user
是用户名,your_password
是密码。%
表示允许从任何主机连接。如果安全性要求较高,可以限制为从数据库的 IP 地址。
3.3 获取主数据库状态
执行以下命令,记录下主数据库的状态信息:
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | your_database| |
+------------------+----------+--------------+------------------+
记下 File
和 Position
的值,稍后配置从数据库时需要用到。
4. 配置从数据库(Slave)
4.1 编辑 MySQL 配置文件
在从数据库上,编辑 MySQL 的配置文件,添加以下内容:
[mysqld]
server-id=2 # 唯一标识从数据库
relay-log=mysql-relay-bin # 开启中继日志
read-only=1 # 设置为只读模式(可选)
binlog-do-db=your_database # 指定需要复制的数据库(可选)
server-id
必须与主数据库不同,通常设置为2
。relay-log
是从数据库接收主数据库日志的中继文件。read-only
确保从数据库不会被意外修改。
保存文件后,重启 MySQL 服务:
sudo systemctl restart mysql
4.2 配置主从关系
登录从数据库,执行以下命令,配置主从复制:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100', -- 主库的 IP 地址
MASTER_USER='replication_user', -- 主库的复制用户名
MASTER_PASSWORD='your_password', -- 主库的复制用户密码
MASTER_LOG_FILE='mysql-bin.000001', -- 主库的 File 值
MASTER_LOG_POS=107; -- 主库的 Position 值
4.3 启动从数据库复制
启动从数据库的复制进程:
START SLAVE;
检查从数据库的状态:
SHOW SLAVE STATUS\G
重点关注以下字段:
Slave_IO_Running
: 应为Yes
,表示从库成功连接到主库。Slave_SQL_Running
: 应为Yes
,表示从库正在应用主库的日志。- 如果出现问题,查看
Last_Error
字段获取错误信息。
5. 验证主从复制
在主数据库上插入一些数据,然后检查从数据库是否同步了这些数据。例如:
主数据库:
USE your_database;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table (id, name) VALUES (1, 'Alice');
从数据库:
USE your_database;
SELECT * FROM test_table;
如果从数据库中也能看到相同的数据,则说明主从复制配置成功。
6. 主库不能停机怎么办?
如果主库不能停机且数据源源不断地产生,可以使用在线备份工具(如 mysqldump
的 --single-transaction
选项)来完成主从同步。以下是具体步骤:
6.1 使用 mysqldump
进行在线备份
在主数据库上执行以下命令:
mysqldump -u root -p --single-transaction --master-data=2 --databases your_database > backup.sql
--single-transaction
:确保备份过程中不会阻塞事务。--master-data=2
:在备份文件中记录当前的二进制日志文件和位置信息。
6.2 将备份文件传输到从数据库
使用 scp
命令将备份文件传输到从数据库:
scp backup.sql user@192.168.1.101:/path/to/destination/
6.3 在从数据库上恢复数据
在从数据库上导入备份文件:
mysql -u root -p your_database < /path/to/destination/backup.sql
6.4 配置主从关系
根据备份文件中的日志信息,在从数据库上执行以下命令:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='replication_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=12345;
启动从数据库的复制进程:
START SLAVE;
7. 关于 binlog-do-db
的说明
- 不指定
binlog-do-db
:主库记录所有数据库的更改,从库同步所有数据库的数据。适合需要完整备份的场景。 - 指定
binlog-do-db
:主库只记录指定数据库的更改,从库也只同步这些数据库的数据。适合需要限制同步范围的场景,但需要注意其局限性。
推荐做法:尽量避免在主库上使用 binlog-do-db
,而是通过从库的 replicate-do-db
来实现过滤。
8. 如何设置 MASTER_PORT
?
如果主库运行在非默认端口(如 3307),需要在从库的 CHANGE MASTER TO
命令中显式指定 MASTER_PORT
。例如:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='replication_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=12345,
MASTER_PORT=3307;
9. 注意事项
- 网络稳定性:主从复制依赖于网络通信,确保主从数据库之间的网络稳定。
- 安全性:建议使用 SSL 加密主从通信,尤其是跨公网的场景。
- 监控和维护:定期检查主从复制状态,及时处理可能出现的延迟或错误。
- 备份策略:虽然从数据库可以用作备份,但仍需定期对从数据库进行物理备份,以防数据丢失。
通过以上步骤,你可以成功搭建一个主从复制的 MySQL 数据库系统。希望这篇文章对你有所帮助!如果有任何疑问,请随时留言讨论。
Happy Coding! 🚀