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




