<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>一个故事@MySQL DBA &#187; dirty page</title>
	<atom:link href="http://www.orczhou.com/index.php/tag/dirty-page/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.orczhou.com</link>
	<description>一个故事@MySQL DBA</description>
	<lastBuildDate>Tue, 20 Dec 2011 15:51:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>InnoDB之Dirty page、Redo log</title>
		<link>http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/</link>
		<comments>http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 01:55:51 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[技术细节]]></category>
		<category><![CDATA[dirty page]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[redo log]]></category>
		<category><![CDATA[图解]]></category>

		<guid isPermaLink="false">http://orczhou.com/?p=624</guid>
		<description><![CDATA[<p>在InnoDB中，buffer pool里面的dirty page一方面可以加快数据处理速度，同时也会造成数据的不一致(RAM vs DISK)。本文介绍了dirty page是如何产生，以及InnoDB如何利用redo log如何消除dirty page产生的数据不一致。</p>
<ol>
<li>当事务(Transaction)需要修改某条记录（row）时，InnoDB需要将该数据所在的page从disk读到buffer pool中，事务提交后，InnoDB修改page中的记录(row)。这时buffer pool中的page就已经和disk中的不一样了，我们称buffer pool中的page为dirty page。Dirty page等待flush到disk上。<br />
<a title="dirty_pages by orczhou, on Flickr" href="http://www.flickr.com/photos/26825745@N06/3813766302/"><img src="http://farm3.static.flickr.com/2502/3813766302_ba5659f61d_o.png" alt="dirty_pages" width="508" height="387" /></a><br />
[......]</li></ol><p class='read-more'><a href='http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>在InnoDB中，buffer pool里面的dirty page一方面可以加快数据处理速度，同时也会造成数据的不一致(RAM vs DISK)。本文介绍了dirty page是如何产生，以及InnoDB如何利用redo log如何消除dirty page产生的数据不一致。</p>
<ol>
<li>当事务(Transaction)需要修改某条记录（row）时，InnoDB需要将该数据所在的page从disk读到buffer pool中，事务提交后，InnoDB修改page中的记录(row)。这时buffer pool中的page就已经和disk中的不一样了，我们称buffer pool中的page为dirty page。Dirty page等待flush到disk上。<br />
<a title="dirty_pages by orczhou, on Flickr" href="http://www.flickr.com/photos/26825745@N06/3813766302/"><img src="http://farm3.static.flickr.com/2502/3813766302_ba5659f61d_o.png" alt="dirty_pages" width="508" height="387" /></a><br />
<span id="more-624"></span></li>
<li>dirty page既然是在Buffer pool中，那么如果系统突然断电Dirty page中的数据修改是否会丢失？这个担心是很有必要的，例如如果一个用户完成一个操作（数据库完成了一个事务，page已经在buffer pool中修改，但dirty page尚未flush），这时系统断电，buffer pool数据全部消失。那么，这个用户完成的操作（导致的数据库修改）是否会丢失呢？答案是不会(innodb_flush_log_at_trx_commit=1)。这就是redo log要做的事情，在disk上记录更新。</li>
<li>redo log在每次事务commit的时候，就立刻将事务更改操作记录到redo log。所以即使buffer pool中的dirty page在断电时丢失，InnoDB在启动时，仍然会根据redo log中的记录完成数据恢复。</li>
<li>redo log的另一个作用是，通过延迟dirty page的flush最小化磁盘的random writes。（redo log会合并一段时间内TRX对某个page的修改）<br />
<a title="dirty_pages AND redo_log by orczhou, on Flickr" href="http://www.flickr.com/photos/26825745@N06/3813218413/"><img src="http://farm3.static.flickr.com/2462/3813218413_b21477573e_o.png" alt="dirty_pages AND redo_log" width="591" height="452" /></a></li>
<li><a title="dirty_pages_redo_log by orczhou, on Flickr" href="http://www.flickr.com/photos/26825745@N06/3813891252/"></a>正常情况下，dirty page什么时候flush到disk上？<br />
<span lang="EN-US">1).</span>redo log是一个环(ring)结构，当redo空间占满时，将会将部分dirty page flush到disk上，然后释放部分redo log。这种情况可以通过Innodb_log_wait(SHOW GLOBAL STATUS)观察，情况发生该计数器会自增一次。<br />
2).当需要在Buffer pool分配一个page，但是已经满了，并且所有的page都是dirty的（否则可以释放不dirty的page），通常是不会发生的。这时候必须flush dirty pages to disk。这种情况将会记录到Innodb_buffer_pool_wait_free中。一般地，可以可以通过启动参数innodb_max_dirty_pages_pct控制这种情况，当buffer pool中的dirty page到达这个比例的时候，将会强制设定一个checkpoint，并把dirty page flush到disk中。<br />
3).检测到系统空闲的时候，会flush，每次64 pages。</li>
<li>涉及的InnoDB配置参数：innodb_flush_log_at_trx_commit、innodb_max_dirty_pages_pct；状态参数：Innodb_log_wait、Innodb_buffer_pool_wait_free。</li>
</ol>
<p>参考文献</p>
<ol>
<li><a href="http://mysqldump.azundris.com/archives/78-Configuring-InnoDB-An-InnoDB-tutorial.html">http://mysqldump.azundris.com/archives/78-Configuring-InnoDB-An-InnoDB-tutorial.html</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/innodb.html">http://dev.mysql.com/doc/refman/5.0/en/innodb.html</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
	</channel>
</rss>

