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. Java开发系列-Cookie与Session会话技术

    概述 会话技术:当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话.会话技术产生是由于Http请求是一个无状态的协议,它不会记录上次访问的内容,用户在访过程中难免产生一 ...

  2. DMZ在虚拟化环境中的部署

    常见的方法有三种: 1.分别部署 2.部分虚拟化 3.全部虚拟化 传统DMZ部署结构: 分别部署: 想要保持DMZ区域物理隔离采用这种方法,每个区域分别部署进入不同的服务器集群,区域之间的连接采用物理 ...

  3. Loadrunner系列学习--Loadrunner架构(1)

    Loadrunner系列学习--Loadrunner架构(1) 最近在学习Loadrunner,发现一个英文网站http://www.wilsonmar.com/1loadrun.htm里面介绍的比较 ...

  4. TestNG 入门教程【转】

    TestNG 入门教程[转] 国庆7天假期,大部分朋友都出去旅游了,微信圈里全是晒旅游的照片, 东南亚游,欧洲游呀,真是羡慕呀. 悲惨的我只去了上海野生动物园, 在家休息,利用这段假期,把之前学过的东 ...

  5. 解决element 分页组件,搜索过后current-page 绑定的数据变了,但是页面当前页码并没有变的问题

    前言上一篇写前台解决分页问题的时候没有这个问题,但是在实际项目后台中有遇到过,所以在这里专门说一下,如果参考前台分页出现这种问题了,也可以使用这种方法!bug:vue和element实现的后台分页,当 ...

  6. tcp为什么要三次握手,四次挥手

    tcp为什么要三次握手,tcp为什么可靠. 为什么不能两次握手:(防止已失效的连接请求又传送到服务器端,因而产生错误) 假设改为两次握手,client端发送的一个连接请求在服务器滞留了,这个连接请求是 ...

  7. nginx使用手册--nginx.conf文件配置详解

    #运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; ...

  8. ArrayBlockingQueue的使用案例:

    ArrayBlockingQueue的介绍: ArrayBlockingQueue,顾名思义:基于数组的阻塞队列.数组是要指定长度的,所以使用ArrayBlockingQueue时必须指定长度,也就是 ...

  9. C++面向对象高级编程(下)第二周-Geekband

    17,对象模型:关于vptr(vitrual Pointer)和vtbl(virtual Table) 当存在虚函数就会出现虚指针vptr指向虚函数所在位置vtbl 将vptr实现vtbl内容翻译为C ...

  10. 使用springboot上传文件至nginx代理服务器

    nginx配置图片服务器 server { listen 8001; server_name image.xxx.com; proxy_set_header X-Forwarded-Host $hos ...