mysql的binlog与redo log

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

你可能感兴趣的:(mysql的binlog与redo log)