阅读binlog文档

This commit is contained in:
asahi
2024-09-18 23:55:23 +08:00
parent 1669041d56
commit db8d2ddeb5

View File

@@ -38,7 +38,45 @@ mysqld会在base name之后追加数字将其作为binlog的文件名称
如果在事务中写入大量数据那么binlog的大小可能会大于`max_binlog_size`因为同一个事务中的event只会被记录到一个binlog中不会写入到多个binlog中。
> #### binary log index
> 为了追踪当前mysql使用了哪些binary log文件mysqld创建了一个`binary log index`文件,其中包含了`binary log`文件的文件名。可以通过`--log-bin-index[=filename]`来指定`log index file`的名称。
#### binlog_checksum
默认情况下server在输出event到日志时会同时输出event的长度并且用event长度来校验是否输出正确。除此之外可以通过设置`binlog_checksum`来让server在输出event的同时输出event的checksum。在从binlog中read back时source默认会使用event length但是可以通过设置`source_verify_checksum`为启用来使用checksum。作为接收方的replica会校验从source接收到的event。
### binary log format
binary log中event目前支持三种格式
- row-based-logging
- statement-based-logging
- mixed-based-logging
### mysqlbinlog
当想要展示binary log文件中的内容时可以使用mysqlbinlog工具如果想要重新执行binlog中对应的statement该工具将十分有用。
```bash
mysqlbinlog /var/lib/mysql/binlog.000503 | less
```
通过上述命令可以查看binlog的内容。
可以通过如下命令来根据binlog内容更新数据库信息
```bash
mysqlbinlog log_file | mysql -h server_name
```
binary logging操作会在statement或transaction执行完成后立马被执行但是logging操作在`锁释放``commit提交`之前。这将会保证日志将会按照commit的顺序来打印。
对非事务引擎不支持事务的表进行操作在执行后会立即将log打印到binary log file中。
对于事务的表例如innodb在一个尚未提交的事务中所有更新操作update/insert/delete将会被缓存直到执行commit操作。在执行commit前会将缓存中的整个事务都写入到binary log中。
### sync_binlog
默认情况下在每次写操作后binary log都会被同步到磁盘中sync_binlog为1。如果`sync_binlog`没有被启用并且系统发生宕机那么位于binary log末尾的statements可能会丢失。为了保证不发生binlog文件丢失的情况`sync_binlog`会设置每经过`N`次commit group之后将binary log同步到disk中。
在早期的mysql版本中即使将`sync_binlog`设置为1也有可能发生table content和binlog content不一致的情况。在使用innodb tables并且mysql server处理了commit statement那么其会将所有prepared transactions按顺序写入到binary log并将binary log同步到disk中并且提交innodb事务。
但是,在`同步binary log到disk``提交innodb事务`之间server有可能会宕机在server重启之后transaction会被回滚但是事务对应event已经被写入到了binary log中此时会发生binary log和table content不一致的情况。
上述情况在之前的mysql发行版中已经被解决只需启用XA两阶段事务即可。在mysql 8.4中innodb针对两阶段提交的XA事务支持一直是被启用的。
Innodb在XA事务中对两阶段提交的支持确保了binary log和innodb data files的一致性。在innodb隐式支持了XA两阶段事务之后如果sync_binlog被设置那么当server崩溃后重启时会对未提交事务做回滚同时会扫描binlog中最后的部分来收集`xid`从而计算出binary log file中的`最后有效位置`。mysql server会告知innodb完成所有写入到binary log中的prepared transactions并且将binary log file截取到最后有效位置。这将会保证table content和binary log的一致性。