复制工作原理
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。

复制的本质就是一个完全备份+二进制日志备份还原。由主库将二进制日志"推送"给从库,然后从库应用这些"二进制日志",以实现主从数据同步

当主从复制配置完成后,各复制线程启动顺序如下:

1> 从库上启动复制,在从库上创建I/O线程,I/O线程连接到主库
2> 主库创建binlog dump线程读取数据库事件并发送给IO线程
3> 从库上的I/O线程接收到事件数据,将事件数据更新到中继日志(relay log)中
4> 从库上SQL线程读取中继日志中更新的事件数据并应用到从库上。

PS:MYSQL 库只应用和自己ServerID不同的binlog日志,MYSQL通过判断Binlog事件中的不同ServerID即可判断当前库是否是事件的初始发生Server,因此双住复制+多级复制不会出现循环复制。

使用文件存储复制进度信息

在早期的MySQL中,为保证从库Crash重启后,从库的IO线程和SQL线程仍能正常工作,从库上会默认创建两个日志文件master.info和relay-log.info来保存复制的进度,如下图所示:

在存放中继日志时,先更新复制元数据Receiver Meta-data,再将二进制日志写入中继日志文件中;
在应用中继日志时,先更新复制元数据Applier Meta-data,在将二进制日志应用到数据库中;
当从库发生宕机恢复后,会根据复制元数据来判断从哪个位置点开始恢复,但由于更新元数据和应用二进制不在一个事务中,因此Applier Meta-data无法有效的反应应用日志的重做状态。

使用表存放复制进度信息

在MySQL 5.6版本后,在存储进度信息方面做了增强,可以使用表mysql.slave_master_info和mysql.slave_relay_log_info来存放复制进度。

使用表来存放复制元数据的好处:
1>可以将数据库数据和复制元数据一起提交或回滚。
2>无需再使用文件来存放元数据
3>灾难恢复时从库可以找到一个有效的位置来恢复

缺陷:如果表使用非事务性存储引擎,将无法进行回滚

配置表方式存放复制进度信息:

##配置从库使用表来存放复制元数据
STOP SLAVE;
SET @@GLOBAL.master_info_repository='TABLE';
SET @@GLOBAL.relay_log_info_repository='TABLE';
SELECT @@GLOBAL.master_info_repository,@@GLOBAL.relay_log_info_repository;
START SLAVE; SELECT * FROM mysql.slave_master_info \G
SELECT * FROM mysql.slave_relay_log_info \G; ##注意修改配置文件以保证复制重启后仍使用表来存放元数据
relay_log_info_repository='TABLE'
master_info_repository='TABLE'

PS:从库上使用的复制账号和密码都明文存放在元数据中。

MySQL Replication--复制基本工作原理的更多相关文章

  1. 浅谈MySQL Replication(复制)基本原理

    1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...

  2. GTID复制的工作原理

    参考自:https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-lifecycle.html 笔记说明: 本文翻译自官网,当然会根据语义做一 ...

  3. mysql(一)工作原理 & 数据库引擎

    参考文档 http://www.cnblogs.com/xiaotengyi/articles/3641983.html innodb:https://www.cnblogs.com/Aiapple/ ...

  4. 在Docker平台实现MySQL Replication(复制)

    MySQL Replication提供了数据库之间复制数据的功能,通过这个功能可以让一个数据库的数据更改自动同步到另外一个数据库.通常用这个功能来实现数据备份.数据容灾.数据冗余,进一步实现数据的读写 ...

  5. 《Mysql - Order By 的工作原理?》

    一:概述 - order by 用于 SQL 语句中的排序. - 以  select city,name,age from t where city='杭州' order by name limit ...

  6. mysql replication 复制的一些问题

    1   过大的复制延迟 mysql 的复制延迟是一个常见问题,现在已经有一些解决方案,如淘宝开发的一些工具 2 没有磁盘空间 复制导致磁盘空间塞满,二进制日志.中继日志或临时文件把磁盘塞满,slave ...

  7. Windows 下MySql Replication(复制)配置

    环境准备 到官网下载mysql-installer-web-community-5.7.21.0.msi并安装,选择MySql Workbench,记录安装时root输入的密码. 需要安装在两台机器上 ...

  8. MongoDB复制集的工作原理介绍(二)

    复制集工作原理 1)数据复制原理 开启复制集后,主节点会在 local 库下生成一个集合叫 oplog.rs,这是一个有限集合,也就是大小是固定的.其中记录的是整个mongod实例一段时间内数据库的所 ...

  9. 浅析 MySQL Replication(本文转自网络,非本人所写)

    作者:卢飞 来源:DoDBA(mysqlcode) 0.导读 本文几乎涵盖了MySQL Replication(主从复制)的大部分知识点,包括Replication原理.binlog format.复 ...

随机推荐

  1. Oracle系列十五 控制用户权限

    权限 数据库安全性 --系统安全性 --数据安全性 系统权限: 对于数据库的权限 对象权限: 操作数据库对象的权限 系统权限 超过一百多种有效的权限 数据库管理员具有高级权限以完成管理任务,例如: 创 ...

  2. 使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤

    安装配置 VSCode [1]安装 VSCode: 下载地址:https://code.visualstudio.com/ 根据自己电脑对应的操作系统下载对应的版本即可,至于安装过程也和一般的软件一样 ...

  3. Docker使用 - 镜像

    获取镜像 命令:docker  pull  [选项]  镜像名 可通过 ”docker  pull  --help“  命令来查看有哪些选项 docker pull training/webapp # ...

  4. 【翻译】Flink Table Api & SQL — SQL客户端Beta 版

    本文翻译自官网:SQL Client Beta  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/sqlCl ...

  5. advanceInstaller安装文件的ICON

    修改以下配置 点击icon图标位置可重新选择

  6. dotnet core 3.0 swagger 显示枚举描述

    上一篇net core 2.2 swagger的枚举描述,core 3.0 需要升级swagger到5.0rc版,配置需要做些修改,swaager启用了OpenApi标准,之前的枚举描述方法也失效了. ...

  7. CentOS 7上重新编译安装nginx

    CentOS 7的源所提供的nginx几乎不包含任何扩展模块:为了能够使用一些扩展模块,我们需要从源代码重新编译安装nginx. 目前最新版的源代码是1.6.1.下载解压后先不要急着configure ...

  8. Ubuntu上使用Docker打包镜像

    关于这个一开始会有点懵,直白一点就是,把本地路径下的代码放到docker里面去,然后在docker这个隔离环境中运行调用我们的程序.专业解释请自行检索学习. 第一步:创建容器 docker run - ...

  9. Difference between LinkedList vs ArrayList in Java

    source-url LinkedList implements it with a doubly-linked list. ArrayList implements it with a dynami ...

  10. 最常见的Java面试题及答案汇总(二)

    上一篇:最常见的Java面试题及答案汇总(一) 容器 18. java 容器都有哪些? 常用容器的图录: 19. Collection 和 Collections 有什么区别? java.util.C ...