前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试系列-binary log

面试系列-binary log

作者头像
用户4283147
发布2022-10-27 15:56:40
2320
发布2022-10-27 15:56:40
举报
文章被收录于专栏:对线JAVA面试对线JAVA面试

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

开启 binlog

show variables like 'log_%';

修改my.cnf,重启mysql服务

代码语言:javascript
复制
# binlog存储的位置
log-bin=/var/lib/mysql/mysql-bin
# 日志过期时间
expire_logs_days=30
# 不加这个启动会报错
server-id=123454

查看binlog其它的配置文件

binlog 日志打开乱码问题

mysqlbinlog 查看 binlog 日志时添加参数进行base64解码

代码语言:javascript
复制
mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000007

binlog三种编码格式

statement:基于SQL语句的复制(statement-based replication, SBR)

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

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

注意点:now(),这个函数,如果用这个binlog语句去进行备份、同步那么时间字段就对不上,主从复制时会导致主从节点中数据不一致(比如sleep(),now()等)。

row:基于行的复制(row-based replication, RBR)

不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发或 now() 无法被正确赋值的问题;

缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨;

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

mixed:混合模式复制(mixed-based replication, MBR)

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

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

通过binlog恢复数据

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

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

使用 pos 恢复数据
代码语言:javascript
复制
# 进入到 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 -p123456 -v my_test
使用时间恢复数据

mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000013;

代码语言:javascript
复制
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 -p123456 -v my_test

binlog 文件大小

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

sync_binlog-bin log刷盘策略

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 对线JAVA面试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开启 binlog
  • binlog 日志打开乱码问题
  • binlog三种编码格式
    • statement:基于SQL语句的复制(statement-based replication, SBR)
      • row:基于行的复制(row-based replication, RBR)
        • mixed:混合模式复制(mixed-based replication, MBR)
        • 通过binlog恢复数据
          • 使用 pos 恢复数据
            • 使用时间恢复数据
            • binlog 文件大小
            • sync_binlog-bin log刷盘策略
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档