二进制文件(binlog)记录对MySQL数据库执行更改的所有操作,但不包括SELECT和SHOW这类操作,因为这类操作没有改变数据。

为什么会有binlog?

首先 binlog 是 Server 层的日志模块,最初设计来是为了归档(备份)使用的。经过多个版本的发展,现在 binlog 主要有三个作用:

  • 恢复:提供 point-in-time 的恢复功能。通过全备+binlog,可实现恢复到指定时间的数据库数据。
  • 复制:主备复制(同步)的基础模块,主库写 binlog,再发送给备库执行,实现主备数据一致性。
  • 审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

如何记录

下面以一条Update语句来介绍 binlog 是如何记录的。

mysql> update T set c=c+1 where ID=2;

  1. 取得 ID=2 这一行(通过内存或磁盘读取)
  2. 这行的 c 值加1
  3. 更新到内存
  4. 写入 redo log(处于 prepare 阶段)
  5. 写 binlog
  6. 提交事务(处于 commit 状态)

这里涉及两阶段提交和 redo log 的内容,感兴趣的移步到此处

binlog 的写入时机是在数据更改后,事务提交前。

三种写入格式

binlog_format=STATEMENT

binlog 记录逻辑SQL语句。

当执行以下命令:

mysql> delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1;

mysql> show binlog events in 'master.000001';

其中'master.000001'是binlog的文件名。

binlog 记录的内容如下图所示:

优点:省空间:只记录逻辑语句。

缺点:可能产生主备不一致。

mysql> delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1;

上面的SQL,假如在主库使用索引 a,而备库使用索引 t_modified 会导致删除的记录不一样。

binlog_format=ROW

binlog 记录表的行更改情况。配合 READ COMMITED,获得更好的并发性。

查看 binlog 内容:mysql> show binlog events in 'master.000001';(其中'master.000001'是binlog的文件名)

解析 binlog 内容:使用 mysqlbinlog 命名解析 binlog 内容。

liang24@ubuntu:~$ mysqlbinlog -vv data/master.000001 --start-position=8900;

优点:记录原始数据;保证主备一致性;

缺点:

1、费空间:因为要保存原始数据;

例如:删除十万行数据,STATEMENT 格式只记录逻辑语句,而 ROW 会记录十万条日志,相当费空间。

2、费IO

例如:删除十万行数据,ROW 会记录十万条日志,而写 binlog 会耗费一定的 IO。

推荐使用 binlog_format=ROW:能记录原记录数据。误操作时,能够根据原数据进行恢复,例如 Delete 就转写成 Insert,Update 就把 Update 前的再执行一次。

binlog_format=MIXED

因为 STATEMENT 和 ROW 各有优缺点,因此 MySQL 新增了一种格式 MIXED,采用折中方案,MySQL 会判断采用 STATEMENT 还是 ROW 来记录 binlog。

如何使用

1、查看是否开启

mysql 默认是不开启 binlog 的。

mysql> show variables like 'log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_basename | |
| log_bin_index | |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+-------+
5 rows in set (0.00 sec)

从结果看到 log_bin=OFF,知道没有开启 binlog。

2、开启 binlog 日志

退出 MySQL,使用 vi 编辑器修改 MySQL 的 my.cnf 配置文件(vim /etc/my.cnf)

# server-id:表示节点名称
server-id=1
# log-bin:表示存储binlog日志的目录和binlog的文件名
log-bin=/var/lib/mysql/mysql-bin

3、重启 MySQL 及查看 binlog 开启状态

service mysql restart

登录 MySQL,输入 show variables like '%log_bin%'; 查看到 binlog=ON ;

mysql> show variables like 'log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
5 rows in set (0.00 sec)

参考资料

MySQL二进制文件(binlog)的更多相关文章

  1. 【转】【MySQL】mysql 通过bin-log恢复数据方法详解

    mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了. 具体的操作是通过mysqlbinlog这 ...

  2. MySQL的binlog数据如何查看

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 ...

  3. 解说mysql之binlog日志以及利用binlog日志恢复数据

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...

  4. 不小心删除数据--利用MySQL的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  5. mysql之binlog

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

  6. MySQL的binlog恢复(Windows下)

    前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...

  7. Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  8. MySQL的binlog日志<转>

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

  9. MySQL 二进制文件恢复

    先不说话  先来一段代码块 mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name ...

随机推荐

  1. 使用Asponse.Words处理Word模板

    一.客户需求 近期接到一个项目,在与客户初步沟通后,客户描述的需求听起来也非常简单,就是目前客户需要在Excel录入数据,然后把这些数据分别复制到多个Word的多个地方,除了单个值之外,还需要复制表格 ...

  2. 分布式文档存储数据库之MongoDB基础入门

    一.MongoDB简介 MongoDB是用c++语言开发的一款易扩展,易伸缩,高性能,开源的,schema free 的基于文档的nosql数据库:所谓nosql是指不仅仅是sql的意思,它拥有部分s ...

  3. 「SCOI2012」喵星球上的点名

    「SCOI2012」喵星球上的点名 先咕着,扔个code跑路 code #include<bits/stdc++.h> #define vec vector #define iter it ...

  4. Python图书管理系统

    图书管理系统 功能简介 添加图书时,图书ID不能重复,图书名可重复 删除,查询,修改功能,输入图书名之后提供所有的同名的图书,用户可以按照图书序号对具体的一本书进行操作 显示书籍,分行显示,每行一本书 ...

  5. Layui弹出层详解

    今天空了学习一下弹出层 还是一步步展示把 首先,layer可以独立使用,也可以通过Layui模块化使用.我个人一直是用的模块化的 所以下面素有的都是基于模块化的. 引入好相关文件就可以开始啦  今天放 ...

  6. js给多级复杂动态变量赋值

    1 function SetVal(field, val) { 2 var arr = field.split("."); 3 var str = arr[0]; 4 if (wi ...

  7. Electron入门指北

    最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...

  8. python之《set》

    set 是python里面的集合的概念 list_1 = [1,2,3,4,5,6,] list_2 = set(list_1) print(list_1,type(list_1)) print(li ...

  9. java1.8安装及环境变量配置

    一.前言 虽然jdk1.9版本已经问世,但是许多其他的配套设施并不一定支持jdk1.9版本,所以这里仅带领你配置jdk1.8.而jdk1.9的操作也几乎是相同的. 本教程适用于windows10 64 ...

  10. 预估Ceph集群恢复时间

    一.前言 本章很简单,就是预估集群恢复的时间,这个地方是简单的通过计算来预估需要恢复的实际,动态的显示 二.代码 #!/usr/bin/env python # -*- coding: UTF-8 - ...