MySQL的复制机制
MySQL的复制机制
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.MySQL复制介绍
1>.MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况下复制是异步进行的,从库也不需要一直连接主库来同步数据;
2>.MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库,也可以是一个数据库里的指定的表;
3>.MySQL复制带来的优势在于:
扩展能力:
通过复制可以将MySQL的性分到一个或多个slave上。这要求所有的写操作和修改操作都必须在Master上完成,而读操作可以被分配到一个或多个salve上。将读写分离到不同服务执行之后,MySQL的读写性能得到提升。 数据库备份:
由于从实例时同步主实例的数据,所以可以将备份作业部署到从库。 数据分析和报表:
同样,一些数据分析和报表的实现可以在从实例执行,以减少对主库的性能影响。 容灾能力:
可以在物理距离较远的另一个数据建立slave,保证在主实例所在地区遭遇灾难时,在另一个数据中心能快速恢复。
二.MySQL复制有两种方法
1>.传统方式
基于主库的bin-log将日志事件和事件位置复制到从库,从库再加以应用来达到主从同步的目的。
2>.Gtid方式
global transaction identitifiers 是基于事物来复制数据,因此也就不依赖日志文件,同时又能更好的保证主从库数据一致性。
三.MySQL复制有多种类型
1>.异步复制
一个主库,一个或多个从库,数据异步同步到从库。
2>.同步复制
在MySQL cluster中特有的复制方式。
3>.半同步复制
在异步复制的基础上,确保任何一个主库上的事物在提交之前至少有一个从库已经收到该事物并日志记录下来。
4>.延迟复制
在异步复制的基础上,人为设定主库和从库的数据同步延迟时间,即保证数据延迟至少是这个参数。
四.MySQL复制原理
1>.MySQL的复制原理

