MySQL 主从复制
一、主从简介
在现代企业中,数据至关重要。无论选择哪种数据库,单点数据库都存在潜在风险:
- 数据库服务器宕机可能导致数据丢失
- 业务量增长时,单台数据库可能无法保证服务质量
1、主从作用
- 实时灾备:用于故障切换,提高系统可用性
- 读写分离:从库提供查询服务,分担主库压力
- 数据备份:避免影响业务的情况下进行备份
2、主从形式
- 一主一从
- 主主复制
- 一主多从(扩展读取性能)
- 多主一从(MySQL 5.7+支持)
- 级联复制
二、主从复制原理
主从复制步骤:
- 主库将所有写操作记录到binlog日志,并通过log dump线程传送给从库的I/O线程
- 从库生成两个线程:I/O线程和SQL线程
- I/O线程请求主库的binlog,并将日志写入relay log(中继日志)文件
- SQL线程读取relay log中的日志,解析成具体操作,实现主从数据一致
三、主从复制配置
环境说明
数据库角色 | IP地址 | 系统与版本 | 数据状态 |
---|---|---|---|
主数据库 | 192.168.100.10 | CentOS7 + MySQL-5.7 | 有数据 |
从数据库 | 192.168.100.20 | CentOS7 + MySQL-5.7 | 无数据 |
步骤详解
1.确保从数据库与主数据库里的数据一样
全备主库时需要另开一个终端,给数据库加上读锁,避免在备份期间有其他人在写入导致数据不一致
此锁表的终端必须在备份完成以后才能退出
mysql
# 锁定所有表,仅允许读操作
mysql> flush tables with read lock;
bash
# 新开一个终端,执行全量备份
[root@yanyvhang ~]# mysqldump -uroot -p --all-databases > /opt/all-202409211144.sql
Enter password:
2.备份主库并将备份文件传送到从库
bash
# 主库终端执行,将备份文件传给从库(需输入从库 root 密码)
[root@yanyvhang ~]# scp /opt/all-202409211144.sql root@192.168.100.20:/opt/
root@192.168.100.20's password:
3.解除主库的锁表状态
直接退出交互式界面即可
mysql
mysql> exit
Bye
4.在从库上恢复主库的备份
查看从库有哪些库,确保与主库一致
bash
# 恢复备份
[root@yanyvhang2 ~]# mysql -uroot -p < /opt/all-202409211144.sql
Enter password:
# 查看数据库
[root@yanyvhang2 ~]# mysql -uroot -p -e 'show databases';
Enter password:
5.在主数据库里创建一个同步账号授权给从数据库使用
REPLICATION SLAVE 权限仅用于主从同步,无其他权限
mysql
# 创建同步账号 repl,允许从库(192.168.100.20)连接,密码为 wiltjer
mysql> CREATE USER 'repl'@'192.168.100.20' IDENTIFIED BY 'wiltjer';
Query OK, 0 rows affected (0.02 sec)
# 授予 repl 账号同步权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.20';
Query OK, 0 rows affected (0.00 sec)
# 刷新权限,使配置生效
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
# 查看 repl 账号的权限列表
mysql> SHOW GRANTS FOR 'repl'@'192.168.100.20';
+-----------------------------------------------------------+
| Grants for repl@192.168.100.20 |
+-----------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.20' |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
6.配置主数据库
编辑配置文件 '/etc/my.cnf'
mysql
[mysqld]
basedir=/usr/local/mysql
datadir=/opt/data
socket=/tmp/mysql.sock
port=3306
pid-file=/opt/data/mysql.pid
user=mysql
skip-name-resolve
server-id=1 # 主库设置为1,那么从库要设置的比1大
log-bin=mysql-bin # 启用 binlog 日志,日志文件前缀为 mysql-bin
symbolic-links=0 # 软连接
log-error=/var/log/mysqld.log # 错误日志
bash
# 重启服务
[root@yanyvhang ~]# systemctl restart mysqld.service
# 查看3306端口是否启动监听
[root@yanyvhang ~]# ss -anlt
mysql
# 查看主库状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
7.配置从数据库
bash
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
server-id = 2
relay-log = mysql-relay-bin
symbolic-links = 0
log-error = /var/log/mysqld.log
bash
# 重启服务
[root@yanyvhang ~]# systemctl restart mysqld.service
# 查看3306端口是否启动监听
[root@yanyvhang ~]# ss -anlt
8.配置并启动主从复制
SHOW MASTER STATUS 查看主库 binlog 文件名和主库 binlog 位置
mysql
mysql> change master to
-> master_host='192.168.100.10', # 主库 IP 地址
-> master_user='repl', # 主库创建的同步账号
-> master_password='wiltjer', # # 同步账号密码
-> master_log_file='mysql-bin.000001', # 主库 binlog 文件名
-> master_log_pos=154; # 主库 binlog 位置
mysql
# 启动从库同步线程(I/O 线程与 SQL 线程)
mysql> start slave;
# 查看从库同步状态,\G 表示纵向显示结果
mysql> SHOW SLAVE STATUS \G
mysql
Slave_IO_State: Waiting for master to send event # I/O 线程状态:等待主库发送日志
Master_Host: 192.168.100.10 # 主库 IP
Master_User: repl # 同步账号
Master_Port: 3306 # 主库端口
Connect_Retry: 60 # 连接失败重试间隔(s)
Master_Log_File: mysql-bin.000001 # 主库 binlog 文件名
Read_Master_Log_Pos: 154 # 主库 binlog 位置
Relay_Log_File: mysql-relay-bin.000002 # 中继日志文件名
Relay_Log_Pos: 320 # 中继日志位置
Relay_Master_Log_File: mysql-bin.000001 # 关联的主库 binlog 文件名
Slave_IO_Running: Yes # I/O 线程运行正常
Slave_SQL_Running: Yes # SQL 线程运行正常
Replicate_Do_DB: # 需同步的数据库(默认所有库)
Replicate_Ignore_DB: # # 忽略同步的数据库(默认无)
9.测试验证
在主库插入数据
在从库验证数据同步

四、注意事项
-
主从server-id必须唯一,且从库server-id大于主库
-
确保主从网络连通性
-
初始化前保持主从数据一致
-
同步账号需具备REPLICATION SLAVE权限
-
定期监控主从同步状态
五、常见问题排查
- 同步失败时检查网络、权限配置
- 数据不一致时可重新初始化同步
- 注意主从版本兼容性
- 大型事务可能导致同步延迟