binlog
Mysql Binlog是二进制格式的日志文件,用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复。
获取binlog日志列表
MariaDB [examples]> show master logs;
+-----------+-----------+
| Log_name | File_size |
+-----------+-----------+
| ON.000001 | 9893 |
+-----------+-----------+
可知当前只有一个binlog文件:ON.000001
MariaDB [examples]> show binary logs;
+-----------+-----------+
| Log_name | File_size |
+-----------+-----------+
| ON.000001 | 9893 |
+-----------+-----------+
1 row in set (0.134 sec)
查看examples.prefix
的表结构
MariaDB [examples]> show create table prefix \G;
*************************** 1. row ***************************
Table: prefix
Create Table: CREATE TABLE `prefix` (
`a` int(10) NOT NULL,
`b` int(10) NOT NULL,
`c` int(10) NOT NULL,
KEY `I_index` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
对全表进行更新操作
MariaDB [examples]> update prefix set b=a+101;
Query OK, 32 rows affected (0.201 sec)
Rows matched: 32 Changed: 32 Warnings: 0
可以看到有32条数据发生了更新
查看binlog(也可以在日志文件目录通过mysqlbinlog ON.000001
命令查看)
MariaDB [(none)]> show binlog events in 'ON.000001' \G;
...
...
...
*************************** 108. row ***************************
Log_name: ON.000001
Pos: 9893
Event_type: Gtid
Server_id: 1
End_log_pos: 9935
Info: BEGIN GTID 0-1-48
*************************** 109. row ***************************
Log_name: ON.000001
Pos: 9935
Event_type: Query
Server_id: 1
End_log_pos: 10031
Info: use `examples`; update prefix set b=a+101
*************************** 110. row ***************************
Log_name: ON.000001
Pos: 10031
Event_type: Xid
Server_id: 1
End_log_pos: 10062
Info: COMMIT /* xid=883 */
有很多条记录,本次更新操作增加了这三条数据,其中第109是我们显示执行的SQL,而第108与109条是事务的开始与结束。
关于Xid:
Binlog::GTID_EVENT:
A global transaction identifier (GTID)
开启事务
Binlog::QUERY_EVENT:
The query event is used to send text querys right the binlog.
mysql中create,insert,update,delete的Event_type
均为Query
类型,初看觉得很奇怪,这里只是类型定义而已。
Binlog::XID_EVENT:
Transaction ID for 2PC, written whenever a COMMIT is expected.
提交事务
看看官方对各个字段的解释
Log_name
The name of the file that is being listed.Pos
The position at which the event occurs.Event_type
An identifier that describes the event type.Server_id
The server ID of the server on which the event originated.End_log_pos
The position at which the next event begins, which is equal to Pos plus the size of the event.Info
More detailed information about the event type. The format of this information depends on the event type.
redo log
The redo log is a disk-based data structure used during crash recovery to correct data written by incomplete transactions
关于redo log,文件名前缀为ib_logfile
, 尝试用mysqlbinlog
读取
mysqlbinlog ib_logfile1
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
ERROR: File is not a binary log file.
google一圈,目前尚没发现有可以解析该类文件的工具,只能从文档中了解其具体结构。
后面有时间研究下源码,写个ib_logfile的解析器玩玩
参考:
- https://dev.mysql.com/doc/refman/5.7/en/innodb-redo-log.html
- https://dev.mysql.com/doc/internals/en/binlog-event-type.html
- https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html
- https://dev.mysql.com/doc/refman/5.7/en/innodb-redo-log.html