如上图所示,MySQL复制的原理大致总结如下:
1>.在Slave 服务器上执行sart slave命令开启主从复制开关,开始进行主从复制。 2>.此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容 3>.Master服务器接收到来自Slave服务器的IO线程的请求后,二进制转储IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。 4>.当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容 5>.Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点
2>.MySQL复制有三种核心格式
复制的工作原理是数据库修改记录到bin log日志并传递到slave,然后slave在本地还原的过程。而时间记录到bin log的格式会有所不同。
基于语句的复制(statement based replication):
基于主库将SQL语句写入到bin log中完成复制。 基于行数据的复制(row based replication):
基于主库将每一行数据变化的信息作为时间写入到bin log中完成日志。默认就是基于行级别的复制,因为它相对语句复制逻辑更为严谨。 混合复制(mixed based replication):
上述两者的结合。默认情况下优先使用基于语句的复制,只有当部分语句如果基于语句复制不完全的情况下才会自动切换为基于行数据的复制。
[root@node101 ~]# mysql -uroot -pyinzhengjie
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.25-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec) mysql>
mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%'; #查看日志信息
[root@node101 ~]# mysql -uroot -pyinzhengjie
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec) mysql>
mysql>
mysql> SET binlog_format='STATEMENT';
Query OK, 0 rows affected (0.00 sec) mysql>
mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec) mysql>
mysql>
mysql> SET binlog_format='STATEMENT'; #修改为基于语句即复制
五.MySQL复制使用场景
MySQL复制可以作为数据库备份的一种解决方案,由于主库的数据会复制到备库,所以可以在备库数据库备份作业而不影响主库的性能。
当数据库比较小时,可以采用mysqldump的方式。由于mysqlddump出来的文件内容是SQL语句,所以可以很方便的将其中的一部分复制出来应用到其他数据库里。在执行mysqldump之前,为了保证数据的一致性,最好是把salve进程停掉。
[root@node102 ~]# mysqladmin -uroot -p stop-slave
Enter password:
Slave stopped
[root@node102 ~]#
[root@node102 ~]# mysql -uroot -p -e 'STOP SLAVE SQL_THREAD'
Enter password:
[root@node102 ~]#
[root@node102 ~]#
[root@node102 ~]# mysqldump --all-databases -uroot -p > fulldb.dump
Enter password:
[root@node102 ~]#
[root@node102 ~]# ll -h fulldb.dump
-rw-r--r--. root root 782K Mar : fulldb.dump
[root@node102 ~]#
[root@node102 ~]# mysqladmin -uroot -p start-slave
Enter password:
Slave started
[root@node102 ~]#
案例实操
当数据库比较大时,采用mysqldump方式的效率不高,所以可以使用物理文件拷贝的方式。为了保证数据的一致性,物理备份需要将备份关闭。
[root@node102 ~]# mysqladmin -uroot -p shutdown
Enter password:
[root@node102 ~]#
[root@node102 ~]# grep datadir /etc/my.cnf
datadir=/yinzhengjie/softwares/mysql/data/
[root@node102 ~]#
[root@node102 ~]# cd /yinzhengjie/softwares/mysql/
[root@node102 mysql]#
[root@node102 mysql]# tar zcf yinzhengjie-dbbackup.tar.gz ./data
[root@node102 mysql]#
[root@node102 mysql]# ll yinzhengjie-dbbackup.tar.gz
-rw-r--r--. root root Mar : yinzhengjie-dbbackup.tar.gz
[root@node102 mysql]#
[root@node102 mysql]# /etc/init.d/mysql.server start
Starting MySQL. SUCCESS!
[root@node102 mysql]#
[root@node102 mysql]#
[root@node102 mysql]#
案例实操
MySQL复制可以用在主库和从库采用不同的存储引擎的情况下。这样做的 目的通常是在主库和从库分别利用不同存储殷勤的优势,比如在主库使用InnoDB是为了事务功能,而从库使用MyISAM因为是只读操作而不需要事务功能。
当使用mysqldump方式来创建备库时,改变备库的表存储引擎的方式就是在应用dump文件之前修改文件里的所有关于表存储引擎的地方。
如果是使用文件拷贝的方式来创建备库时,则唯一修改备库表存储引擎的方式就是启动备库之后使用ALTER TABLE命令修改。
[root@node102 ~]# mysql -uroot -pyinzhengjie
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.7.-log MySQL Community Server (GPL) Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysql> use course;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql>
mysql>
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| course |
+------------+
row in set (0.00 sec) mysql>
mysql> SHOW TABLES;
+------------------+
| Tables_in_course |
+------------------+
| course |
| dept |
| score |
| students |
| teacher |
+------------------+
rows in set (0.00 sec) mysql>
mysql>
mysql> STOP SLAVE;
Query OK, rows affected (0.01 sec) mysql>
mysql>
mysql> ALTER TABLE students ENGINE = 'InnoDB';
Query OK, rows affected (0.12 sec)
Records: Duplicates: Warnings: mysql>
mysql> START SLAVE;
Query OK, rows affected (0.00 sec) mysql>
mysql>
案例展示
MySQL复制可以用来做负载均衡(一般都是一主多从架构)功能的水平扩展,最主要是讲数据库的读压力分担导多个MySQL slave实例上,这样的情况适用在读多写少的环境中。比如,一个WEB架构。

MySQL复制可以用在当需要将主库上的不同数据库复制到不同的slave上,以便在不用的salve上执行不同的数据分析任务时。
可以在每个slave上配置不同的参数来约束复制过来的数据,通过replicate-wild-do-tale参数或者replicate-do-db参数。

