MySQL基于二进制日志的主从复制
一、什么是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环境:
- 在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基于二进制日志的主从复制的更多相关文章
- Mysql-8 配置主从复制(基于二进制日志)
目录 1. 实验环境 2. 安装MySQL8 3. 配置主从复制 4. 配置复制用户 5. 数据的同步 6. 配置从节点 7. 测试主从复制 1. 实验环境 System IP Host CentOS ...
- MySQL复制(二)--基于二进制日志文件(binlog)配置复制
基础环境: 主库 从库 服务器IP地址 192.168.10.11 192.168.10.12 版本 5.7.24 5.7.24 已存在的数据库 mysql> show databases; ...
- mysql学习------二进制日志管理
MySQL二进制日志(Binary Log) a.它包含的内容及作用如下: 包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE) 包含关于每个更新数据库( ...
- 如何通过Mysql的二进制日志恢复数据库数据
经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlo ...
- MySQL系列(五)--二进制日志对主从复制的影响
MySQL复制是基于主库上的二进制日志来完成,复制是异步的,可能存在延迟 MySQL日志分为: 1.服务层日志:二进制日志.通用日志.慢查日志 2.存储引擎层日志:innodb中重做日志和回滚日志 二 ...
- Mysql binlog二进制日志
Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的实际原sql语句都会被记录在binlog中. 优点:不需要记录每一 ...
- MySQL使用二进制日志恢复数据库
一.二进制日志简介 MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复. 在my.ini文件中设置了log-bin, ...
- mysql删除二进制日志文件
一.RESET MASTER 这个语句可以验证首次配置主机备机是否成功.步骤如下: 1. 启动master和 slave,开启replication (即 复制) 注:replication (复制) ...
- mysql使用二进制日志恢复数据
一.恢复到某个二进制文件 1.开启二进制日志 在mysqld的配置节点下添加如下配置 log-bin="E:/Mysql57BinLog/binlog"(windows下的路径,l ...
随机推荐
- IDEA阅读源码的技巧
目录 1. 查看当前类内容 2. 查看当前类的继承体系 3. 查看当前方法的调用链 本教程仅支持 MAC 系统下的 IDEA 开发工具,如果需要 Windows 对应的操作起自行替代相应快捷键即可. ...
- 缺少 Google API 秘钥,因此 Chromium 的部分功能将无法使用
获取密钥(ID)教程: https://www.chromium.org/developers/how-tos/api-keys 获取密钥(ID)地址: https://cloud.google.co ...
- java 几个线程池的理解
http://www.cnblogs.com/dolphin0520/p/3932921.html 这个文章写的很好
- Openstack nova代码部分凝视一
做个一个没怎么学过python的菜鸟.看源代码是最好的学习方式了,如今就从nova入手,主要凝视一下 nova/compute/api.py 中的 create_instance函数 def _cre ...
- Python 第三方 http 库-Requests 学习
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...
- java thin方式连接oracle数据库
本文主要描述通过thin方式连接oracle数据库 1.创建web project ,将D:\oracle\product\10.2.0\db_1\jdbc\lib(oracle安装目录)下的ojdb ...
- ehcache缓存刷新问题
ehcache可以设置时间来定时刷新缓存,但是这个只是清空值,key依旧保存着. 只有你第一次利用key获取值,key才会释放.
- struts2获取文件真实路径
CreateTime--2017年8月25日15:59:33 Author:Marydon struts2获取文件真实路径 需要导入: import java.io.FileNotFoundExc ...
- json解析:[1]gson解析json
客户端与服务器进行数据交互时,常常需要将数据在服务器端将数据转化成字符串并在客户端对json数据进行解析生成对象.但是用jsonObject和jsonArray解析相对麻烦.利用Gson和阿里的fas ...
- JavaScript 文件操作方法详解
可以通过浏览器在访问者的硬盘上创建文件,因为我开始试了一下真的可以,不信你把下面这段代码COPY到一个HTML文件当中再运行一下! <script language="JavaScri ...