Binlog

介绍

如其名:二进制日志类型:记录所有的除查询语句(Select、show等)外的DDL、DML语句等数据库操作语句。

二进制日志由包含“事件”的文件组成,这些文件描述了对数据库内容的修改。服务器以二进制格式写入这些文件。要以文本格式显示其内容使用 mysqlbinlog

用途

  • 主从复制:一主二从来举例:master节点开启binlog,master将binlog日志传递给二从(slaves)来实现主从数据同步。
  • 数据恢复:通过mysqlbinlog可实现数据恢复,这里我们侧重将这个。

数据格式

三种binlog格式

  • Statement :基于SQL语句的复制,每一条会修改数据的sql都会记录在binlog中。
  • Row :不记录sql语句上下文相关信息,仅保存哪条记录被修改。
  • Mixed: 一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

查看数据类型

show variables like 'binlog_format';

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据恢复



查看是否打开binlog

show variables like 'log_bin';

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_02



设置格式

格式示例在binlog操作中。



Liunx

位置

找到my.ini文件:

whereis my.ini



mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_binlog_03



添加:

binlog_format=ROW

或者MySQL中直接输入:

set globle binlog_format='MIXED'



windows

位置

my.ini位于:C:\ProgramData\MySQL\MySQL Server 5.6,而不是位于:C:\Program Files\MySQL\MySQL Server 5.6的my-default

# Binary Logging.
# log-bin
#文件名称
log_bin=mysql-bin	
binlog-format=Statement
server-id=1

也可以配置全路径:

log_bin=D:\mysql\binlog\mysql-bin



重启服务

win + r -> services.msc -> MySql56重启动服务

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_04



验证

show variables like 'log_%';
show variables like 'binlog_format';

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据库_05

在log_bin_basename目录下:

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_binlog_06



binlog操作

MySql中操作。



查看binlog文件

show binary logs;			//查看binlog文件列表
show master status;			//查看master节点上的binlog文件状态,使用哪个binlog文件
show master logs;			//查看master节点上的binlog文件列表

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_07

修改数据cstatus为2:

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_binlog_08

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据恢复_09



查看binlog事务记录

binlog存储的是MySQL的事务操作:

show binlog events;
show binlog events in 'mysql-bin.000001';

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_binlog_10



设置过期时间和文件大小

expire_logs_days=7
max_binlog_size=500M
show variables like 'expire_logs_days';

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_11



set global

通过MySQL中这是全局变量的形式修改配置参数:set global expire_logs_days=7

全局变量:服务器每次启动将为所有的全局变量赋初始值,即重启将变为无效设置。最好修改配置文件。



mysqlbinlog工具

在MySQL的安装bin目录(C:\Program Files\MySQL\MySQL Server 5.6\bin)下有mysqlbinlog工具:



查看binlog文件

Statement
mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 5.6\data\mysql-bin.000001"

直接通过mysqlbinlog看:

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysql_12

通过mysql内部命令看:

show binlog events in 'mysql-bin.000001';

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据库_13



查看Row格式

update->insert->delete。

我们可以看到,对比Statement,Row要多出一行表的信息。

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysql_14



Flush logs

Mysql中执行:

flush logs;

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据库_15

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据库_16

mysqlbinlog文件将形成并使用新的日志文件



mysqlbinlog工具实操

调用MySql安装的bin目录下的mysqlbinlog工具实操。

PS:加上指定的数据库:--database=cbry,截图里面第一次操作的时候默认模拟只操作了一个数据库。

小结:无论是:start-position stop-position 还是start-datetime stop-datetime,都是指定一个范围,而mysqlbinlog则是重复这个二进制binlog日志文件里面的位置(Pos)或者时间(datetime)。这里就确定了两个范围:文件、文件里的记录位置。指定后,重复操作范围内的操作,这就是mysqlbinlog的操作。

当你误删一条数据,利用二进制日志恢复的时候你需要寻找的是 创建数据的那个节点(时间)



查看当前使用binlog文件

show master status;

主节点使用了mysql-bin.000002日志文件。

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_17



数据库操作对呀binlog

我们将所有人的状态cstatus设置为1,再设置回2:

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据恢复_18

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysql_19

我们可以看到:

cid为1的cstatus修改为2的操作开始于位置:1187 - 1135。

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_20

恢复操作到 “截止时间” Pos(position 2096) 。

C:\Program Files\MySQL\MySQL Server 5.6\bin> 
mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 5.6\data\mysql-bin.000002" --stop-position 2096  --database=cbry | mysql -uroot -p

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据恢复_21

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_22

重新查看binlog:我们发现他逆操作(重新执行mysql-bin.00000二进制日志文件中第2096个位置前面的操作)回去了。

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysql_23



范围修改

重复执行范围内的操作

修改“李四”的cstatus:2->3->4->5

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysql_24

mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 5.6\data\mysql-bin.000004" --start-position 199 --stop-position 367  --database=cbry | mysql -uroot -p

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysql_25

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysql_26



删除李四(mysqlbinlog操作为重复操作验证)

直接执行上面的语句,并没有结果,佐证了前面的:范围操作只是重复执行操作而已。

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据库_27

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_binlog_28



start

mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 5.6\data\mysql-bin.000004" --stop-position 367  --database=cbry | mysql -uroot -p

无效

stop

mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 5.6\data\mysql-bin.000004" --stop-position 367  --database=cbry | mysql -uroot -p

无效



原因

这是因为之前的插入语句并没有在mysql-bin.000004中。

我们重新清空表数据并flush logs;。再插入,并修改张三的cstatus:2->3->4->5。然后通过操作来验证结果:mysqlbinlog就是重复执行范围内的操作

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_29



范围执行插入语句恢复

mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 5.6\data\mysql-bin.000005" --start-position 1184 --stop-position 1394  --database=cbry | mysql -uroot -p

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_binlog_30

start和stop不再演示,结果就是mysqlbinlog就是重复执行范围内的操作



将binlog日志转换为txt

主要是为了获取Pos,相当于:show binlog events in 'mysql-bin.000002';在MySQL外的文本化。

mysqlbinlog --start-datetime="2021-07-02 15:00:00" --stop-datetime="2021-07-02 17:00:00" --database=cbry "C:\ProgramData\MySQL\MySQL Server 5.6\data\mysql-bin.000002" > C:\Users\UserName\Desktop\mysql-bin.000002.txt

datetime而不是date(虽然也阔以):

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_数据恢复_31

mysql 主库配置高 还是 从库配置高 mysql 从库基于主库binlog恢复_mysqlbinlog_32



删表

如果通过drop table name;将表删除,要想恢复数据,必须建立一个表名、字段和数据类型相一致的空表,否则数据无法恢复,报表不存的错误。



参考

binlog介绍、日志格式、数据查看等

mysqlbinlog官网介绍

mysqlbinlog基于某个偏移量进行数据的恢复(重做),–start-position,–stop-position的使用方法

mysql数据库通过日志恢复数据