(一)什么是二进制日志

二进制日志(binlog)记录了数据库中所有的DDL和DML操作,但是不包括select语句,语句以“事件”的形式保存,记录了数据库的更改变化,在主从复制(replication)和数据恢复中起着重要的作用。对比来看,MySQL的二进制日志作用相当于Oracle数据库的redo log + archive log。

(二)开启二进制日志及参数配置

二进制日志开启需要在配置文件里面配置相关参数,然后重启数据库,或者开启数据库的时候添加相关参数。主要参数如下:

(2.1)log_bin

该参数控制binlog文件存放的位置,用法log_bin=path/file_name。如果没有给出路径,则默认路径为数据文件存放地址(datadir),如果没有给出文件名称,默认文件名为“主机名-bin.num”。初始文件是hostname-bin-000001,每次启动MySQL服务或者刷新时,自动递增编号创建二进制日志文件。

(2.1)binlog_format

该参数控制二进制日志文件的格式,可选格式有:

  • STATEMENT:日志中记录的是执行的SQL语句,日志量小,但是复制会出现主从不一致的情况
  • ROW:日志记录每一行数据的变化,日志量大,好处是主从复制数据不会出现不一致的情况,推荐使用这种方式
  • MIXED:结合STATEMENT和ROW的日志格式。

(2.3)expire_logs_days

该参数控制二进制日志保留天数,过了指定的天数后,日志将会自动删除。

(2.4)max_binlog_size

该参数控制二进制日志文件的大小,当日志文件达到该参数指定的大小时,就会创建新的二进制日志文件。不过,实际上二进制日志文件可能会超过该值,比如当二进制日志快要写满时,执行一个超大事物,由于事物特性决定相关事件必须连续,这种情况下,事件必须写到同一个日志文件,就会出现日志大于 max_binlog_size值的现象。

(2.5)binlog_do_db

该参数控制要保存二进制日志的数据库,如果有多个数据库,需要多次使用该参数,不能使用逗号分隔。

(2.6)binlog_ignore_db

该参数控制要不保存二进制日志的数据库,如果有多个数据库,需要多次使用该参数,不能使用逗号分隔。

(2.7)sync_binlog

该参数控制二进制日志刷新到磁盘的频率,单位为秒(s)。

(2.8)server_id

如果要在MySQL5.7版本中开启binlog,必须设置该参数,否则实例无法启动。

一个简单的参数配置如图:


(三)二进制日志的作用

(3.1)复制

MySQL Master端的二进制日志发送到slave端,slave端根据日志进行重做,达到主从复制的目的。

(3.2)恢复

不管是使用mysqldump还是xtrabackup,我们都只能将数据库恢复到有备份的时刻,如果要将数据库恢复到任何时刻,则需要使用二进制日志。

(四)相关命令

(4.1)binlog清理

如果业务量较大,binlog日志增长很快,需要定期清理,有好几种方法可以清理日志。

方法1:执行“reset master”命令,该命令将删除所有的binlog日志,新日志编号从“000001”开始

  1. mysql> reset master;
  2. Query OK, 0 rows affected (0.00 sec)

方法2:执行“purge master logs to ‘hostname-bin.******’ ”命令,该命令将删除******之前的日志

  1. # 删除'master-bin.000007'之前的日志
  1.  
  1. [root@masterdb binlog]# ls -lrt
  2. total 36
  3. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000001
  4. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000002
  5. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000003
  6. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000004
  7. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000005
  8. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000006
  9. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000007
  10. -rw-r----- 1 mysql mysql 154 Feb 13 00:20 master-bin.000008
  11. -rw-r----- 1 mysql mysql 256 Feb 13 00:20 master-bin.index
  12. [root@masterdb binlog]#
  13.  
  14. mysql> purge master logs to 'master-bin.000007';
  15. Query OK, 0 rows affected (0.00 sec)
  16.  
  17. [root@masterdb binlog]# ls -lrt
  18. total 12
  19. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000007
  20. -rw-r----- 1 mysql mysql 154 Feb 13 00:20 master-bin.000008
  21. -rw-r----- 1 mysql mysql 64 Feb 13 00:22 master-bin.index

