MySQL 的异步复制
MySQL 复制属于水平扩展架构,是构建大规模高性能应用的基础。在 MySQL 中,有两种常用的搭建复制的方式:异步复制和增强半同步复制,本小节主要介绍 MySQL 的异步复制。
1. 复制概述
复制解决的问题,是让一台数据库的数据与其他数据库保持同步。复制的原理是将主库的 DML 和 DDL操作通过 binlog 日志传到从库,然后在从库上重放这些日志,从而使主库和从库保持数据同步。
- 实现高可用架构,避免单点故障;
- 可以在从库执行查询,分担主库的查询压力;
- 可以在从库执行备份,降低主库受到的影响。
2. 异步复制
MySQL 的复制默认是异步复制,主从异步复制是 MySQL 很常见的复制场景,搭建步骤也相对简单。下面从实战的角度一步步搭建异步复制环境。
2.1 基本环境
|
Master |
Slave |
MySQL版本 |
MySQL-5.7.31-x86_64 |
MySQL-5.7.31-x86_64 |
IP |
192.168.0.1 |
192.168.0.2 |
port |
3306 |
3306 |
2.2 主库配置
gtid-mode = on
enforce-gtid-consistency = 1
binlog_format = row
server-id = 330601
log-bin = /mysql/log/mysql-bin
binlog_cache_size = 1M
create user 'repl'@'192.168.0.2' identified by '123456'; grant replication slave on *.* to 'repl'@'192.168.0.2';
2.3 从库配置
gtid-mode = on
enforce-gtid-consistency = 1
binlog_format = row
server-id = 330602
log-bin = /mysql/log/mysql-bin
binlog_cache_size = 1M
skip_slave_start = 1
mysqldump -uroot -p
mysql -uroot -p < test_200908.sql
change master to master_host='192.168.0.1', master_port=3306, master_user='repl', master_password='123456', master_auto_position=1;
start slave;
show slave status\G;
2.4 环境校验
use test123;
create table t1(id int);
insert into t1 values(1);
select * from t1;
use test123;
select * from t1;
2.5 扩展问题
mysqldump -uroot -p
Enter password:
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass
当MySQL为GTID模式时,用mysqldump导出默认会带上当前已执行的GTID
- 如果是从库的GTID_EXECUTED为空值,即从库无任何事务操作,则无需理会;
- 如果是从库的GTID_EXECUTED为非空,两种解决方案。
在主库 mysqldump 导出时,加上参数 --set-gtid-purged=OFF,适合场景为导出部分数据;
在从库 mysqldump 导入前,执行 reset master,适合场景为搭建新从库。
3. 小结
本小节主要介绍了 MySQL 复制的基本概念和 MySQL 异步复制的搭建方式。
- 一般来说,需确保主从库安装相同版本的数据库
- 在主库需新建一个复制账号,并授予replication slave权限