mysql binlog、redo log、undo log
binlog:二进制日志,是系统级别日志,任何存储引擎的表都有。binlog在/var/lib/mysql目录。
https://dev.mysql.com/doc/refman/8.0/en/binary-log.html
binlog用于记录数据库执行的写入性操作,以二进制形式保存在磁盘中,任何存储引擎的mysql数据库都会记录binlog日志。
binlog的使用场景主要有2个:主从复制和数据恢复。
binlog刷盘时机
对于InnoDB存储引擎而言,只有在事务提交时才会记录binlog,此时记录还在内存中,那么binlog在什么时候刷到磁盘中呢?刷盘时机是由sync_binlog参数指定的。sync_binlog如果值为0,则表示由操作系统判断何时写入磁盘。如果值不为0,如N,则表示每N个事务,才会将binlog写入磁盘。sync_binlog默认值是1,即每次commit的时候都要将binlog写入磁盘。
可以使用mysqlbinlog工具打开binlog文件。
redo log和undo log是事务日志,只有innodb存储引擎的表才有。
redo log:
https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html
InnoDB存储引擎以页为单位管理存储空间。redo log记录的物理级别的页修改操作,即哪一页的哪个偏移量处修改了或者写入了什么数据。redo log中文翻译成重做日志。
redo log可以分为两个部分:
1、redo log buffer:重做日志缓冲,在内存中。mysql server在启动时就会申请一片连续的内存空间作为redo log buffer,这片内存空间被划分成若干个连续的redo log block,每个redo log block占0.5kb。redo log buffer大小由innodb_log_buffer_size指定,默认值是16M。
2、redo log file:重做日志文件,在硬盘中,文件名以ib_logfile开头。单个文件最大大小由innodb_log_file_size指定,默认值是48M。文件个数由innodb_log_files_in_group指定,默认值是2。
redo log record并不是直接写入file中,而是先写到buffer中,然后再按照一定策略刷到file中。
mysql中使用了大量的缓存,缓存存在于内存中,修改操作时会直接修改内存,而不是立刻修改磁盘。当内存和磁盘的数据不一致时,称内存中的数据为脏页(dirty page)。为了保证数据的安全性,事务进行时会不断的产生redo log,在事务提交时进行一次flush操作,保存到磁盘中。当数据库或主机失效重启时,会根据redo log进行数据的恢复,如果redo log中有事务提交,则进行事务提交修改数据。
undo log:用于事务回滚和MVCC。用于MVCC是指,当读取的某一行被其他事务锁定时,可以从undo log中获取该行记录以前的数据是什么。
undo log:
https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-logs.html