当前位置: 首页 > news >正文

MySQL 主从复制详解:部署与进阶配置

MySQL 主从复制详解:部署与进阶配置

一、MySQL 主从复制介绍

1.1 什么是主从复制

MySQL 主从复制是指将主库的 DDL 和 DML 操作通过二进制日志(binlog)传到从库服务器中,然后在从库上对这些日志重新执行(重做),从而使得从库和主库的数据保持一致。

MySQL 支持灵活的复制架构:

  • 一台主库可同时向多台从库复制
  • 从库也可作为其他从服务器的主库,实现链状复制

2.2 思路详解:

在主服务器(master)上:

启用二进制日志
选择一个唯一的server-id
创建具有复制权限的用户

在从服务器(slave)上

启用中继日志
(二进制日志可开启,也可不开启)
选择一个唯一的server-id
连接至主服务器,并开始复制

二、MySQL 主从复制实现步骤

2.1 环境说明

主机名IP 地址操作系统MySQL 版本
master192.168.2.200rhel7.9源码安装 mysql8.0.40
rep1192.168.2.129rhel7.9源码安装 mysql8.0.40

源码部署 MySQL8.0.40(主从库均需执行)

2.2初始化配置

注意:如果是重新配置 MySQL 实例,或者需要重新初始化时,需要先清理原有数据