方法3:执行“purge master logs before‘yyyy-mm-dd hh24:mi:ss’ ”命令,该命令将删除指定日志之前的日志

  1. # 删除2020-02-13 00:24:00之前的日志
  2.  
  3. mysql> system ls -lrt /mysql/binlog
  4. total 36
  5. -rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000007
  6. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000008
  7. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000009
  8. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000010
  9. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000011
  10. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000012
  11. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000013
  12. -rw-r----- 1 mysql mysql 154 Feb 13 00:25 master-bin.000014
  13. -rw-r----- 1 mysql mysql 256 Feb 13 00:25 master-bin.index
  1. mysql> purge master logs before '2020-02-13 00:24:00';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> system ls -lrt /mysql/binlog
  5. total 32
  6. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000008
  7. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000009
  8. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000010
  9. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000011
  10. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000012
  11. -rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000013
  12. -rw-r----- 1 mysql mysql 154 Feb 13 00:25 master-bin.000014
  13. -rw-r----- 1 mysql mysql 224 Feb 13 00:29 master-bin.index

方法4:在配置文件中添加“expire_logs_days”参数,指定过期天数,到期会自动删除。

(4.2)binlog切换

可以使用flush logs或者flush binary logs切换日志。

  1. mysql> show master status;
  2. +-------------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +-------------------+----------+--------------+------------------+-------------------+
  5. | master-bin.000017 | 154 | db1,db2,db3 | db4 | |
  6. +-------------------+----------+--------------+------------------+-------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> flush logs;
  10. Query OK, 0 rows affected (0.00 sec)
  11.  
  12. mysql> show master status;
  13. +-------------------+----------+--------------+------------------+-------------------+
  14. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  15. +-------------------+----------+--------------+------------------+-------------------+
  16. | master-bin.000018 | 154 | db1,db2,db3 | db4 | |
  17. +-------------------+----------+--------------+------------------+-------------------+
  18. 1 row in set (0.00 sec)
  19.  
  20. mysql> flush binary logs;
  21. Query OK, 0 rows affected (0.00 sec)
  22.  
  23. mysql> show master status;
  24. +-------------------+----------+--------------+------------------+-------------------+
  25. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  26. +-------------------+----------+--------------+------------------+-------------------+
  27. | master-bin.000019 | 154 | db1,db2,db3 | db4 | |
  28. +-------------------+----------+--------------+------------------+-------------------+
  29. 1 row in set (0.00 sec)

(4.3)查看binlog events

  1. mysql> show binlog events in 'master-bin.000019';
  2. +-------------------+-----+----------------+-----------+-------------+---------------------------------------+
  3. | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
  4. +-------------------+-----+----------------+-----------+-------------+---------------------------------------+
  5. | master-bin.000019 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 |
  6. | master-bin.000019 | 123 | Previous_gtids | 1 | 154 | |
  7. +-------------------+-----+----------------+-----------+-------------+---------------------------------------+
  8. 2 rows in set (0.00 sec)

(4.4)查看当前biblog位置

  1. mysql> show master status;
  2. +-------------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +-------------------+----------+--------------+------------------+-------------------+
  5. | master-bin.000019 | 154 | db1,db2,db3 | db4 | |
  6. +-------------------+----------+--------------+------------------+-------------------+
  7. 1 row in set (0.00 sec)

相关文档集合:

1.MySQL日志--二进制日志(binlog)                  

2.使用mysqlbinlog查看二进制日志                  

3.MySQL使用mysqldump+binlog完整恢复被删除的数据库

4.使用binlog2sql工具来恢复数据库                 

5.MySQL闪回工具—MyFlash

