MySQL | binlog介绍

什么是binlog

binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记录。

简单来说:binlog是一个二进制文件,记录MySQL所有数据的变更,以二进制的形式存储在磁盘上

默认情况下,binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看。

一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。
二进制有两个最重要的使用场景:

1、MySQL Replication在Master端开启binlogMaster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。


//图片来自网络

主库有一个log dump线程,将binlog传给从库
从库有两个线程,一个I/O线程,一个SQL线程,I/O线程读取主库传过来的binlog内容并写入到relay log,SQL线程从relay log里面读取内容,写入从库的数据库。

2、通过使用mysqlbinlog工具来使恢复数据。

二进制日志包括两类文件:

1、二进制日志索引文件(文件名后缀为.index):
用于记录所有的二进制文件
2、二进制日志文件(文件名后缀为.00000*):
记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

binlog的作用

当有数据写入到数据库时,还会同时把更新的SQL语句写入到对应的binlog文件里,这个文件就是上文说的binlog文件。使用mysqldump备份时,只是对一段时间的数据进行全备,但是如果备份后突然发现数据库服务器故障,这个时候就要用到binlog的日志了。

开启binlog

在mysql的配置文件my.cnf中,增加log_bin参数即可开启binlog日志,也可以通过赋值来指定binlog日志的文件名,实例如下:

vi编辑打开mysql配置文件
# vi /usr/local/mysql/etc/my.cnf
在[mysqld] 区块
设置/添加 log-bin=mysql-bin  确认是打开状态(值 mysql-bin 是日志的基本名或前缀名);

重启mysqld服务使配置生效
# pkill mysqld
# /usr/local/mysql/bin/mysqld_safe --user=mysql &

binlog有三种模式:ROW(行模式), Statement(语句模式), Mixed(混合模式)

ROW(行模式):

记录那条数据修改了,注意:记录的是这条记录的全部数据,即使只更新了一个字段,binlog里也会记录所有字段的数据

  1. 优点:
    他不记录sql语句的上下文信息,日志内容会非常清楚的记录每条数据详细的变更细节,即使只更新了一个字段,binlog里也会记录所有字段的数据。
  2. 缺点:
    binlog日志会非常大,mysql主从同步时,会产生大量磁盘IO

Statement(语句模式):

每一条会修改数据的sql都会记录在binlog中。

  1. 优点:
    不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
  2. 缺点:
    由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题。

Mixed(混合模式):

在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

查看binlog

1、查看mysql的binlog模式

show variables like ‘binlog_format’

2、查看mysql是否开启binlog同步功能

show variables like ‘log_bin’;

binlog相关命令

1.查看所有binlog日志列表

mysql> show master logs;

2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值

mysql> show master status;

3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件

mysql> flush logs;

注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4.重置(清空)所有binlog日志

mysql> reset master;

5.# 查看指定binlog文件内容, 如:查看mysql-bin.000002文件内容

show binlog events ‘mysql-bin.000002’;

如何配置binlog

[root@db02 ~]# mkdir /application/mysql/logs
[root@db02 ~]# chown -R mysql.mysql /application/mysql/logs
开启binlog
编辑/etc/my.cnf
[mysqld]
log_bin = /application/mysql/logs/dadong-bin
重启:/etc/init.d/mysqld restart
[root@db02 ~]# ll /application/mysql/logs/
total 8
-rw-rw---- 1 mysql mysql 120 Jun 21 12:04 dadong-bin.000001
-rw-rw---- 1 mysql mysql  42 Jun 21 12:04 dadong-bin.index

如何刷新

每天晚上0点备份数据库
mysqldump -A -B -F >/opt/$(date +%F).sql
[root@db02 ~]# ll /application/mysql/logs/
-rw-rw---- 1 mysql mysql 168 Jun 21 12:06 dadong-bin.000001
-rw-rw---- 1 mysql mysql 168 Jun 21 12:06 dadong-bin.000002
-rw-rw---- 1 mysql mysql 210 Jun 21 12:07 dadong-bin.index
提示:每个库刷新一次.

mysql工具mysqlbinlog常用参数

在这里插入图片描述
例子:

例:mysqlbinlog -d dadong dadong-bin.000001 dadong-bin.000002 -r bin.log   ##利用mysqlbinlog解析binlog文件到bin.log中。
利用mysqlbinlog  -d参数详解指定库的binlog日志
-d 指定解析dadong数据库,
-r 接卸成sql语句,指定生成的文件

mysqlbinlog可以指定-d实现分库导出binlog,如果使用-d参数,那更新数据时,必须有use库名,才能分出指定库的binlog,列如,写入数据库的语句必须采用下面写法:

use  daong;
insert into test values(1,'dongdong')

获取binlog内容

  1. 按照位置截取binlog内容

按照位置截取binlog内容的优点是精确,但是要花费时间选择位置,例如:要截取dadong-bin.000009文件从位置365到位置465的日志,命令如下:

[root@DB02 ~]# mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=465 -r pos.sql
提示:开始位置必须存在binlog里,结尾位置点可以不存在。
若指定了开始位置,不指定结束位置,则会截取开始处到结尾的binlog日志:
mysqlbinlog dadong-bin.000009 --start-position=365  -r pos.sql
若指定了结束位置,不指定开始位置,则截取最开始到最后面的全部binlog日志:
mysqlbinlog dadong-bin.000009  --stop-position=465 -r pos.sql
所谓的位置点,就是mysqlbinlog解析文件里的不同行行首的“#at 数字”标识的数据。
mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql

mysqlbinlog dadong-bin.000005 --start-position=2265 --stop-position=2552 -r pos.sql
mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql
mysqlbinlog dadong-bin.000009 --start-position=365 -r pos.sql
mysqlbinlog dadong-bin.000009 --stop-position=456 -r pos.sql
截取部分binlog根据pos
mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql
mysqlbinlog dadong-bin.000009 --start-position=365 -r pos.sql
mysqlbinlog dadong-bin.000009 --stop-position=456 -r pos.sql

截取部分binlog根据时间
mysqlbinlog dadong-bin.000009 --start-datetime='2014-10-16 17:14:15' --stop-datetime='2014-10-16 17:15:15' -r time.sql
mysqlbinlog dadong-bin.000009 --start-datetime='2014-10-16 17:14:15'  -r time.sql
mysqlbinlog dadong-bin.000009  --stop-datetime='2014-10-16 17:15:15' -r time.sql
  1. 按时间位置截取binlog内容

通过时间参数截取部分binlog:

--start-datetime=‘2017-10-16 17:14:25’ --stop-datetime=‘2017-10-16 17:18:30’

猜你喜欢

转载自blog.csdn.net/weixin_41593408/article/details/86299907