MySQL系列(五)--二进制日志对主从复制的影响
MySQL复制是基于主库上的二进制日志来完成,复制是异步的,可能存在延迟
MySQL日志分为:
1、服务层日志:二进制日志、通用日志、慢查日志
2、存储引擎层日志:innodb中重做日志和回滚日志
二进制日志:
记录了所有对数据库修改的事件,包括DML和DDL,但是不包含因为出错回滚的日志。二进制日志格式分类:
STATMENT:SBR
基于段的格式binlog_format=STATMENT,MySQL5.7之前默认
在数据修改时执行的SQL语句,不论使用的时那种日志格式,在使用DDL语句都是基于段的格式
优点:
日志记录量相对较小,解决磁盘及网络I/O,因为只是记录SQL语句,而不是每一行数据的变化
不强制要求主从数据库的表的定义完全相同
缺点:
必须要记录上下文信息,保证语句在从数据库上执行结果和主数据库上相同
特定函数如UUID(),user()这类函数还是无法复制,会在主从数据库上产生差异
对于存储过程、触发器,自定义函数在主从数据库进行的修改可能造成数据不一致
相比基于row的复制方式需要更多地行锁
SHOW VARIABLES LIKE 'binlog_format'; //查看binlog是否开启,使用的是哪种
SET SESSION binlog_format=statement; //设置binlog使用statement
SHOW BINARY LOGS; //查看binlog文件有哪些
mysqlbinlog binlog.000097; //查看binlog文件,通过cmd或者在Linux环境使用,无法在连接工具上使用
SHOW BINLOG EVENTS in 'binlog.000097'; //查看binlog文件,在连接工具上使用
FLUSH LOGS; //刷新logs,新产生一个binlog文件
//下面是SQL语句
DROP TABLE IF EXISTS temp;
CREATE TABLE temp(id int, name VARCHAR(10));
INSERT INTO temp VALUES(1, 'sam');
INSERT INTO temp VALUES(2, 'jesen'); SHOW BINLOG EVENTS in 'binlog.000103'; //查看binlog.000103文件内容
ROW:RBR
基于行的日志格式,如果因为误操作而修改了数据库中的数据,同时又没有备份可以恢复,通过日志中记录的日志操作,进行反向处理达到
数据恢复的目的
优点:
主从复制更加安全,适用于任何SQL的使用,包括存储过程、触发器,自定义函数等
对每行数据的修改比基于段的复制高效,减少从数据库锁的使用
缺点:
要求主从表结构一致
无法在从服务器上单独执行触发器
记录日志量很大,因为这个问题,在MySQL5.7版本之后,通过参数binlog_row_image=[FULL|MINIMAL|NOBLOB]
Full:代表记录一行中所有列,无论这个列是否被修改,默认
Minimal:只记录修改的列
NoBlob:和full差不多,只是如果blob/text没有被修改,不会记录该列
PS:对于row的格式,如果通过mysqlbinlog查看日志,需要-vv参数,否则显示内容人工无法识别,例如:mysqlbinlog -vv binlog.000097;
mixed:
混合日志格式binlog_format=mixed,根据SQL语句由系统决定使用基于row还是statement
综上:
建议使用row,而非statement
MySQL系列(五)--二进制日志对主从复制的影响的更多相关文章
- MySQL基于二进制日志的主从复制
一.什么是MySQL的主从复制? MySQL可以将一个数据库设置为主库,另一个数据库设置为该主库的从库,当主库发生了变更,会同步到从库中.MySQL的主从架构,可以是星型的,也可以是线型的. 星型架构 ...
- MySQL和Mariadb二进制日志binlog详解
Mariadb/mysql提供了4中不同的日志,分别是错误日志(error.log).普通日志(general log).慢日志(slow log)以及二进制日志(binlog).错误日志记录了系统启 ...
- mysql运维-二进制日志BINARY LOG清理
1.1 方法1:PURGE MASTER LOGS 语法: PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetim ...
- MySQL 5.7二进制日志
简介 二进制日志是MySQL服务器用来记录数据修改事件的,比如INSERT.UPDATE.DELETE等会导致数据发生变化的语句,SELECT语句不会被记录在内.MySQL必须先执行完一条语句才能知道 ...
- MySQL复制(二):二进制日志、二进制日志的结构和内容
通常只有即将执行完毕的语句才会写入到二进制日志中.但是一些特殊情况:语句附加的信息或直接代替语句被写入. 二进制日志记录的内容 作用:记录数据库中表的更变,用于复制和PITP(即时恢复) 基于语句SB ...
- MySQL第五天——日志
日志 log_error(错误日志) 用于记录 MySQL 运行过程中的错误信息,如,无法加载 MySQL数据库的数据文件,或权限不正确等都会被记录在此. 默认情况下,错误日志是开启的,且无法禁止. ...
- 如何选择普通索引和唯一索引《死磕MySQL系列 五》
系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...
- Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解
一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...
- mysql系列五、mysql中having的用法
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似.WHERE 搜索条件在进行分组操作之前应用:而HAVING 搜索条件在进行分组操作之后应用. ...
随机推荐
- 菲波那切数列(Fibonacci Number)
什么是菲波那切数列?自己google一下,面试题里面经常遇到,考试递归算法用的. 在菲波那切数列中用递归不太好.第三种算法最好. 第一 递归算法最差了,不想说.测试一下,当N=6000时,半天出不来数 ...
- selenium基础(元素定位)
selenium的帮助文档: https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions 目前支 ...
- [NOIP2019模拟赛]数数(gcd)
题目大意: 求l~r中有多少数与x互质,带单点修改 分析: 两个30的部分分很好打: ·n<=1000暴力O(nq)就好了 ·$a_i<=100$用树状数组维护每个x的前缀和就好了 100 ...
- 串口通信中,QString 、QByteArray 转化需要注意的问题
在做串口通信的时候,其中犯了一个错误.在此记录一下:QT中串口通信接到收据和发送数据的接口如下: QByteArray QIODevice::readAll()//接受数据 qint64 QIODev ...
- Python全栈开发:web框架之tornado
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- angular项目中遇到的问题
一.angular项目中如何实现路由缓存 需要实现的效果,对请求的数据进行缓存,比如进入文章详情页之后点击返回,不会再调用后台数据接口:而是加载缓存中的数据,如何数据变动的情况下,可使用下拉刷新刷新页 ...
- JS的高阶函数
JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. 这就是最简单的高阶函数啦 functio ...
- 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)[转]
上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们 ...
- 菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t[转]
菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- python 中动态类的创建
参考 collections.namedtuple 的实现 链接: https://www.cnblogs.com/BeautifulWorld/p/11647198.html