?????最近看高性能mysql,看到double write时很困惑,经过一番google,终于茅塞顿开,记录如下:
????? 当commit一个修改记录时,如果redo log有空闲区域,直接写redo log,如果redo log没有空闲区域,那么需要把被覆盖的redo log对应的数据页刷新到data file 中,最后改pool buffer中的记录。innodb的redo log 不会记录完整的一页数据,因为这样日志太大,它只会记录那次(sequence)如何操作了(update,insert)哪页(page)的哪行(row)。由于mysql使用的页(page,默认16KB)大小和操作系统对磁盘的操作页(page,默认4KB)不一样导致的,比如mysql 提交了一个页需要刷新到磁盘, 当刷了前面的8k时异常发生(操作系统崩溃,掉电等),当系统恢复正常后,没有double write机制,mysql将data file数据捞到内存,重做刚才的哪条redo log,这时候就会有一个严重的问题,这个redo log 要操作的数据页已经不一致了,有些是被修改的,有些没有。
????? 如果有double write buffer,事情就简单多了,检查double writer的数据的完整性,如果不完整直接丢弃double write buffer内容,重新执行哪条redo log,如果double write buffer的数据是完整的,用double buffer的数据更新该数据页,跳过该redo log。
我希望这个blog能帮你释疑,如果对你有帮助,请让我知道!
感谢公司的dba mike同学,you are a really nice guy!!
参考文档:
http://wangwei.cao.blog.163.com/blog/static/1023625262010472592984
http://dimitrik.free.fr/blog/archives/2009/08/entry_86.html
http://www.facebook.com/note.php?note_id=107329775932
http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write
http://dev.mysql.com/doc/refman/5.0/en/innodb-disk-io.html
Posted in: MySQL practise | Tags: doublewrite buffer, InnoDB, MySQL
Comments are closed.