MySQL 主从复制

MySQL 主从复制

一、主从简介

在现代企业中,数据至关重要。无论选择哪种数据库,单点数据库都存在潜在风险:

  • 数据库服务器宕机可能导致数据丢失
  • 业务量增长时,单台数据库可能无法保证服务质量
1、主从作用
  • 实时灾备:用于故障切换,提高系统可用性
  • 读写分离:从库提供查询服务,分担主库压力
  • 数据备份:避免影响业务的情况下进行备份
2、主从形式
  • 一主一从
  • 主主复制
  • 一主多从(扩展读取性能)
  • 多主一从(MySQL 5.7+支持)
  • 级联复制

二、主从复制原理

主从复制步骤:
  1. 主库将所有写操作记录到binlog日志,并通过log dump线程传送给从库的I/O线程
  2. 从库生成两个线程:I/O线程和SQL线程
  3. I/O线程请求主库的binlog,并将日志写入relay log(中继日志)文件
  4. 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权限

  • 定期监控主从同步状态

五、常见问题排查

  • 同步失败时检查网络、权限配置
  • 数据不一致时可重新初始化同步
  • 注意主从版本兼容性
  • 大型事务可能导致同步延迟
相关推荐
阿里云云原生42 分钟前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能
k4m7v2pz1 小时前
把 Bevy 0.14 游戏移植到 R36S 掌机:一场与“无窗口系统“的搏斗
linux·rust·bevy·r36s·rk3326·开源掌机
阿童木写作1 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
iori97king2 小时前
库存不足自动通知:第一次使用自动化
运维·自动化
@insist1232 小时前
信息系统管理工程师-信息系统运维资源、技术与智能运维核心考点解析
运维·软考·信管·软件水平考试·信息系统管理工程师
木子欢儿3 小时前
Intel 架构的 MacBook Pro 运行 Linux 发热量高解决
linux·运维·服务器
凌虚3 小时前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
五阿哥永琪3 小时前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善3 小时前
了解Mysql优化吗?如何优化索引?
数据库·mysql
KKKlucifer5 小时前
运营商全域安全运维支撑体系落地实践
运维·安全