mysql主从复制完整教程
MySQL主从复制(Master-Slave Replication)是一种将数据从一个MySQL服务器(主服务器)复制到另一个MySQL服务器(从服务器)的机制。通过这种复制,可以实现数据库的负载均衡、数据备份和容错等功能。下面是MySQL主从复制的完整教程。
1. 前提条件
- 两台机器:一台作为主服务器,一台作为从服务器。
- 两台服务器都安装了MySQL,且版本一致。
2. 配置主服务器(Master)
-
编辑 MySQL 配置文件
打开主服务器的MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/my.cnf,视操作系统而定)。sudo vim /etc/my.cnf2.设置必要的配置项
在[mysqld]部分添加以下配置:[mysqld] server-id = 1 # 唯一的服务器ID log_bin = /var/log/mysql/mysql-bin.log # 启用二进制日志(用于复制) binlog-do-db = your_db_name # 可选:指定要复制的数据库(如果需要复制所有数据库,则不指定)server-id:每个MySQL服务器都必须有唯一的ID。log_bin:启用二进制日志,这是主从复制的基础。binlog-do-db:指定需要复制的数据库,如果你希望复制所有数据库,可以省略此项。
3.重启 MySQL 服务
配置修改完成后,重启 MySQL 服务以使配置生效:
sudo systemctl restart mysql
4.创建复制账户
在主服务器上创建一个用于复制的MySQL账户:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
'replica_user':复制账户的用户名。password:复制账户的密码。- 你可以根据需求限制账户的访问权限。
5.获取主服务器的二进制日志位置
为了让从服务器能够正确同步数据,主服务器需要知道当前的二进制日志文件和位置。执行以下命令来获取:
SHOW MASTER STATUS;
结果会显示类似如下:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 1234 | your_db_name | |
+------------------+----------+--------------+------------------+
File:当前二进制日志文件。Position:当前日志文件中的位置。- 记录下
File和Position的值,稍后需要在从服务器上配置。
3. 配置从服务器(Slave)
1.编辑 MySQL 配置文件
打开从服务器的MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/my.cnf)。
sudo vim /etc/my.cnf
2. 设置必要的配置项
在 [mysqld] 部分添加以下配置
[mysqld]
server-id = 2 # 唯一的服务器ID,不能与主服务器相同
relay-log = /var/log/mysql/mysql-relay.log # 启用中继日志(用于复制)
log_slave_updates = 1 # 启用从服务器日志记录
read-only = 1 # 可选:设置从服务器为只读(避免数据被修改)
server-id:从服务器的唯一ID,必须与主服务器不同。relay-log:启用中继日志,这是从服务器的复制机制。
3.重启 MySQL 服务
配置修改完成后,重启 MySQL 服务以使配置生效:
sudo systemctl restart mysql
4.配置从服务器连接到主服务器
在从服务器上执行以下命令来配置连接主服务器:
CHANGE MASTER TO
MASTER_HOST='master_ip', # 主服务器的IP地址
MASTER_USER='replica_user', # 复制账户名
MASTER_PASSWORD='password', # 复制账户的密码
MASTER_LOG_FILE='mysql-bin.000001', # 主服务器的二进制日志文件
MASTER_LOG_POS=1234; # 主服务器的二进制日志位置
MASTER_HOST:主服务器的IP地址或主机名。MASTER_USER:复制账户的用户名。MASTER_PASSWORD:复制账户的密码。MASTER_LOG_FILE:主服务器的二进制日志文件。MASTER_LOG_POS:主服务器的二进制日志位置。
5.启动复制进程
启动从服务器的复制进程:
START SLAVE;
6.检查复制状态
查看从服务器的复制状态,以确保复制成功:
SHOW SLAVE STATUS\G
你应该看到类似如下的输出:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running:表示I/O线程是否正在运行。Slave_SQL_Running:表示SQL线程是否正在运行。- 如果这两个值都为
Yes,则表示主从复制配置成功。
4. 验证主从复制
-
在主服务器上创建数据
在主服务器上创建一个测试数据库或表:CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50)); INSERT INTO test_table (id, name) VALUES (1, 'test_name');2.检查从服务器的数据同步
登录到从服务器,检查是否已经同步了主服务器上的数据:SHOW DATABASES; USE test_db; SELECT * FROM test_table;如果从服务器上也能看到
test_db数据库和test_table表,且数据一致,则表示复制正常工作。
5. 常见问题排查
-
Slave_IO_Running或Slave_SQL_Running为No:- 检查复制账户的权限是否正确。
- 确保主服务器的二进制日志文件和位置正确。
- 查看错误日志(
SHOW SLAVE STATUS)中的Last_Error字段,排查复制过程中出现的错误。
-
数据不一致:
如果复制过程中出现数据不一致,可以考虑使用pt-table-checksum和pt-table-sync工具进行修复。
6. 其他高级配置
-
多主复制(Master-Master Replication):
MySQL也支持多主复制,两个MySQL实例都作为主服务器和从服务器,这需要额外的配置。 -
GTID复制:
GTID(全局事务标识符)复制是MySQL的另一个复制方式,相比于基于二进制日志的复制方式,它可以简化主从切换和故障恢复过程。
更多推荐



所有评论(0)