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