<?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; mysqldump</title>
	<atom:link href="http://www.orczhou.com/index.php/tag/mysqldump/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>使用tbdba-restore-mysqldump.pl切割mysqldump文件</title>
		<link>http://www.orczhou.com/index.php/2011/12/how-to-split-mysqldump-file/</link>
		<comments>http://www.orczhou.com/index.php/2011/12/how-to-split-mysqldump-file/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 14:40:42 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[备份]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=3364</guid>
		<description><![CDATA[<p>这里介绍一个最近用得很多的一个小工具：<a href="https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl">tbdba-restore-mysqldump.pl</a>。</p>
<p>主要有两个功能：</p>
<p>(1) 尽可能快的从一个非常大的mysqldump文件的分离出某个单表的备份文件</p>
<p>(2) 可以帮你把一个大的mysqldump文件，切割成非常小的单表备份文件（可继续做并行恢复）</p>
<div class="myt1">1. 什么时候需要这么做</div>
<p>(1) 如果把MySQL中<strong>某一个表</strong>数据弄丢了，需要从很大的mysqldump备份文件中恢复这个表</p>
<p>(2) 如果你想并行恢复整个mysqldump备份文件时，这个脚本可以帮你把大文件切割成多个小的单表备份文件，然后就可以方便并行恢复多个文件了</p>
<div class="myt1">2. 如何使用这个脚本</div>
<p>这里以实例的方式介绍如何使用该脚本：</p>
<p>(1) 从backup.sql文件中获取表process的备份：</p>
<blockquote><div style="color:blue">tbdba-restore-mysqldump.pl -t process -f backup.sql</div>
</blockquote>
<p>(2) 从backup.sql文件中获取数据库monitor中的表process的备份：</p>
<blockquote><div style="color:blue">tbdba-restore-mysqldump.pl -t process -s monitor -f backup.sql</div>
</blockquote>
<p>[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2011/12/how-to-split-mysqldump-file/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>这里介绍一个最近用得很多的一个小工具：<a href="https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl">tbdba-restore-mysqldump.pl</a>。</p>
<p>主要有两个功能：</p>
<p>(1) 尽可能快的从一个非常大的mysqldump文件的分离出某个单表的备份文件</p>
<p>(2) 可以帮你把一个大的mysqldump文件，切割成非常小的单表备份文件（可继续做并行恢复）</p>
<div class="myt1">1. 什么时候需要这么做</div>
<p>(1) 如果把MySQL中<strong>某一个表</strong>数据弄丢了，需要从很大的mysqldump备份文件中恢复这个表</p>
<p>(2) 如果你想并行恢复整个mysqldump备份文件时，这个脚本可以帮你把大文件切割成多个小的单表备份文件，然后就可以方便并行恢复多个文件了</p>
<div class="myt1">2. 如何使用这个脚本</div>
<p>这里以实例的方式介绍如何使用该脚本：</p>
<p>(1) 从backup.sql文件中获取表process的备份：</p>
<blockquote><div style="color:blue">tbdba-restore-mysqldump.pl -t process -f backup.sql</div>
</blockquote>
<p>(2) 从backup.sql文件中获取数据库monitor中的表process的备份：</p>
<blockquote><div style="color:blue">tbdba-restore-mysqldump.pl -t process -s monitor -f backup.sql</div>
</blockquote>
<p><span id="more-3364"></span></p>
<p>(3) 从backup.sql文件中获取多个表的备份文件（例如表process、users）：</p>
<blockquote><div style="color:blue">tbdba-restore-mysqldump.pl -t process,user -s monitor -f backup.sql</div>
</blockquote>
<p>(4) 直接接收来自管道的输出（如果你的mysqldump备份是压缩后，则可以使用）：</p>
<blockquote><div style="color:blue">gunzip -c backup.sql.gz|tbdba-restore-mysqldump.pl -t process,user -s monitor</div>
</blockquote>
<p>(5) 从backup.sql文件中获取数据库monitor下<strong>所有表</strong>的备份文件：</p>
<blockquote><div style="color:blue">gunzip -c backup.sql.gz|tbdba-restore-mysqldump.pl -s monitor </div>
</blockquote>
<p>(6) 从backup.sql文件中获取<strong>所有数据库下所有表</strong>的备份文件：</p>
<blockquote><div style="color:blue">gunzip -c backup.sql.gz|tbdba-restore-mysqldump.pl --all-tables</div>
</blockquote>
<p>(7) 使用-d参数，则可以看到切割的过程中的更多信息：</p>
<blockquote><div style="color:blue">date &#038;& gunzip -c /backdir/backup.sql.gz|tbdba-restore-mysqldump.pl -d -a &#038;& date</div>
</blockquote>
<div class="myt1">3. tbdba-restore-mysqldump.pl有什么优势</div>
<p>(1) 如果指定了-s（获取<strong>某个</strong>数据库中的备份）参数，则脚本在成功截取需要恢复的<strong>表</strong>后就会立刻退出，所以如果你要恢复的表恰好在备份文件的比较靠前的位置时，该脚本的速度会非常快。</p>
<p>一个实际工作例子：</p>
<blockquote><p>$ls -lh backup.sql.gz<br />
 -rw-r--r-- 1 mysql dba 14G Nov 21 04:49 backup.sql.gz<br />
$date &#038;& gunzip -c backup.sql.gz|./tbdba-restore-mysqldump.pl -s monitor_general -t monitor_host_info &#038;& date<br />
Fri Nov 25 14:35:06 CST 2011<br />
Fri Nov 25 14:46:49 CST 2011<br />
(the unzip of backup.sql.gz is 88G)</p></blockquote>
<p>如果要全量恢复的话，根据经验值：88GB的sql文件完全恢复约需要400分钟（<a href="http://www.orczhou.com/index.php/2009/12/more-about-mysqldump/">经验值</a>）。</p>
<p>(2) 为了让每个独立的单表备份文件能够准确恢复，脚本做了两个额外的处理工作：在每个单表备份前加上'use db'，让该表能够恢复到正确的数据库；为了让单表恢复时字符集不出错误，脚本在某个单表备份前加上了对应的SET NAMES utf8、SET TIME_ZONE等命令。</p>
<div class="myt1">4. 其他人都怎么做</div>
<p><a href="http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html">Extract a Single Table from a mysqldump File</a>：这篇文章提到了三个办法，分别是：perl脚本（我这里的做法基本“雷同”），awk解析后切割，先恢复到临时库(对大文件这个不现实...)。对比了我们的Perl脚本，这里做了几个改进：可以同时解析出多个表；完成目标表的切割后，则立刻退出，不再扫描剩余部分；会把mysqldump头部输出放到每一个切割文件中，方便各种字符集的恢复；</p>
<p><a href="http://gtowey.blogspot.com/2009/11/restore-single-table-from-mysqldump.html">Restore a Single Table From mysqldump</a>：这篇文章介绍如何用Sed来完成这个工作。</p>
<p><a href="http://ushastry.blogspot.com/2009/08/mysql-restoring-single-table-from.html">MySQL - Restoring a single table from nightly backup </a>：这位朋友则，想出一个“更损”的招：只给恢复用户赋予需要恢复的表的权限，然后用--force参数恢复整个mysqldump文件。</p>
<p><a href="http://code.openark.org/blog/mysql/on-restoring-a-single-table-from-mysqldump">On restoring a single table from mysqldump</a>：这篇文章则对比了使用grep sed 和“权限控制”三种方法的速度。</p>
<p>最后，如果不喜欢mysqldump这种一股脑的备份方式，可以考虑试用mydumper。</p>
<p>OK，That's all.</p>
<p><embed src="http://www.xiami.com/widget/318706_184466/singlePlayer.swf" type="application/x-shockwave-flash" width="257" height="33" wmode="transparent"></embed></p>
<p>广告：<a href="http://www.orczhou.com/index.php/projects/we-are-hunting-mysql-hacker/">我们寻找靠谱的人</a> | <a href="http://www.orczhou.com/index.php/wish-list/">感谢作者</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2011/12/how-to-split-mysqldump-file/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>mysqldump拾遗</title>
		<link>http://www.orczhou.com/index.php/2009/12/more-about-mysqldump/</link>
		<comments>http://www.orczhou.com/index.php/2009/12/more-about-mysqldump/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 12:37:13 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[备份]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=1068</guid>
		<description><![CDATA[<p>mysqldump是MySQL数据库备份最基本的方法，本文将简单的介绍mysqldump使用过程中容易忽略的问题。包括基本使用，和使用中的遇到一些问题，欢迎讨论。</p>
<p><font color="red">1.基本使用</font></p>
<div class="mycode">
<pre>
mysqldump -ubackup -p --all-databases > ~/dz_dump.sql
mysqldump -ubackup -p --databases feel> ~/feel_dump.sql #仅备份单个数据库
mysqldump -ubackup -p --no-data --all-databases> ~/no_data.sql #仅备份表结构
</pre>
</div>
<p>[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2009/12/more-about-mysqldump/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>mysqldump是MySQL数据库备份最基本的方法，本文将简单的介绍mysqldump使用过程中容易忽略的问题。包括基本使用，和使用中的遇到一些问题，欢迎讨论。</p>
<p><font color="red">1.基本使用</font></p>
<div class="mycode">
<pre>
mysqldump -ubackup -p --all-databases > ~/dz_dump.sql
mysqldump -ubackup -p --databases feel> ~/feel_dump.sql #仅备份单个数据库
mysqldump -ubackup -p --no-data --all-databases> ~/no_data.sql #仅备份表结构
</pre>
</div>
<p><span id="more-1068"></span><br />
<font color="red">2.关于INFORMATION_SCHEMA</font></p>
<p>information_schema是由mysql server维护的一个数据库，在备份数据库的时候，我们是不需要这个数据库的。事实情况也很好，5.0、5.1版本下的mysqldump都是不会导出这个数据库的。但是4.1的mysqldump不买这个帐，会将information_schema一起导出，这是不必要的。（使用4.1版本的mysqldump必须使用--single-transaction参数，因为即使是root用户也不能lock information_schema里面的数据表）</p>
<p><font color="red">3.使用备份做备库</font></p>
<p> &#45;&#45;master-info可以帮你用备份出来的数据做一个备库</p>
<p><font color="red">4.较大的数据量</font></p>
<p>如果你的数据量，到了几千万的级别，mysqldump的速度就会变的很慢，而且dump生成的文件会很大，你想从备份恢复数据库时间也会很长，这时候，你可能需要寻找新的备份方法了</p>
<p><font color="red">5."Lost connection to MySQL server"</font></p>
<p>在使用mysqldump的时候（尤其是向NFS上备份的时候），<a href="http://jeremy.zawodny.com/blog/archives/000690.html" target="_blank">很多人</a>都被'mysqldump:Got error:2013: Lost connection to MySQL server during query when dumping table'的问题困扰，在<a href="http://dev.mysql.com/doc/refman/5.0/en/error-lost-connection.html" target="_blank">Manual</a>中对这个问题有一些简单的说明。</p>
<p>在向NFS上备份的时候，数据的流向是这样的：MySQL Server端从数据文件中检索出数据，然后分批将数据返回给mysqldump客户端，然后mysqldump将数据写入到NFS上。一般地，向NFS上写入数据的速度较之Server端检索发送数据的速度要慢得多，这就会导致mysqldump无法<strong>及时</strong>的接受Server端发送过来的数据，Server端的数据就会积压在内存中<strong>等待</strong>发送，这个等待不是无限期的，当Server的等待时间超过<a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_net_write_timeout" target="_blank">net_write_timeout</a>（默认是60秒）时它就失去了耐心，mysqldump的连接会被断开，同时抛出错误Got error: 2013: Lost connection。</p>
<p><strong>增加net_write_timeout可以解决上述的问题的</strong>。在实践中发现，在增大net_write_timeout后，Server端会消耗更多的内存，有时甚至会导致swap的使用（并不确定是不是修改net_write_timeout所至）。建议在mysqldump之前修改net_write_timeout为一个较大的值（如1800），在mysqldump结束后，在将这个值修改到默认的60。</p>
<p><font color="red">6.备份和恢复速度</font></p>
<p>经验值：某个备份出的.sql文件大小为39GB，备份耗时约80分钟；在测试恢复中，发现需要约206分钟。环境：Quad-Core AMD Opteron(tm) 4*2核32G内存；</p>
<p><font color="red">7.其他</font></p>
<p>*<font color="red">*</font>*<font color="red">*</font>*备份不要在数据库压力较大的时候进行，每天凌晨备份是比较合适的</p>
<p>*<font color="red">*</font>*<font color="red">*</font>*如果是事务型引擎（InnoDB），建议使用&#45;&#45;single-transaction参数，这样可以让锁表时间变得很短</p>
<p>参考：</p>
<ol>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html">Manual about mysqldump</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/error-lost-connection.html">Manual about Lost Connection</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_net_write_timeout">Manual about net_write_timeout</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2009/12/more-about-mysqldump/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MySQL 备份基础</title>
		<link>http://www.orczhou.com/index.php/2009/05/mysql-backup-abc/</link>
		<comments>http://www.orczhou.com/index.php/2009/05/mysql-backup-abc/#comments</comments>
		<pubDate>Thu, 07 May 2009 05:33:49 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[备份]]></category>

		<guid isPermaLink="false">http://orczhou.com/?p=205</guid>
		<description><![CDATA[<p><a href="http://orczhou.com/wp-content/uploads/2009/04/logo_mysql_sun_a.gif"><img class="size-full wp-image-151 alignleft" title="logo_mysql_sun_a" src="http://orczhou.com/wp-content/uploads/2009/04/logo_mysql_sun_a.gif" alt="logo_mysql_sun_a" width="114" height="68" /></a></p>
<p>一般来说，你有两种可供选择的备份MySQL的方式----mysqldump 或者mysqlhotcopy。</p>
<p>mysqldump可以备份各种类型的数据表，但是mysqlhotcopy<a href="http://dev.mysql.com/doc/refman/5.0/en/backup.html" target="_blank">只适合</a>备份MyISAM和ISAM的数据表。所以使用mysqlhotcopy之前，你必须确认你的数据表是不是有其他的存储引擎(storage engines)的。[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2009/05/mysql-backup-abc/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://orczhou.com/wp-content/uploads/2009/04/logo_mysql_sun_a.gif"><img class="size-full wp-image-151 alignleft" title="logo_mysql_sun_a" src="http://orczhou.com/wp-content/uploads/2009/04/logo_mysql_sun_a.gif" alt="logo_mysql_sun_a" width="114" height="68" /></a></p>
<p>一般来说，你有两种可供选择的备份MySQL的方式----mysqldump 或者mysqlhotcopy。</p>
<p>mysqldump可以备份各种类型的数据表，但是mysqlhotcopy<a href="http://dev.mysql.com/doc/refman/5.0/en/backup.html" target="_blank">只适合</a>备份MyISAM和ISAM的数据表。所以使用mysqlhotcopy之前，你必须确认你的数据表是不是有其他的存储引擎(storage engines)的。<span id="more-205"></span></p>
<p><span style="color: #0000ff;"><strong>How To：</strong></span></p>
<ol type="1">
<li><span style="color: #ff0000;">mysqldump      -uroot -p*** DBNAME | gzip -f&gt;/backup/dbname.'date      +%w'.dump.gz</span></li>
<li><span style="color: #ff0000;">mysqlhotcopy      DBNAME -u root -p *** /backup</span></li>
</ol>
<p><span style="color: #0000ff;"><strong>两者速度：</strong></span>因为mysqlhotcopy会直接拷贝存储数据的文件，所以其速度是依赖于磁盘操作的速度，较之mysqldump要快些。下面是两种方式备份同一个数据的时候的时间消耗比较：</p>
<ol>
<li>mysqldump  <span style="color: #008000;">耗时22分39秒</span>（gzip压缩后文件大小为747M.）</li>
<li>mysqlhotcopy  <span style="color: #008000;">耗时6分07秒</span>（tar gzip打包压缩后文件大小为1014M.）</li>
</ol>
<p>参考：</p>
<ol>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/backup.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/en/backup.html</a><a href="http://www.mysqlperformanceblog.com/2009/03/03/10-things-you-need-to-know-about-backup-solutions-for-mysql/"></a></li>
<li><a href="http://www.mysqlperformanceblog.com/2009/03/03/10-things-you-need-to-know-about-backup-solutions-for-mysql/">ttp://www.mysqlperformanceblog.com/2009/03/03/10-things-you-need-to-know-about-backup-solutions-for-mysql/</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2009/05/mysql-backup-abc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

