MySQL日志篇,MySQL日志之binlog日志,binlog日志详解

MySQL日志篇,MySQL日志之binlog日志,binlog日志详解多少啊

视频地址 https://www.bilibili.com/video/BV1oT4y1o7TW

一、描述

binlog 二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。

二、常用操作

2-1、docker里面无法使用 vim、常用命令问题解决

https://blog.csdn.net/Tomwildboar/article/details/

https://blog.csdn.net/KwaiSZ/article/details/

2-2、开启 binlog

查看是否开启binlog日志 show variables like 'log_%';

在这里插入图片描述
my.cnf 里面加上配置如下配置,重启mysql。

一般来说 my.cnf 在:/etc/mysql/my.cnf/etc/my.cnf

# binlog存储的位置 log-bin=/var/lib/mysql/mysql-bin # 日志过期时间 expire_logs_days=30 # 不加这个启动会报错 server-id= 

如果你启动的时候因为配置文件修改错了,导致无法启动,可以参考这个解决: Mac下docker里面的MySQL无法启动,Mac进入docker(修改配置文件导致无法启动)

查看binlog其它的配置文件 show cc like 'binlog%';
在这里插入图片描述





2-3、binlog查看乱码的问题

在这里插入图片描述
上面框起来的就是binlog日志(你可以先对表进行一些增删改操作),但是我们使用 vim打开发现全是乱码
在这里插入图片描述
其中标记的部分并非是乱码,而是经由 base64 编码之后的结果,可以在通过 mysqlbinlog 查看 binlog 日志时添加参数进行解码






mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000007 

在这里插入图片描述

2-4、binlog 编码格式

我们可以使用 show variables like 'binlog_format'; 来查看默认的编码格式

2-4-1、statement 基于SQL语句的复制(statement-based replication, SBR)

每一条会修改数据的sql语句都会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。

在配置文件里面加入配置 binlog_format=statement,然后重启服务。

执行下面的语句

CREATE TABLE `my_test`.`xdx_test` ( `name` varchar(255) NOT NULL, `age` int(0) NOT NULL, `birthday` datetime NOT NULL ) insert into xdx_test (name,age,birthday) values ('xdx',18, now()); 

然后我们在打开最新的binlog日志,可以在里面找到上面的语句。

但就如同上面的 insert 语句,我使用了 now(),这个函数,如果用这个binlog语句去进行备份、同步那么时间字段就对不上了。

2-4-2、row 基于行的复制(row-based replication, RBR)

不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发或 now() 无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。

修改配置文件为 binlog_format=row ,然后重启服务器即可开启。

2-4-3、mixed 混合模式复制(mixed-based replication, MBR)

以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

修改配置文件为 binlog_format=mixed ,然后重启服务器即可开启。

2-5、通过binlog恢复数据

2-5-1、准备数据

在操作之前,我们先执行 flush logs; 开启一个新的 binlog日志,方便后面处理。

建表

