暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL二进制日志(binlog)管理

原创 Asatinho 2021-04-09
1030

1.作用

数据恢复、主从复制中应用
主要记录数据库变化(DDL,DCL,DML)性质的日志,大部分记录的是SQL层的,逻辑性质的

2.配置方法

(在8.0之前默认不开启,建议是开启)

vim /etc/my.cnf

添加如下相关参数:
server_id=6 主机编号,主从中使用,5.7之后若开binlog必加此参数
log_bin=/data/binlog/mysql-bin 日志存放目录、日志名前缀,例如mysql-bin.000001,目录需提前建好,且有权限,一定要和数据目录所在盘分开
sync_binlog=1 binlog日志刷盘策略,双一中的第二个1,每次事务提交立刻刷写binlog日志到磁盘
binlog_format=row 目前版本默认值row,也是建议值,是binlog的记录格式
重启mysql生效

3.binlog记录内容详解

binlog是SQL层的功能,记录的是变更的SQL语句,不记录查询语句
①记录SQL语句种类
DDL:原封不动的记录当前DDL(statement语句方式)
DCL:原封不动的记录当前DCL(statement语句方式)
DML:只记录已经提交的事务DML(insert update delete)
②DML三种记录方式
binlog_format(binlog的记录格式)参数影响
statement(5.6默认)SBR(statement based replication):语句模式原封不动地记录当前DML
ROW(5.7默认)RBR(ROW based replication):记录实际开机的变化,用户看不懂,需要工具分析
mixed(混合)MBR(mixed based replication):混合模式,一般不用
区别:
statement:可读性较高,日志量少,但不够严谨,记录仅是一条语句
ROW:可读性很低,日志量大,但足够严禁,记录的是行变化,建议使用ROW模式
③event(事件)
概念:
二进制日志的最小记录单元
对于DDL,DCL,一个语句就是一个event
对于DML语句,只记录已提交的事务
组成:
事件开始标识
事件内容
事件结束标识
position:
开始标识如: at 194
结束标识如:end_log_pos 254
某个事件在binlog中的相对位置号
位置号作用是方便我们截取事件

4.binlog如何查看

查看位置:

select @@log_bin_basename;

查看是否开启:

select @@log_bin;

查看文件:
在linux下查看binlog存放目录即可

ls -l /data/binlog/

二进制内置查看命令:
查看当前有几个日志文件,一般mysql只用最新的日志文件:

show binary logs; 

查看当前在用的日志文件:

show master status;

查看事件内容:

show binlog events in 'myql-bin.000002'; 

show binlog events命令的格式:

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

说明:
(1)IN ‘log_name’:指定要查询的binlog文件名(如果省略此参数,则默认指定第一个binlog文件);
(2)FROM pos:指定从哪个pos起始点开始查起(如果省略此参数,则从整个文件的第一个pos点开始算);
(3)LIMIT【offset】:偏移量(默认为0);
(4)row_count:查询总条数(如果省略,则显示所有行)。

(当前在用的),使用频率较高
配合linux命令行使用:

mysql -uroot -p123456 -e "show binlog events in 'mysql-bin.000002'" |grep DROP

5.如何利用binlog文件进行数据恢复

相应事件查看

mysql -uroot -p123456 -e "show binlog events in 'mysql-bin.000002'" |grep DROP

内容查看

mysqlbinlog mysql-bin.000002 >/tmp/a.sql 导出到文件

再vim查看
重点关注内容# at 起始位置、#时间 end_log_pos、语句、# at 结束位置
注:如果想看DML语句

mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000002 >/tmp/b.sql

日志截取恢复

flush logs;  

滚动日志,刷出一个新的日志文件

show binary logs;  

查看二进制日志

数据恢复步骤:
①分析binlog

show master status;
show binlog events in 'mysql-bin.000005';

起点:找到建库语句位置点,发现起始为219(create的起始点)
终点:找到drop语句位置点,发现终点为1357(drop的起始点,不可为终点)
②之后截取日志:

mysqlbinlog --start-position=219 --stop-position=1357 /data/binlog/mysql-bin.000005 >/tmp/bin.sql

③进入mysql后

set sql_log_bin=0;  

(在此窗口临时关闭binlog记录,没有意义)

source /tmp/bin.sql
set sql_log_bin=1;   

注:截取日志可专门截取一个库的,例如只截取bindb库的:

mysqlbinlog -d bindb --start-position=219 --stop-position=1357 /data/binlog/mysql-bin.000005 >/tmp/bin.sql

注:终点一般是最后一个文件
起点需要找一下
这种跨文件的可以用时间维度进行截取,或者一半用datatime,一半用position号

mysqlbinlog --start-datetime=   --stop-datatime=   mysql-bin.000001  mysql-bin.000002

如果数据量过大只能配合备份一起恢复

6.binlog维护操作

日志滚动:
show binary logs; 查看binlog文件
flush logs; 手动触发滚动日志
或在linux命令行下

mysqladmin -uroot -p123 flush-logs 

也触发滚动日志
binlog大小限制,默认为1个G,达到此值后会自动滚动

select @@max_binlog_size;  

mysqldump -F 也会自动滚动
重启mysql也会自动滚动
日志删除:
谨记:不要使用rm命令删除,因为不是数据库行为,会造成一些异常
①自动删除:
select @@expire_logs_days; 默认是0,单位是天,代表永不删除
阈值设置多少天合适?
一般是设置刚好超过一个全备周期:7+1天,空间够的话生产数据库建议2个全备+1天
②手动删除

purge binary logs to 'mysql-bin.000006';  

删除到6为止,实际删1至5

reset master; 

全清空,编号也从1开始,此操作主从必宕,需要修复

获取binlog文件列表:
show binary logs;

基于时间点截取,以及查看具体sql内容参考文章:

https://blog.csdn.net/qq_44697035/article/details/102583859

mysqlbinlog --base64-output=decode-rows -v  --start-datetime="2021-11-15 9:00:00" --stop-datetime="2021-11-15 9:50:00" /binlog/mysqlbin.000095 |more > /tmp/both118.sql

例2

mysqlbinlog --verbose --base64-output=decode-rows -vv --database=your_database_name binlog-file-name

还可以对其进行进一步过滤,比如:

grep -B0 -A27 -w 'DELETE FROM `kdb`.`t_diag_reportinfo`' mydiag.sql >diagreportinfo.sql 

B即before,A即after,意思是取目标行前后多少行

在vim中过滤并打印到文件:

: 2, 200 w ./data_copy.csv
最后修改时间:2025-01-23 10:49:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论