binlog和redolog的写入机制

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的三个状态:

binlog和redolog的写入机制

  • 存在进程内存中的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时,就会吧并行的未提交的事务日志存到文件里