# 停止服务
[root@master ~]# /etc/init.d/mysqld stop# 清理原有数据(仅重新初始化时使用)
[root@master ~]# rm -rf /data/mysql/*# 查看配置文件确认数据目录设置
[root@master ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock# 配置启动脚本
[root@master ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld# 设置环境变量
[root@master ~]# echo "export PATH=\$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@master ~]# source /etc/profile# 创建运行用户和数据目录[root@master ~]# useradd -M -s /sbin/nologin mysql[root@master ~]# mkdir -p /data/mysql && chown -R mysql:mysql /data/# 初始化数据库
[root@master ~]# mysqld --initialize --user=mysql  # 记录临时密码# 启动服务并修改密码[root@master ~]# /etc/init.d/mysqld start[root@master ~]# mysqladmin -uroot -p password '123'  # 替换为实际密码# 登录验证[root@master ~]# mysql -uroot -p123

2.2 配置主从同步

(1)主库配置(192.168.2.200)
# 修改配置文件
[root@master ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql   
socket=/data/mysql/mysql.sock  
server_id=200  # 唯一标识
log-bin=binlog  # 开启二进制日志# 重启数据库
[root@master ~]# /etc/init.d/mysqld restart# 创建同步账号
[root@master ~]# mysql -uroot -p123
mysql> create user 'rep'@'%' identified by 'rep123';
mysql> grant replication slave on *.* to 'rep'@'%';
mysql> show grants for 'rep'@'%';  # 验证权限# 锁表设置只读(备份前操作)
mysql> flush tables with read lock;# 查看主库状态(记录文件名和Position)
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |     1022 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
#注意:如果想要重置主库,可以使用reset master#  备份主库数据
mysqldump -uroot -p -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz#  解锁表
mysql> unlock tables;#  将备份数据传到从库scp /server/backup/mysql_bak.2025-09-05.sql.gz 192.168.2.129:/server/backup
(2)从库配置(192.168.2.129)
#  修改配置文件
[root@rep1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=129  # 唯一标识,与主库不同# 重启数据库
[root@rep1 ~]# /etc/init.d/mysqld restart#  还原主库备份数据
# cd /server/backup/
# gzip -d mysql_bak.2025-08-07.sql.gz
# mysql -uroot -p < mysql_bak.2025-08-07.sql# 3. 配置同步参数
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.2.200',
SOURCE_USER='rep',
SOURCE_PASSWORD='rep123',
SOURCE_LOG_FILE='binlog.000002',  # 主库show master status显示的文件名
SOURCE_LOG_POS=1022,  # 主库show master status显示的Position值
SOURCE_SSL=1;# 4. 启动同步
mysql> start replica;# 5. 检查同步状态
mysql> show replica status\G
# 确保以下两个参数为Yes
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes
(3)验证主从同步
# 主库创建测试数据库
[root@master ~]# mysql -uroot -p -e 'create database test1;'# 从库查看是否同步
[root@rep1 ~]# mysql -uroot -p -e 'show databases;'
# 应能看到test1数据库

三、主从复制进阶配置

3.1 延时同步

延时同步可解决误操作导致的数据丢失问题,配置方法:

# 配置从库延时300秒同步
mysql> stop replica;
mysql> CHANGE REPLICATION SOURCE TO SOURCE_DELAY = 300;
mysql> start replica;# 查看延时配置
mysql> show replica status\G
# 查看SQL_Delay: 300 确认配置生效

误操作恢复流程

  1. 发现误操作后立即停止 SQL 线程:stop slave sql_thread;

  2. 找到误删前relay log的起点和终点show replica status\G

  3. 查找误操作在 relay log 中的位置:show relaylog events in "slave1-relay-bin.000002";

  4. 备份误操作前的 relay log:

    mysqlbinlog --start-position=323 --stop-position=1053 /data/mysql/slave1-relay-bin.000002 > /tmp/relay.sql
    
  5. 恢复数据:mysql -uroot -p -e 'source /tmp/relay.sql'

  6. 解除从库身份:stop replica;

    reset replica all;

3.2 GTID 复制

GTID(全局事务 ID)为每个提交的事务唯一 ID,简化同步位置管理。

配置 GTID 复制:
# 主从库均执行以下步骤
# 1. 检查并启用GTID一致性检查
mysql> set global enforce_gtid_consistency=warn;  # 检查兼容性
mysql> set global enforce_gtid_consistency=on;# 2. 逐步切换GTID模式
mysql> set global gtid_mode=OFF_PERMISSIVE;
mysql> set global gtid_mode=ON_PERMISSIVE;# 3. 等待匿名事务完成
mysql> show status like 'ongoing_anonymous_transaction_count';
# 确保Value为0# 4. 启用GTID模式
mysql> set global gtid_mode=ON;# 5. 从库切换到GTID同步
mysql> stop replica;
mysql> change master to master_auto_position=1;
mysql> start replica;
mysql> show replica status \GReplica_IO_Running: YesReplica_SQL_Running: Yes

3.3 半同步复制

半同步复制确保主库在收到至少一个从库的 ACK 确认后才完成事务提交,提高数据安全性。

主库配置:
# 安装插件
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';# 启用半同步
mysql> set global rpl_semi_sync_master_enabled=1;# 设置超时时间(毫秒)
mysql> set global rpl_semi_sync_master_timeout=3000;
从库配置:
# 安装插件
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';# 启用半同步
mysql> set global rpl_semi_sync_slave_enabled=1;# 重启IO线程
mysql> STOP REPLICA IO_THREAD;
mysql> START REPLICA IO_THREAD;

四、生产环境常用配置

  1. 忽略指定数据库的 binlog 记录

    [mysqld]
    binlog_ignore_db="information_schema"
    binlog_ignore_db="mysql"
    binlog_ignore_db="test"
    
  2. 从库开启 binlog(级联复制)

    [mysqld]
    log-slave-updates  # 从库同步的事务记录到自己的binlog
    log_bin = mysql-bin
    expire_logs_days = 7  # 日志保留7天
    
  3. 从库只读设置

    [mysqld]
    read-only
    innodb_read_only = 1
    

总结

MySQL 主从复制是构建高可用、高并发数据库系统的基础,通过本文介绍的方法可以实现基本的主从同步架构。在实际生产环境中,还需根据业务需求选择合适的复制模式(异步 / 半同步 / 全同步)、合理配置 GTID 和延时同步,以平衡数据一致性、性能和安全性。定期监控主从同步状态,确保数据同步正常,是保障系统稳定运行的关键


文章转载自:

http://qWyJMhJA.fwcnx.cn
http://GKpgs7Lm.fwcnx.cn
http://XHlkpRIf.fwcnx.cn
http://y7gVkQht.fwcnx.cn
http://ewjJ6pnz.fwcnx.cn
http://X55kXOlH.fwcnx.cn
http://gRA8w21J.fwcnx.cn
http://U3Z3e2IP.fwcnx.cn
http://clM1q3of.fwcnx.cn
http://S6ID5yuo.fwcnx.cn
http://wn8wlswb.fwcnx.cn
http://twvTB0uo.fwcnx.cn
http://2G4RM5Lk.fwcnx.cn
http://aylgCkI6.fwcnx.cn
http://rh0fhCxx.fwcnx.cn
http://fCfQsqOS.fwcnx.cn
http://U4UbMhJX.fwcnx.cn
http://pGi6VGMB.fwcnx.cn
http://k1AHYMm7.fwcnx.cn
http://BQM3jo7N.fwcnx.cn
http://9aQixyud.fwcnx.cn
http://pXjWt445.fwcnx.cn
http://WI4UHUWM.fwcnx.cn
http://DO9n9YXF.fwcnx.cn
http://os1uW4xV.fwcnx.cn
http://b8Az9SV7.fwcnx.cn
http://S2T21kDJ.fwcnx.cn
http://9ciaokhV.fwcnx.cn
http://iArnldT0.fwcnx.cn
http://QNxNwWLs.fwcnx.cn
http://www.dtcms.com/a/368346.html

相关文章:

  • 一笔成形,秒绘标准图!Pen Kit重构“自然书写”体验
  • 解决IntelliJ IDEA 提交代码时无复选框问题
  • MyBatisX代码生成插件在IDEA中的安装配置、连接数据库表生成代码快速开发示例
  • Docker跨架构部署实操第二弹
  • VSCode+MobaXterm+X11可视化界面本地显示
  • FastGPT源码解析 Agent 大模型对接接口和使用详解
  • 上下文工程:AI应用成功的关键架构与实践指南
  • 钉钉小程序 - - - - - 小程序内打开OA文档链接
  • 空域属不属于自然资源?(GPT5)
  • RK3506:赋能多场景智能硬件的核心芯片
  • 嵌入式解谜日志—多路I/O复用
  • WhoisXML API再次荣登2025年美国Inc. 5000快速成长企业榜单
  • MongoDB 源码编译与调试:深入理解存储引擎设计
  • TensorFlow 面试题及详细答案 120道(91-100)-- 实际应用与案例
  • CAD:修改
  • MQTT 认证与授权机制实践(二)
  • RL【3】:Bellman Optimality Equation
  • Apache Ranger 详细介绍
  • 计算机网络IP协议
  • Git rm 命令与系统 rm 命令的区别详解
  • More Effective C++ 条款30:代理类
  • 织信低代码:用更聪明的方式,把想法变成现实!
  • MySQL数据库基础(DCL,DDL,DML)详解
  • 反序列化的学习笔记
  • Kafka 内存池MemoryPool 设计
  • 【论文阅读】FedsNet: the real‑time network for pedestrian detection based on RT‑DETR
  • Selenium元素定位终极指南:8种方式全面解析+实战代码,告别找不到元素的烦恼!
  • 【MFC Picture Control 控件属性】
  • 迁移学习实战:基于 ResNet18 的食物分类
  • python用selenium怎么规避检测?