binlog和redolog的写入机制
分类:
文章
•
2024-05-29 10:42:40
binlog的写入机制
- 事务执行过程
- 先把日志写到binlog cache,事务提交时,从binlog cache写入到binlog文件里
- 事务无法被拆分,无论事务多大,都要保证一次写入
- 每个线程都有一个系统分配的binlog cache的大小,由binlog_cache_size控制,超过则写到磁盘中
- 多个binlog cache公用一个binlog文件,
- 从binlog cache到binlog文件有两个步骤
- write:把日志写到page cache,没有到磁盘,所以速度比较快
- fsync:把数据写到磁盘,占用IOPS
- write和fsync的时机是按照sync_binlog来控制的
- sync_binlog = 0;表示每次都write,不fsync
- sync_binlog = 1;表示每次都fsync
- sync_binlog = n(n>0),每次都write,n次write之后触发fsync(有可能丢失n次日志文件)
redo log的写入机制
redo log的三个状态:

- 存在进程内存中的redo log buffer中
- 写到磁盘write,但是还没持久化fsync,在文件系统的page cache
持久化到磁盘,对应的是hard disk
- 写入策略,innodb_flush_log_at_trx_commit参数设置
- 设置为0的时候,每次事务结束都只把日志写到redo log buffer
- 设置为2的时候,每次事务结束都写到文件系统的page cache
- 设置为1的时候,每次事务结束都持久化到磁盘
- innodb后台有个线程每隔1s都会被调用,把redo log buffer中的日志写到page cache,再写到磁盘,所以有可能还没提交事务的redo log 也会被写到磁盘中
- 如果redo log buffer的空间占用快要到innodb_log_buffer_size的一半时,会自动进行wirte,进入文件系统的page cache
- 如果并行的事务被提交,而且innodb_flush_log_at_trx_commit设置为1时,就会吧并行的未提交的事务日志存到文件里