CREATE TABLE `xdx_test` ( `id` int(1) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', `name` varchar(255) NOT NULL COMMENT '名称', `age` int(11) NOT NULL COMMENT '年龄', `birthday` datetime NOT NULL COMMENT '生日' , PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

添加数据

insert into xdx_test (name, age, birthday) values ('111',111,now()); insert into xdx_test (name, age, birthday) values ('222',222,now()); 

查看数据

在这里插入图片描述

这里我们删掉 id=1 的数据 delete from xdx_test where id = 1;,用来模拟异常情况数据丢失,然后我们再来恢复它。

2-5-2、恢复数据

2-5-2-1、开启新的日志

执行命令 flush logs 开启新的日志记录,这样我们就不会收到后面操作的干扰。

2-5-2-2、找到我们要操作的日志

这里我要操作的日志是 mysql-bin.000013

执行命令查看日志结构 show binlog events in 'mysql-bin.000013';

在这里插入图片描述

2-5-2-3、使用 pos 恢复数据

从上面的图,我们可以看到pos的开始和结束的位置,我们可恢复此阶段的数据

# 进入到 binlog 目录下 cd /var/lib/mysql # 数据恢复命令 mysqlbinlog --start-position=开始的pos --stop-position=结束的pos --database=要操作的数据库 binlog的名称 | mysql -u登陆名 -p登陆密码 -v 要操作的数据库 # 最终执行命令(我的) mysqlbinlog --start-position=669 --stop-position=980 --database=my_test mysql-bin.000013 | mysql -uroot -p -v my_test 

再次进入数据库,查询,发现数据有了

2-5-2-4、使用时间恢复数据

使用命令查看binlog日志 mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000013

数据比较多,这里我只截图需要的部分

在这里插入图片描述

mysqlbinlog --start-datetime='2021-10-14 12:47:12' --stop-datetime='2021-10-14 12:52:40' --database=my_test mysql-bin.000013 | mysql -uroot -p -v my_test

2-N、其他

2-N-1、binlog 文件大小

可以使用命令来查看binlog 单个文件大小,默认是1G,如果超过了1G就会新增一个文件 show variables like 'max_binlog_size';

在这里插入图片描述

注: 当你重启MySQL的时候,就会新增一个新的 binlog 文件

2-N-2、过期删除

前面也说了,我们可以使用 expire_logs_days=30 来配置日志保存时间,我们最好不要自己去删除binlog日志,这样会导致过期删除出错,如果非要删除,要记得更新一下 xxxxx.mysql-bin.index

2-N-3、其它命令

  • 查看全部的日志 show master logs;
  • 查看日志的最后一次操作 show master status;
  • 刷新binlog日志,也就是新开启一个日志文件 flush logs (这个在恢复数据的时候很有用)

2-N-4、 sync_binlog

sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。

sync_binlog=1,强一致,每次事物提交都进行磁盘同步。

sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘

参考文章

https://www.cnblogs.com/xingyunfashi/p/8431780.html

https://www.cnblogs.com/YCcc/p/10825870.html


























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210628.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:13
下一篇 2026年3月19日 上午7:14


相关推荐

  • gpt分区无法安装win10怎么办

    gpt分区无法安装win10怎么办

    2026年3月16日
    3
  • 保姆级教程 | Navicat 配置豆包 AI 助手

    保姆级教程 | Navicat 配置豆包 AI 助手

    2026年3月12日
    2
  • pycharm 远程调试docker 中的Python脚本

    pycharm 远程调试docker 中的Python脚本一 远程服务器以及 docker 配置 ssh1 原理将 docker 中的 ssh 端口 22 映射到服务器中的某一个端口 例如 9999 本地使用 docker 的用户名和密码登录 9999 端口 也就登录了相应的 docker2ssh 配置步骤运行 docker 镜像 并且指定相应的端口映射关系 NV GPU 5nvidia dockerrun tinamemy tensorflow1 9 py3

    2026年3月27日
    2
  • CLAHE的实现和研究

    CLAHE的实现和研究CLAHE 的实现和研究 CLAHE 算法对于医学图像 特别是医学红外图像的增强效果非常明显 CLAHE nbsp https en wikipedia org wiki Adaptive histogram equalization 中文方面非常好的资料限制对比度自适应直方图均衡化算法原理 实现及效果在 OpenCV 中已经实现了 CLAHE 但是它在使用过程中 存在参数选择的问题 为了从根本上搞明白 我参考了网络上的一些代码主要是来源 http blog csdn net abcd19

    2025年10月18日
    7
  • 数字图像处理(17): 直方图均衡化处理

    数字图像处理(17): 直方图均衡化处理目录 1 直方图均衡化简介 1 1 直方图均衡化概念 1 2 直方图均衡化的理论基础 1 3 直方图均衡化的步骤 1 4 直方图均衡化应用场景 2 直方图均衡化 equalizeHist 3matplotlib pyplot subplot 函数 4matplotlib pyplot imshow 函数 5 直方图均衡化对比参考资料 1 直方图均衡

    2026年3月26日
    3
  • sigprocmask sigaction

    sigprocmask sigaction sigprocmask:用于随时添加信号屏蔽字;sigaction :signal增强版本,当处理信号时,可以随意添加信号屏蔽字sigset_tnewmask,oldmask,pendmask;signal(SIGINT,sig_handler);sigemptyset(&newmask);sigaddset(&…

    2022年5月26日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号