一、什么是MySQL的主从复制?

MySQL可以将一个数据库设置为主库,另一个数据库设置为该主库的从库,当主库发生了变更,会同步到从库中。MySQL的主从架构,可以是星型的,也可以是线型的。

星型架构:

线型架构:

由于主从复制的延迟问题,星型架构比线型架构更常用。下文中的应用主要是以星型架构为例。

二、MySQL主从复制的方式

MySQL的复制可以分为基于二进制日志的复制和基于事务(GTID)的复制,基于二进制日志的复制方式,又可以分为基于行(ROW)的二进制日志复制方式,和基于语句(STATEMENT)的二进制日志复制方式。那么这些复制方式有什么区别呢?

基于语句的二进制日志复制,主库将变更SQL语句以及上下文记录到二进制日志中,这样的话,如果SQL语句中有不确定值的函数,例如uuid(),在从库中执行执行相同的SQL语句可能会导致不同的变更结果。现在来看一下基于语句的二进制日志,临时设置二进制日志格式为statement:set session binlog_format=statement,在库中插入一条数据:insert into novel values(4, '杯雪')。查看产生的二进制日志:mysqlbinlog --no-defaults mysql-bin.000002,日志如下所示:

基于行的二进制日志复制,主库是将每行的变更数据记录到二进制日志中,在从库中直接是对每行数据进行修改,而不用在从库中执行SQL语句,这样会更高效,并且不会导致主从数据不一致的问题。不过,这样会导致二进制日志比较大。下面是基于ROW的二进制日志:

上面的两种二进制日志复制方式,需要指定是哪个二进制日志以及相应的偏移量,来进行增量同步,如果指定错误会造成遗漏或者重复。

GTID方式,本文暂不讨论,后续会补上。

三、MySQL复制的原理

  • 主库发生变更,将变更事件记录到二进制日志中
  • 从库启动一个I/O线程,该线程和主库建立一个连接,并在主库上启动一个二进制转储线程,用于读取主库中的二进制日志事件,从库的I/O线程将接收到的二进制日志事件写到中继日志中。
  • 从库的SQL线程从中继日志中读取事件,并更新从库。

四、基于行的二进制日志的主从复制方式实例

  • 准备MySQL环境:
  1. 在win10,以管理员的身份启动docker,启动一个centos6.7容器:

docker run --name cnt-centos-mysql-w -itd  87de1d39ef43 /bin/bash

2. 在容器中安装并配置mysql,参考https://www.cnblogs.com/lzj0218/p/5724446.html

3. docker commit cfb8dfa6ddd8  centos-mysql,将安装mysql后的容器保存为一个镜像。

4. 用上述centos-mysql镜像,启动三个容器实例,作为一主二从:

Master:docker run --name cnt-centos-mysql-master -itd -p 7000:22 centos-mysql /bin/bash

Slave1:ocker run --name cnt-centos-mysql-slave1 -itd  -p 7001:22 centos-mysql /bin/bash

Slave2:docker run --name cnt-centos-mysql-slave2 –itd –p 7002:22 centos-mysql /bin/bash

5. 在主库创建一个数据库,创建表,插入数据

