一、什么是二进制日志

二进制日志主要记录mysql数据库的变化,二进制日志包含所有更新了数据或者潜在更新了数据(如没有匹配到任何行的delete语句),语句以时间的形式保存,描述了数据的更改。二进制日志还包含执行每个更新数据库语句的时间信息,使用二进制日志的主要目的是最大可能的恢复数据库。因为二进制日志包含备份后进行的所有更新,不记录没有修改任何数据的语句。

开启二进制日志对性能的开销很小,带来的好处远大于坏处

二、开启和设置二进制日志

1、默认情况下二进制日志是关闭的,通过配置文件来启动和设置二进制日志。修改my.cng,插入如下内容,然后重启mysqld服务。

server-id = 1                                       # mysql5.7必须加,否则mysql服务启动报错
log-bin = /data/3306/tmp/binlog/mysql-bin # 路径及命名,默认在data下
expire_logs_days = 10 # 过期时间,二进制文件自动删除的天数,0代表不删除
max_binlog_size = 100M # 单个日志文件大小

2、通过show variables like 'log_bin%'查看二进制日志设置

mysql> show variables like 'log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_basename | /data/3306/tmp/binlog/mysql-bin |
| log_bin_index | /data/3306/tmp/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+---------------------------------------+

3、查看当前服务器所有的二进制日志文件 show binary logs  /  show master logs

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 732 |
+------------------+-----------+

4、查看当前二进制日志状态  show master status

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 732 | | | |
+------------------+----------+--------------+------------------+-------------------+

三、二进制日志切换方法

每次重启MySQL服务也会生成一个新的二进制日志文件,相当于二进制日志切换。切换二进制日志时,你会看到这些number会不断递增。另外,除了这些二进制日志文件外,你会看到还生成了一个DB-Server-bin.index的文件,这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。

执行 flush logs 可以刷新切换二进制文件

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 732 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec) mysql> flush logs;
Query OK, 0 rows affected (0.00 sec) mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

四、二进制文件的查看

1、使用show binlog events 可以获取当前及指定日志  show binlog events 'mysql-bin.000002'   from 639(只产看639)

mysql> show binlog events;
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | |
| mysql-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 219 | Query | 1 | 291 | BEGIN |
| mysql-bin.000001 | 291 | Table_map | 1 | 350 | table_id: 108 (test.t_count) |
| mysql-bin.000001 | 350 | Write_rows | 1 | 412 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000001 | 412 | Xid | 1 | 443 | COMMIT /* xid=5 */ |
| mysql-bin.000001 | 443 | Anonymous_Gtid | 1 | 508 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 508 | Query | 1 | 580 | BEGIN |
| mysql-bin.000001 | 580 | Table_map | 1 | 639 | table_id: 108 (test.t_count) |
| mysql-bin.000001 | 639 | Write_rows | 1 | 701 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000001 | 701 | Xid | 1 | 732 | COMMIT /* xid=7 */ |
| mysql-bin.000001 | 732 | Rotate | 1 | 779 | mysql-bin.000002;pos=4 |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+

2、打印二进制日志到一个明文文件,该文件记录的更新了数据的sql,但是在5.7以上已经被加密

mysqlbinlog /data/3306/tmp/binlog/mysql-bin.000001 > mysql-bin.log                                  # 打印日志文件
mysqlbinlog --base64-output=decode-rows -v /data/3306/tmp/binlog/mysql-bin.000001 > binlog.sql # 解密文件
#  截取的部分日志内容,可以看到insert语句
BEGIN
/*!*/;
# at 580
#181215 11:12:03 server id 1 end_log_pos 639 CRC32 0xc66c75c3 Table_map: `test`.`t_count` mapped to number 108
# at 639
#181215 11:12:03 server id 1 end_log_pos 701 CRC32 0xf8a50341 Write_rows: table id 108 flags: STMT_END_F
### INSERT INTO `test`.`t_count`
### SET
### @1=533500356
### @2='W3V'
### @3='fg8rVMuT0'
### @4='2018:08:28'
### @5='2016-08-12 15:36:09'
# at 701
#181215 11:12:03 server id 1 end_log_pos 732 CRC32 0xc42a0c0d Xid = 7
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;

五、二进制日志的删除

1、reset mstaer 可以删除所有日志文件 (不存在主从复制关系),执行完该语句,所有二进制日志被删除。mysql重新创建二进制日志,编号从000001开始

2、purge master logs语句删除指定日志文件

purge binary logs to 'DB-Server-bin.000002';                      # 删除该日志文件之前的所有日志文件
purge binary logs before '2017-03-10 10:10:00';                   # 清除该时间点以前的所有日志文件
purge master logs before date_sub( now( ), interval 7 day);       # 清除7天前的日志文件

六、使用二进制日志恢复数据库

如果开启了二进制日志,出现了数据丢失,可以通过二进制日志恢复数据库,语法如下

