mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)

时间:2024-01-06 12:07:26

一.概述

二进制日志(binlog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但是不包括数据查询语句, 语句以"事件"的形式保存,它描述了数据的更改过程,此日志对灾难时的数据恢复起着极其重要的作用。

  1.1 日志的位置和格式
    在my.cnf中可以查看log-bin的位置,mysqld将包含所有更新数据的sql命令写入日志文件,位置如下图所示:
    mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
    下面通过环境变量来查看当前binlog位置和状态

-- 通过环境变量来查看位置
SHOW VARIABLES LIKE '%log_bin%'

    mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
    下面查询所有binlog日志文件
    mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)

    上图中mysql-bin.index是日志的索引文件,记录了最大的日志序号。

  1.2 日志的读取 

    由于日志以二进制方式存储,不能直接读取,需要用mysqlbinlog工具来查看。在33篇里有讲到开启binlog以及查看内容,这里不在详述。
       https://www.cnblogs.com/MrHSR/p/9555313.html

  1.3  日志的删除
              对于繁忙的事务处理系统,每天会生成大量日志内容,日志如果长时间不清除,将会对磁盘空间带来很大的浪费,因此定期删除日志是DBA维护mysql数据库的一个重要工作内容,下面介绍几种方法。    

    (1)  执行sql 的reset master; 命令,该命令将删除所有binlog日志,新日志编号从000001开始。请谨慎使用此语句,以确保不会丢失二进制日志文件数据。特别是在主从库上,导致日志不同步报错。清空所有日志如下:
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
    (2) 使用purge以日志编号为条件。例如:执行purge master logs to 'mysql-bin.000006'; 将删除06编号之前的所有日志,如下图所示:
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
    (3) 使用purge 以时间为条件。例如:执行purge master logs before '2018-09-06'; 删除9月6日之前的所有日志,如下图所示:
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
    (4) 使用expire_logs_days
      此参数设置在my.cnf中,是用来设置日志的过期天数,过了指定的天数后日志将会自动删除,这样有利于减少DBA的管理的工作量。如下所示:
      注意在my.cnf中参数如果设置错误。例如设置成expire_logs_day=1。 在重启mysql服务器,进程将启动失败,如下图所示:
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
      在my.cnf中设置,重新启动mysql服务 如下图所示:
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)

-- 通过环境变量来查看位置
SHOW VARIABLES LIKE '%expire_logs_days%'

      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)

      现来查看日志,重启服务后日志只保留了一天,也就是今天9月7日的日志。如下图所示:
      mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)