slave1上应该配置参数replicate-wild-do-table=databaseA.%
slave2上应该配置参数replicate-wild-do-table=databaseB.%
slave3上应该配置参数replicate-wild-do-table=databaseC.%
每个slave其实是接收到完整的bin log日志,但在应用环节中会进行过滤,仅应用符合参数配置的事件。
在配置完参数之后,通过mysqldump的方式将对应的数据库在slave应用起来,在启动slave线程。
六.MySQL 案例实操
1>.MySQL5.7基于binlog的复制
详情请参考 :https://www.cnblogs.com/yinzhengjie/p/10425185.html。
2>.MySQL5.7延迟复制
详情请参考 :https://www.cnblogs.com/yinzhengjie/p/10434414.html。
MySQL的复制机制的更多相关文章
- MySQL复制机制原理
背景介绍 复制,就是对数据的完整拷贝,说到为什么要复制,首先能想到的是怕数据意外丢失,使得用户蒙受损失. 当完成了数据复制之后,会发现它的优势不止这一点,假如一台机器宕机了,可以启用备份在另一台机器的 ...
- 与MySQL传统复制相比,GTID有哪些独特的复制姿势?
与MySQL传统复制相比,GTID有哪些独特的复制姿势? http://mp.weixin.qq.com/s/IF1Pld-wGW0q2NiBjMXwfg 陈华军,苏宁云商IT总部资深技术经理,从事数 ...
- mysql的Replication机制
mysql的Replication机制 参考文档:http://www.doc88.com/p-186638485596.html Mysql的 Replication 是一个异步的复制过程. 从上图 ...
- 浅谈MySQL Replication(复制)基本原理
1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...
- 使用MySQL组复制的限制和局限性
本节列出和解释了组复制相关的要求和限制. 1.组复制的要求 要使用组复制,每个MySQL节点必须满足以下条件: 1.1 基本要求 InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中.事 ...
- 004.Heartbeat+HAProxy+MySQL半复制高可用架构
一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Slave Cen ...
- Mysql组复制之单主模式(一)
环境 系统:CentOS release 6.9 (Final) Mysql:5.7 机器: S1 10.0.0.7 lemon S2 10.0.0.8 lemon2 S3 10.0.0.9 lemo ...
- MySQL 并行复制演进及 MySQL 8.0 中基于 WriteSet 的优化
MySQL 8.0 可以说是MySQL发展历史上里程碑式的一个版本,包括了多个重大更新,目前 Generally Available 版本已经已经发布,正式版本即将发布,在此将介绍8.0版本中引入的一 ...
- PostgreSQL主备流复制机制
原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...
随机推荐
- C++:如何正确的定义一个接口类
C++中如何定义接口类?首先给接口类下了定义:接口类应该是只提供方法声明,而自身不提供方法定义的抽象类.接口类自身不能实例化,接口类的方法定义/实现只能由接口类的子类来完成. 而对于C++,其接口类一 ...
- Codeforces 768B B. Code For 1
参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6423483.html B. Code For 1 time limit per test:2 se ...
- Vue 计算
目标:字段c=字段a+字段b 方法1 直接使用Mustache(胡子表达式) <body> <div id="example" > <input v- ...
- D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询
题意 贴海报 最后可以看到多少海报 思路 :离散化大区间 其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时 把y+1点也加入 ...
- JeeSite4.x 搭建并部署到服务器
1.下载地址:https://gitee.com/thinkgem/jeesite4 2.文档地址:http://jeesite4.mydoc.io/?t=267354 2.1一定要看,都很清晰,没废 ...
- 设置服务器的MySQL允许远程访问/外网访问
我需要在C++中连接服务器上的MySQL数据库.但是直接连接失败了,原来服务器上还要修改一下MySQL的配置. 一.服务器上的配置mysql数据库 进入mysql: mysql -uroot -p 输 ...
- Java 枚举 的学习
在JDK5.0之后,引进了一种与C语言相通的枚举类型. 所谓枚举类型就是指含有一组具有固定值, 并且容量有限的数据集合. 例如,定义一个星期的枚举类型, 从周一到周日是具有固定大小和固定值的集合 pu ...
- [CF976E]Well played!
题目描述 Recently Max has got himself into popular CCG "BrainStone". As "BrainStone" ...
- KVM改NAT为Bridge
kvm 改nat为桥接在安装一个拥有虚拟化功能的Linux操作系统(此处以CentOS为例),一般我们有两种方法:1.在光盘安装的时候安装好虚拟化包或者PXE服务器上配置好虚拟化包2.手动在没有安装虚 ...
- uvaLive6837 ThereIsNoAlternative (kruskal)
题意:给一个联通图,求出不可替代的边,即存在于所有最小生成树中的边,的数量和它们边权之和 首先kruskal跑出一个最小生成树,枚举其中所有的边,若把这条边去掉以后再跑kruskal答案不是最小,则这 ...