在启动mysql服务的时候,如果报“”,可以尝试使用rm -fr /var/lib/mysql/*这个命令来解决,重新初始化数据库。

  • 配置主库,vi /etc/my.cnf

  • 配置从库

  • 将主库的初始数据,初始化到从库中

备份主数据库:

将备份脚本拷贝到从库中:

初始化从库:

  • 在主库上建立复制用户并授权:

建立对应网段的复制用户:

给repl用户授予复制权限:

  • 在从库上配置复制链路:

其中,master_log_file的取值,来自备份的脚本,如下:

启动复制链路,并查看复制链路转态信息:

  • 测试

在主库中插入数据:

查询从库,可以看到刚插入的数据已经从主库同步到从库中了:

MySQL基于二进制日志的主从复制的更多相关文章

  1. Mysql-8 配置主从复制(基于二进制日志)

    目录 1. 实验环境 2. 安装MySQL8 3. 配置主从复制 4. 配置复制用户 5. 数据的同步 6. 配置从节点 7. 测试主从复制 1. 实验环境 System IP Host CentOS ...

  2. MySQL复制(二)--基于二进制日志文件(binlog)配置复制

    基础环境:   主库 从库 服务器IP地址 192.168.10.11 192.168.10.12 版本 5.7.24 5.7.24 已存在的数据库 mysql> show databases; ...

  3. mysql学习------二进制日志管理

    MySQL二进制日志(Binary Log)   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库( ...

  4. 如何通过Mysql的二进制日志恢复数据库数据

    经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlo ...

  5. MySQL系列(五)--二进制日志对主从复制的影响

    MySQL复制是基于主库上的二进制日志来完成,复制是异步的,可能存在延迟 MySQL日志分为: 1.服务层日志:二进制日志.通用日志.慢查日志 2.存储引擎层日志:innodb中重做日志和回滚日志 二 ...

  6. Mysql binlog二进制日志

    Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的实际原sql语句都会被记录在binlog中. 优点:不需要记录每一 ...

  7. MySQL使用二进制日志恢复数据库

    一.二进制日志简介 MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复. 在my.ini文件中设置了log-bin, ...

  8. mysql删除二进制日志文件

    一.RESET MASTER 这个语句可以验证首次配置主机备机是否成功.步骤如下: 1. 启动master和 slave,开启replication (即 复制) 注:replication (复制) ...

  9. mysql使用二进制日志恢复数据

    一.恢复到某个二进制文件 1.开启二进制日志 在mysqld的配置节点下添加如下配置 log-bin="E:/Mysql57BinLog/binlog"(windows下的路径,l ...

随机推荐

  1. org.apache.commons.io.Charsets

    requiredCharsets:由Java平台支持字符集对象标准名称,构造一个sorted map. public void test() { Map<String, Charset> ...

  2. 由ASIHttpRequest里的block引发的思考

    项目发http请求,现在一般的都是用的第三方开源库,当然发异步请求时我们也会写几个回调函数来进行请求返回时的处理.不过前段时间看一个朋友写的代码,里面很用block简单的实现了回调相关的部分.比如: ...

  3. 转: IO设计模式:Reactor和Proactor对比

    转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis.ACE,事件模型都使用的Reactor模式:而同样做事件处理的Proact ...

  4. 127.0.0.1和localhost和本机IP三者的区别

    1,什么是环回地址??与127.0.0.1的区别呢?? 环回地址是主机用于向自身发送通信的一个特殊地址(也就是一个特殊的目的地址). 可以这么说:同一台主机上的两项服务若使用环回地址而非分配的主机地址 ...

  5. script脚本中写不写$(document).ready(function() {});的差别

    $(document).ready() 里的代码是在页面内容都载入完才运行的,假设把代码直接写到script标签里.当页面载入完这个script标签就会运行里边的代码了,此时假设你标签里运行的代码调用 ...

  6. Solidworks如何绘制螺纹

    1 随便画一个圆柱   2 在原来的地方画一个一摸一样的圆(草图2)   3 在特征选项卡中点击曲线-螺旋线/涡状线   4 设置螺距和圈数,画螺旋线   5 建立一个基准面,第一参考是点,第二参考是 ...

  7. 2016年蓝桥杯C/C++B组

    第一次參加蓝桥杯.也是有非常多感触的,时间全然不够写最后一题... 最后一题没做...还有全排序非常重要... 1. 煤球数目 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三 ...

  8. HDU 4927 大数

    题意非常easy: 对于长度为n的数.做n-1遍.生成的新数列: b1=a2-a1   b2=a3-a2  b3=a4-a3 c1=b2-b1   c2=b3-b2 ans=c2-c1 最后推出公式: ...

  9. 身份证实名认证接口调用实例(PHP)

    基于php的身份证实名认证接口调用代码实例,身份证实名认证接口申请:https://www.juhe.cn/docs/api/id/103 <!--?php // +-------------- ...

  10. 【LeetCode】Search in Rotated Sorted Array——旋转有序数列找目标值

    [题目] Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...