innoDB重做日志
记录数据库页的变化,诸如space id/page no/operation code/data,大致原理等同于oracle redo log,可用于crash recovery,但是其功能有一定局限。
执行crash recovery时所操作的页必须是consistent,如果页已经损坏则无法recover,幸好及时引入了double write功能
日志头存储着最近一次checkpoint信息,日志以记录而非页的方式写入,采用512字节对齐(与磁盘扇区同等),SSD可以设置4096字节;
Redo log不能归档,因此必须循环利用,其相应设置参数为innodb_log_file_size/innodb_log_files_in_group/innodb_log_group_home_dir
选择合适的文件大小对innodb写性能至关重要,通常一个文件至少能够容纳一个小时的日志量
Mysql采用fuzzy checkpoint机制,每次读取最老的脏页而非全部脏页,将其LSN作为检查点记录到日志文件(这之前的LSN对应的日志和数据都写入文件,不需要恢复);
恢复数据文件时,innodb扫描日志文件的检查点信息,只恢复page LSN> checkpoint LSN的内容
redo log刷新条件
每秒刷新一次,由master thread执行;
事务commit,由参数innodb_flush_log_at_trx_commit决定,0表示不刷新,1同步刷新,2异步刷新至磁盘
相关参数
Innodb_log_buffer_size:缓存redo log以待刷新至磁盘,默认8M;经常发生大事务的时候可适当调大;
Innodb_log_file_size:日志文件大小,默认5M,上限为4G(InnoDB最初只为32位系统设计);越大则检查点发生次数就越少,但crash recovery时间就越长;
Innodb_log_files_in_group:日志文件数量,默认为2,上限100;
Innodb_flush_log_at_trx_commit:
同oracle一样,commit返回前提交所有的redo log,不同的是,innodb提供innodb_flush_log_at_trx_commit参数定制化commit返回时日志是否刷新到磁盘,
innodb_flush_log_at_trx_commit = 0 /* Write log buffer to log about once a second and flush */
innodb_flush_log_at_trx_commit = 1 /* Write log buffer to log and flush to disk */
innodb_flush_log_at_trx_commit = 2 /* Write log buffer to log and flush about once per second */
设置为1 时数据库crash仍能保证数据一致性,而操作系统crash则可能导致部分redo丢失;
可使用有备用电池的存储与之互补,即提升速度又能保证数据一致性
二进制日志
头部有4字节偏移量;
二进制日志以格式描述事件开始,日志轮换时间结束;
格式描述事件包括该文件的版本号/mysql版本以及日志信息, 以及标志binlog是否正常关闭;日志轮换包含下一个binlog名称;
根据复制方式不同,二进制记录的内容也不一样:
statement记录sql本身;
row则以二进制形式呈现,每1行可能包含前镜像或后镜像,包含3中类型write_rows_log_event/update_rows_log_event/delete_rows_log_event;
何时刷新
Sync_binlog:默认为0,如果设置为N,则在N次binlog写后调用fdatasync()将其刷新至磁盘;使用autocommit时1个sql为1次写,否则1个事务为1次写;
N=1的安全度最高,在mysql crash时最多丢失一个事务,但也最慢;
相关参数
Max_binlog_size:规定binlog的最大尺寸,范围为4k – 1G
binlog_cache_size:每个客户端分配一个,当服务器支持事务引擎且激活bin log时使用,用于记录事务缓存以便写入binlog;
此参数有个演化史:
5.5.3 – 5.5.8:非事务语句也分配同等大小的binlog cache,实际分配的cache为此参数的2倍;
5.5.9引入binglog_stmt_cache_size,专门分配非事务语句;
与之对应的还有max_binlog_cache_size,假定某事务大小超过此设置,会抱错generates a Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage
与二进制日志区别
1 二进制日志记录所有引擎的日志,而重做日志只记录InnoDB
2二进制日志记录事务的具体操作内容,而后者记录每个页更改的物理情况
3前者用于point-in-time恢复,后者用于crash recovery;如果mysql发生介质损坏,则需要从备份中恢复然后应用binary log执行point-in-time recovery
4 bin log大小达到上限或者flush log会生成一个新的文件,而redo log只能循环利用
5 bin log有索引文件,保存所有bin log文件列表
6 bin log可由每个线程写(加锁以避免混乱),而redo log只能由master thread写
什么是double write buffer
分2部分:内存中的buffer(2M);共享表空间中连续的128页(2M);刷新脏页时先通过memcpy将其复制到doublewrite buffer,接着分2次将其刷新到共享表空间,然后调用fsync同步脏页到磁盘;
即先将脏数据顺序写入共享表空间,然后再调用fsync写入数据文件,如果此时OS崩溃,recovery时可以从共享表空间找到该页的副本,将其copy的数据文件然后应用redo log
由参数innodb_doublewrite决定,默认为true
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-755325/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15480802/viewspace-755325/