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系列(五)--二进制日志对主从复制的影响的更多相关文章

  1. MySQL基于二进制日志的主从复制

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

  2. MySQL和Mariadb二进制日志binlog详解

    Mariadb/mysql提供了4中不同的日志,分别是错误日志(error.log).普通日志(general log).慢日志(slow log)以及二进制日志(binlog).错误日志记录了系统启 ...

  3. mysql运维-二进制日志BINARY LOG清理

       1.1 方法1:PURGE MASTER LOGS     语法: PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetim ...

  4. MySQL 5.7二进制日志

    简介 二进制日志是MySQL服务器用来记录数据修改事件的,比如INSERT.UPDATE.DELETE等会导致数据发生变化的语句,SELECT语句不会被记录在内.MySQL必须先执行完一条语句才能知道 ...

  5. MySQL复制(二):二进制日志、二进制日志的结构和内容

    通常只有即将执行完毕的语句才会写入到二进制日志中.但是一些特殊情况:语句附加的信息或直接代替语句被写入. 二进制日志记录的内容 作用:记录数据库中表的更变,用于复制和PITP(即时恢复) 基于语句SB ...

  6. MySQL第五天——日志

    日志 log_error(错误日志) 用于记录 MySQL 运行过程中的错误信息,如,无法加载 MySQL数据库的数据文件,或权限不正确等都会被记录在此. 默认情况下,错误日志是开启的,且无法禁止. ...

  7. 如何选择普通索引和唯一索引《死磕MySQL系列 五》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...

  8. Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解

    一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...

  9. mysql系列五、mysql中having的用法

    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似.WHERE 搜索条件在进行分组操作之前应用:而HAVING 搜索条件在进行分组操作之后应用. ...

随机推荐

  1. shell脚本练习06

    ######################################################################### # File Name: -.sh # Author ...

  2. VS2017+QT5.12环境配置与动态链接库的生成

    最近需要重新编译一个DLL动态链接库,由于源码中包含了QT代码,所以现在需要配置VS+QT环境. 本人系统环境:Win10 64位 一.安装 Visual Studio 2017软件下载安装教程:ht ...

  3. (转)NodeJS - 第一个应用程序Hello World

    安装NodeJs 在创建实际的“Hello,World!”应用之前,我们应该先安装NodeJS,安装NodeJS可以访问NodeJS官网,下载相应系统的NodeJS的安装包,进行安装. 程序组件 关于 ...

  4. Python全栈开发:Ajax全套

    概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...

  5. 前端CSS样式操作

    目录 字体和文字 设置标签的宽高 字体属性 文字的属性 文字对齐 text-align 文字装饰 text-decoration 首行缩进 text-indent 背景属性 背景图片 边框 画圆 di ...

  6. 使用movable-view制作可拖拽的微信小程序弹出层效果。

    仿了潮汐睡眠小程序的代码.[如果有侵权联系删除 最近做的项目有个弹出层效果,类似音乐播放器那种.按照普通的做了一般感觉交互不是很优雅,设计妹子把潮汐睡眠的弹层给我看了看,感觉做的挺好,于是乘着有空仿照 ...

  7. python 继承中的__init__

    如果子类不重写__init__, 实例化子类时,会自动调用父类定义的__init__ 如果子类要重写__init__,实例化子类,就不会调用父类已经定义的__init__ 所以如果想要扩充父类,需要显 ...

  8. 获取url中的参数,函数封装,随拿随用

    获取 function getAllUrlParams(url) { var queryString = url ? url.split('?')[1] : window.location.searc ...

  9. Consul 安装的与启动

    1.下载地址:https://www.consul.io/downloads.html linux 下载地址: wget https://releases.hashicorp.com/consul/0 ...

  10. 05-python 学习第五天-简单验证码

    通过python 随机数可以制作简单的验证码. 1.0版本来了,这验证码,只有一个码,功能虽然达不到,逻辑还是准确的,目前还不能算是验证码,但是我们会继续完善的. import random # 导入 ...