MySQL日志--二进制日志的更多相关文章

  1. Mysql清理二进制日志的技巧

    1:二进制日志 二进制日志记录了所有的DDL(数据定义语言)语句和DML(数据操作语言)语句,但是不记录包括数据查询的语句.语句以"事件"的形式保存,它描述了数据的更改过程,此日志 ...

  2. 如何通过Mysql的二进制日志恢复数据库数据

    经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlo ...

  3. mysql学习------二进制日志管理

    MySQL二进制日志(Binary Log)   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库( ...

  4. MySQL使用二进制日志恢复数据库

    一.二进制日志简介 MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复. 在my.ini文件中设置了log-bin, ...

  5. mysql删除二进制日志文件

    一.RESET MASTER 这个语句可以验证首次配置主机备机是否成功.步骤如下: 1. 启动master和 slave,开启replication (即 复制) 注:replication (复制) ...

  6. mysql使用二进制日志恢复数据

    一.恢复到某个二进制文件 1.开启二进制日志 在mysqld的配置节点下添加如下配置 log-bin="E:/Mysql57BinLog/binlog"(windows下的路径,l ...

  7. MYSQL使用二进制日志来恢复数据

    mysqlbinlog工具的使用,大家可以看MySQL的帮助手册.里面有详细的用, 在这个例子中,重点是--start-position参数和--stop-position参数的使用. ·--star ...

  8. mysql学习------二进制日志

    一.什么是二进制日志 1.记录对数据发生或潜在发生更改的sql语句 2.二进制格式保存 3.用途广泛,包括 a.查看数据库变更历史 b.数据库增量备份 c.数据库灾难恢复 d.mysql replic ...

  9. MySQL日志——二进制日志

    Mac怎么这么坑呢,搞了2小时了.唉 先来一个简单的,挖好坑,明天解决. 终端进入mysql: mysql> set global general_log=on; 然后进行数据库的任意操作: 查 ...

随机推荐

  1. IOS 导航栏颜色 标题

    修改导航栏颜 #define COLOR_TOMATO    [UIColor colorWithRed:255/255.0f green:99/255.0f blue:71/255.0f alpha ...

  2. Java图形与文本(18)

    实例018  旋转图形 实例说明 本实例演示在Java中绘制图形时,如何对图形进行旋转.运行程序,单击窗体上的“顺时针”按钮,可以将图形顺时针旋转,效果如图1.18所示,用户还可以通过单击“逆时针”和 ...

  3. JavaScript 词法句法

    JavaScript 中的几个重要概念 JavaScript 遵循 ECMA-262 规范,目前其最新版是 ECMAScript 2018,而获得所有主流浏览器完全支持的则是 ECMAScript 5 ...

  4. 2018--Linux命令总结整理复习版

    一.ls命令: 用来显示目标列表,在Linux中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件. -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影 ...

  5. vue - 动态绑定 class

    <template>   <div class="todo-item" :class="{'is-complete':todo.completed}&q ...

  6. docker安装centos7镜像

    拉取centos7镜像[root@localhost ~]# docker pull centos:71启动镜像centos7,如果不指定 /bin/bash,容器运行后会自动停止[root@loca ...

  7. leetcode1 twoSum

    """ Given an array of integers, return indices of the two numbers such that they add ...

  8. emacs 配置文件目录

    在 windows 环境下,emacs 的配置目录可以通过下面几种方式来设置: If the environment variableHOME is set, use the directory it ...

  9. 初学者的困惑:OOP与一般编程的区别

    *在写<程序猿的思维修炼>随笔中,我们大概猜想到了,OOP的思想更趋于模块化,更独立,因此称为一个个对象,本次随笔将对OOP和一般编程的区别有更详细的解释 面向对象编程的含义: 面向对象编 ...

  10. mybatis插入数据后将其ID返回

    背景 mybatis没有关联保存的功能,所以主从表需要分开保存,这就涉及到主表保存后要再次获取主表ID的环节,以下介绍mybatis插入数据后返回其自增ID的两种方式 方案 1.sql获取 <i ...