mysqlbinlog [option] filename | mysql -u user -p passwd

option的参数主要有两个 --start-datetime  --stop-datetime 和 start-position  --stop-position ,前者指定恢复的时间点,后者指定恢复的位置(位置指的是二进制文件中 # at 580  580就是位置)。原理就是把记录的语句重新执行了一次,如果恢复了两次。会产生重复数据。

mysqlbinlog --start-position="291" --stop-position="439" /data/3306/tmp/binlog/mysql-bin.000001 | mysql -uroot -p111111

注意,要找到插入更新的语句所在的时间点或位置。如果恢复的语句包含只有delete,会报错1032错误。

七、暂时停止二进制日志功能

可以通过修改配置文件停止二进制日志功能,但是需要重启数据库,mysql提供了语句可以在线停止二进制功能

set sql_log_bin = 0       # 停止二进制日志功能
set sql_log_bin = 1 # 开启二进制日志功能

八、二进制日志的三种模式

二进制日志三种格式:STATEMENT,ROW,MIXED,由参数binlog_format控制

1、STATEMENT模式(SBR)
每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况(如非确定函数)下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)

2、ROW模式(RBR)
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。

3、 MIXED模式(MBR)
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式

mysql二进制日志详解的更多相关文章

  1. mysql日志管理#二进制日志详解

    查看MySQL二进制文件中的内容有两种方式 mysqlbinlog SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row ...

  2. Mysql Binlog日志详解

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

  3. Mysql general_log 日志详解

    开启 general log  将所有到达MySQL Server的SQL语句记录下来. 一般不会开启开功能,因为log的量会非常庞大.但个别情况下可能会临时的开一会儿general log以供排障使 ...

  4. MySQL日志文件之错误日志和慢查询日志详解

    今天天气又开始变得很热了,虽然很热很浮躁,但是不能不学习,我在北京向各位问好.今天给大家分享一点关于数据库日志方面的东西,因为日志不仅讨厌而且还很重要,在开发中时常免不了与它的亲密接触,就在前几天公司 ...

  5. MySQL数据库优化详解(收藏)

    MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * ...

  6. (转)MySQL备份原理详解

    MySQL备份原理详解 原文:http://www.cnblogs.com/cchust/p/5452557.html 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之 ...

  7. MySQL数据库备份详解

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  8. 【转】Nginx+php-fpm+MySQL分离部署详解

    转:http://www.linuxidc.com/Linux/2015-07/120580.htm Nginx+php-fpm+MySQL分离部署详解 [日期:2015-07-26] 来源:Linu ...

  9. Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

随机推荐

  1. Android内核栈溢出与ROP(CVE-2013-2597)

    一.准备 由于内核栈不可执行(NX),栈溢出利用需用到ROP.简单回顾一下ARM ROP. 漏洞演示代码如下,网上随便找了个. char *str="/system/bin/sh" ...

  2. 数据库开启对sys用户的审计

    需求:客户想对数据库开启sys用户的审计功能,关闭其它用户的审计功能. 1)再一次巡检报告中,我们发现数据库版本11.2.0.4,开启审计功能,提供的建议如下,关闭审计alter system set ...

  3. maven工程的多环境配置方案(profile)

    前言: 写一篇水文来打发下时间吧^_^. 在应用开发中, 总会遇到开发/测试/预发布/线上环境, 其环境不同, 其具体的配置项也有所不同, 因此如何快速的切换各个环境配置, 进行打包配置, 成了一个小 ...

  4. MongDB篇,第一章:数据库知识2

    MongDB    数据库知识2 非关系型数据库和关系型数据库的比较1. 不是以关系模型构建数据结构,结构比较自由 不保证数据的一致性2. 非关系型数据库弥补了关系型数据库的一些不足,能 够在处理高并 ...

  5. tarfile — Read and write tar archive files

    参考: https://docs.python.org/2/library/tarfile.html http://www.jianshu.com/p/bbad16822eab #解压文件tarfil ...

  6. 百练6247-过滤多余的空格-2015正式B题

    B:过滤多余的空格 总时间限制: 1000ms 内存限制:  65536kB 描述 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格. 输入 一行,一个字符串(长度不超过200),句子的 ...

  7. 关于Adaboost——样本抽样的权值的实际意义

    看这篇文章的前提:已经看了PRML中的Adaboost的算法流程 看懂下面的内容必须牢牢记住:Adaboost使用的误差函数是指数误差 文章主要目的:理解样本抽样的权值是为什么那样变化的. 得出的结论 ...

  8. Unity打包/读取AssetBundle资源全教程

    Unity 资源AssetBundle打包 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar ...

  9. search的 制作

    <meta charset="utf-8">  <title>search的制作</title> <style type="te ...

  10. lecture4特征提取-七月在线-cv

    霍夫变换 http://blog.csdn.net/sudohello/article/details/51335237 http://blog.csdn.net/glouds/article/det ...