MySQL二进制日志

简介

二进制日志包含数据库的所有更改的记录,包括数据和结构,以及每个语句执行的时间。它由一组二进制日志文件和索引组成。
这意味着将记录诸如CREATE,ALTER,INSERT,UPDATE和DELETE之类的语句,但不会记录对数据没有影响的语句,例如SELECT和SHOW。如果要记录这些(以性能为代价),请使用查询日志。
二进制日志以二进制文本格式存储,因此无法使用常规编辑器查看。需要用mysqlbinlog工具查看

二进制日志记录格式

二进制日志记录的格式有三种

  • 基于语句
    MariaDB 10.2.3之前的默认格式,基于语句的日志记录记录所有对表的数据或结构进行更改的SQL语句。
  • 基于行
    记录影响各个表行的事件
  • 混合
    MariaDB 10.2.4的默认格式。语句和基于行的日志记录的组合。在混合日志记录中,默认情况下使用基于语句的日志记录,但是当MariaDB确定语句对于基于语句的复制可能不安全时,它将使用基于行的格式。

相关的变量

binlog_format={STATEMENT|ROW|MIXED}

想象一种场景,如果一条SQL语句使用了now()函数,插入了当前时间,这时候如果根据SQL语句,这里的时间就会发生变化,而如果基于行的记录格式则数据不会发生变化,这里只是举例,可能不准确,因为插入now()会先将now()转换为当前时间再记录,这里只是为了更好理解

开启方式

在配置文件/etc/my.cnf中的mysqld配置段加入一行

log-bin=bin.log  #这里的bin.log为二进制日志文件名默认在MySQL的data目录下,也可以写绝对路径

这里会出现
可以看到多了两个文件一个是bin.index是二进制的索引文件,而bin后面有一串数字的就是二进制日志了。因为这里配置的时候写了文件的扩展名(.log)这时候默认会被忽略这个扩展名。
每次服务器启动,刷新日志或者达到了最大的大小(由max_binlog_size配置项确定)时,都会创建一个带有新扩展名的新二进制日志。

查看二进制日志

mysql> SHOW BINARY LOGS;
mysql> SHOW MASTER LOGS;

在这里插入图片描述

查看所有二进制文件以及文件大小
在这里插入图片描述

mysqlbinlog

简介

MySQL的二进制日志是一组包含“事件”的文件,表示对MariaDB数据库内容的修改。这些事件以二进制格式编写。该mysqlbinlog可以实用用于查看纯文本这些事件。

语法

shell> mysqlbinlog [options] log_file ...

常用选项

  • -h, --host=name
    指定数据库服务器
  • -p[passwd], --password[=passwd]
    用于连接远程服务器的密码
  • -P num, --port=num
    连接数据库的端口
  • -S, --socket=name
    连接数据库的套接字文件
  • –start-datetime=datetime
    读取在这个日期时间之后的binlog
  • -j pos, --start-position=pos
    开始读取binlog的位置
  • –stop-datetime=name
    读取在这个日期时间之前的binlog
  • -u, --user=username
    连接数据库的用户名

示例

查看 /usr/local/mysql/data/bin.000001 日志
mysqlbinlog  /usr/local/mysql/data/bin.000001
从8215位置开始到7917位置结束,查看 /usr/local/mysql/data/bin.000001日志
mysqlbinlog --start-position=7917 --stop-position=8215 /usr/local/mysql/data/bin.000001  
查看2018-11-2 00:54:20这个时间开始的binlog
mysqlbinlog --start-datetime='2018-11-2 00:54:20'  /usr/local/mysql/data/bin.000001  

二进制日志事件格式

看先看一个事件示例

# at 8337
#181102  0:46:00 server id 1  end_log_pos 8458 CRC32 0x6a5e0f57 	Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1541133960/*!*/;
/*!40000 ALTER TABLE `toc` ENABLE KEYS */
/*!*/;
DELIMITER ;

事件的起始位置:# at 8337
事件发生的日期时间:#181102 0:46:00
事件发生的服务器id:server id 1
事件的结束位置:end_log_pos 8458
事件的类型:Query
事件发生时所在服务器执行此事件的线程的ID: thread_id=2
语句的时间戳与将其写入二进制日志文件中的时间差:exec_time=0
错误代码:error_code=0 表示没错误
事件内容:SET TIMESTAMP=1541133960/!/;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值