innodb的redo log以及与binary log的区别

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,则在Nbinlog写后调用fdatasync()将其刷新至磁盘;使用autocommit1sql1次写,否则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

 

 

与二进制日志区别

二进制日志记录所有引擎的日志,而重做日志只记录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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值