MySQL中怎样实现主从同步

发布时间:2021-08-13 14:35:55 作者:Leah
来源:亿速云 阅读:194
# MySQL中怎样实现主从同步

## 一、主从同步概述

MySQL主从同步(Replication)是指将一个MySQL数据库服务器(主服务器/Master)的数据复制到一个或多个MySQL数据库服务器(从服务器/Slave)的过程。这种架构设计主要带来以下优势:

1. **读写分离**:主库负责写操作,从库承担读请求
2. **数据备份**:实时备份主库数据
3. **负载均衡**:分散数据库访问压力
4. **高可用性**:主库故障时可快速切换

## 二、主从同步原理

MySQL主从同步基于三种核心日志实现:

1. **二进制日志(Binary Log)**:
   - 记录所有修改数据的SQL语句
   - 包含数据变更和结构变更
   - 三种格式:STATEMENT(语句)、ROW(行)、MIXED(混合)

2. **中继日志(Relay Log)**:
   - 从库I/O线程从主库获取的二进制日志
   - 临时存储在从库上的日志文件

3. **工作原理流程**:

主库数据变更 → 写入Binary Log → 从库I/O线程请求日志 → 写入Relay Log → 从库SQL线程重放日志 → 数据同步完成


## 三、环境准备

### 1. 服务器要求
- 主从服务器MySQL版本建议一致(至少前两个版本号相同)
- 网络互通,建议内网环境
- 示例环境:
  - 主库:192.168.1.100,MySQL 8.0
  - 从库:192.168.1.101,MySQL 8.0

### 2. 配置账号权限
在主库创建复制专用账号:
```sql
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'Repl@1234';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;

四、主库配置

1. 修改my.cnf配置文件

[mysqld]
server-id = 1                # 必须唯一
log_bin = mysql-bin         # 开启二进制日志
binlog_format = ROW         # 推荐使用ROW格式
binlog_row_image = FULL     # 记录完整的行数据
sync_binlog = 1             # 每次事务提交都同步binlog
expire_logs_days = 7        # 日志保留天数
binlog_do_db = mydb         # 可选:指定同步的数据库

2. 重启MySQL服务

systemctl restart mysqld

3. 查看主库状态

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 785      | mydb         |                  |
+------------------+----------+--------------+------------------+

五、从库配置

1. 修改my.cnf配置文件

[mysqld]
server-id = 2                # 必须唯一且不同于主库
relay_log = mysql-relay-bin  # 中继日志名称
read_only = ON               # 从库只读(super用户除外)
log_slave_updates = ON       # 级联复制时需要
replicate_do_db = mydb       # 可选:指定复制的数据库

2. 重启MySQL服务

systemctl restart mysqld

3. 配置复制链路

CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@1234',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=785;

4. 启动复制进程

START SLAVE;

5. 检查复制状态

SHOW SLAVE STATUS\G

关键指标检查: - Slave_IO_Running: Yes - Slave_SQL_Running: Yes - Seconds_Behind_Master: 0(表示无延迟)

六、同步模式详解

1. 异步复制(默认模式)

2. 半同步复制

配置方法:

# 主库安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

# 从库安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

# 主库配置
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 3000; # 3秒超时

# 从库配置
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

3. 组复制(MySQL Group Replication)

七、常见问题排查

1. 主从数据不一致

解决方案:

# 在主库生成校验SQL
pt-table-checksum --replicate=test.checksums h=master,u=root,p=password

# 在从库同步差异
pt-table-sync --replicate=test.checksums h=master,u=root,p=password --print

2. 复制中断错误

常见错误处理:

# 跳过指定数量错误
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

# 或忽略特定错误码
[mysqld]
slave_skip_errors = 1062,1146

3. 网络中断恢复

自动重连参数:

[mysqld]
slave_net_timeout = 60      # 网络超时时间(秒)
master-connect-retry = 60   # 重试间隔(秒)

八、监控与维护

1. 监控命令

-- 查看从库状态
SHOW SLAVE STATUS\G

-- 查看复制线程
SHOW PROCESSLIST;

-- 查看二进制日志
SHOW BINARY LOGS;

2. 日常维护

– 从库停止复制 STOP SLAVE; RESET SLAVE ALL;


## 九、GTID复制模式

### 1. GTID优势
- 全局事务标识符(Global Transaction Identifier)
- 简化故障恢复和主从切换
- 自动定位复制位置

### 2. 配置方法
```ini
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON

3. 建立复制

CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@1234',
MASTER_AUTO_POSITION = 1;

十、总结

MySQL主从同步是企业级数据库架构的基础组件,正确配置和维护可显著提升系统可用性。实际生产环境中还需注意:

  1. 监控复制延迟(Seconds_Behind_Master)
  2. 定期验证数据一致性
  3. 做好备份应急预案
  4. 考虑使用中间件(如ProxySQL)管理连接

通过本文介绍的配置方法和问题处理技巧,您可以构建稳定可靠的MySQL复制环境。对于更高级的需求,可进一步研究MySQL Group Replication或InnoDB Cluster方案。 “`

注:本文实际约2150字,包含了主从同步的完整实现流程、配置细节、问题排查和高级特性。可根据实际MySQL版本和具体环境调整参数配置。

推荐阅读:
  1. mysql主从同步异常
  2. MySQL 主从同步。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:MySQL中怎么实现死锁与日志

下一篇:MySQL中怎么优化高并发

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》