Mysql的几种日志-面试专题

binlog

binlog记录数据库表结构和表数据变更,比如update/delete/insert/truncate/create,它不会记录select。存储着每条变更的SQL语句和XID事务Id等等。
binlog日志文件如下(使用mysqlbinlog工具时,要和Mysql版本对应):

[root@VM-8-16-centos data]# mysqlbinlog --no-defaults -vv binlog.000013
BINLOG '
MkfXZRMBAAAAWwAAAKJDBwAAAHMAAAAAAAEADnJ1b3lpLXZ1ZS1wbHVzAAl0ZXN0X2RlbW8ADggP
CAgDDw8DCBIIEggDCFAA/AP8AwAA/j8BAgAAAgHg2a4Ehw==
MkfXZR4BAAAAegAAABxEBwAAAHMAAAAAAAEAAgAO//8AGA4AAAAAAAAABjAwMDAwMGwAAAAAAAAA
AwAAAAAAAAAFAAAADADlrZDoioLngrkxMDAEADk5OTkBAAAAZwAAAAAAAACZsnqS2AEAAAAAAAAA
AAAAAOg53Xw=
'/*!*/;
### INSERT INTO `ruoyi-vue-plus`.`test_demo`
### SET
###   @1=14 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2='000000' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
###   @3=108 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @4=3 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @5=5 /* INT meta=0 nullable=1 is_null=0 */
###   @6='子节点100' /* VARSTRING(1020) meta=1020 nullable=1 is_null=0 */
###   @7='9999' /* VARSTRING(1020) meta=1020 nullable=1 is_null=0 */
###   @8=1 /* INT meta=0 nullable=1 is_null=0 */
###   @9=103 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @10='2024-01-29 09:11:24' /* DATETIME(0) meta=0 nullable=1 is_null=0 */
###   @11=1 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @12=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
###   @13=NULL /* LONGINT meta=0 nullable=1 is_null=1 */
###   @14=0 /* INT meta=0 nullable=1 is_null=0 */
# at 476188
#240222 21:08:02 server id 1  end_log_pos 476219 CRC32 0x6a536860       Xid = 238489
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

也可以通过Mysql客户端工具(如Navicat、Dbeaver)查看如:

SHOW BINLOG EVENTS

在这里插入图片描述
主要有两个作用:复制和恢复数据
【1】MySQL架构为了高可用性都是一主多从,从服务器需要与主服务器保持数据一致,这就是通过binlog进行复制;
【2】数据库的数据如果被误删,可以通过binlog数据进行恢复。
因为binlog记录了数据库表的逻辑变更,所以可以用binlog进行主从复制和恢复数据。

binlog日志的三种模式:

binlog日志的常见命令:

-- 查看Mysql是否开启binlog
SHOW VARIABLES LIKE 'log_bin';

在这里插入图片描述

-- 查看Mysql的binlog日志模式
show global variables like "binlog%";

在这里插入图片描述

1、Row Level:

记录的方式是行,即如果批量修改数据,记录的不是批量修改的SQL语句事件,而是每条记录被更改的SQL语句,因此,ROW模式的binlog日志文件会变得很“重”。
在这里插入图片描述

优点:

row level的binlog日志内容会非常清楚的记录下每一行数据被修改的细节。而且不会出现某些特定情况下存储过程或function,以及trigger的调用和触发器无法被正确复制的问题。

缺点:

row level下,所有执行的语句都记录到日志中的时候,都以每行记录的修改来记录,这样可能会产生大量的日志内容,产生的binlog日志量是惊人的。

2、Statement Level

记录每一条修改数据的SQL语句(批量修改时,记录的不是单条SQL语句,而是批量修改的SQL语句事件)。看上面的图解可以很好的理解row level和statement level两种模式的区别

优点:

statement模式记录的更改的SQL语句事件,并非每条更改记录,所以大大减少了binlog日志量,节约磁盘IO,提高性能。

缺点:

statement模式记录的更改的SQL语句事件,并非每条更改记录,所以大大减少了binlog日志量,节约磁盘IO,提高性能

3、Mixed:

前两种模式的结合。在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

企业场景如何选择binlog的模式

  • 如果生产中使用MySQL的特殊功能相对少(存储过程、触发器、函数)。选择默认的语句模式,Statement Level
  • 如果生产中使用MySQL的特殊功能较多的,可以选择Mixed模式。
  • 如果生产中使用MySQL的特殊功能较多,又希望数据最大化一致,此时最好Row level模式;但是要注意,该模式的binlog非常“沉重”。

更多日志类型

等待理解并实践过更新。。。

文章引用

https://it-blog-cn.com/blogs/db/replay.html#%E4%B8%80%E3%80%81binlog

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值