使用tbdba-restore-mysqldump.pl切割mysqldump文件

2011-12-14  |  22:40分类:MySQL  |  标签:  |  

这里介绍一个最近用得很多的一个小工具:tbdba-restore-mysqldump.pl

主要有两个功能:

(1) 尽可能快的从一个非常大的mysqldump文件的分离出某个单表的备份文件

(2) 可以帮你把一个大的mysqldump文件,切割成非常小的单表备份文件(可继续做并行恢复)

1. 什么时候需要这么做

(1) 如果把MySQL中某一个表数据弄丢了,需要从很大的mysqldump备份文件中恢复这个表

(2) 如果你想并行恢复整个mysqldump备份文件时,这个脚本可以帮你把大文件切割成多个小的单表备份文件,然后就可以方便并行恢复多个文件了

2. 如何使用这个脚本

这里以实例的方式介绍如何使用该脚本:

(1) 从backup.sql文件中获取表process的备份:

tbdba-restore-mysqldump.pl -t process -f backup.sql

(2) 从backup.sql文件中获取数据库monitor中的表process的备份:

tbdba-restore-mysqldump.pl -t process -s monitor -f backup.sql

(3) 从backup.sql文件中获取多个表的备份文件(例如表process、users):

tbdba-restore-mysqldump.pl -t process,user -s monitor -f backup.sql

(4) 直接接收来自管道的输出(如果你的mysqldump备份是压缩后,则可以使用):

gunzip -c backup.sql.gz|tbdba-restore-mysqldump.pl -t process,user -s monitor

(5) 从backup.sql文件中获取数据库monitor下所有表的备份文件:

gunzip -c backup.sql.gz|tbdba-restore-mysqldump.pl -s monitor

(6) 从backup.sql文件中获取所有数据库下所有表的备份文件:

gunzip -c backup.sql.gz|tbdba-restore-mysqldump.pl --all-tables

(7) 使用-d参数,则可以看到切割的过程中的更多信息:

date && gunzip -c /backdir/backup.sql.gz|tbdba-restore-mysqldump.pl -d -a && date
3. tbdba-restore-mysqldump.pl有什么优势

(1) 如果指定了-s(获取某个数据库中的备份)参数,则脚本在成功截取需要恢复的后就会立刻退出,所以如果你要恢复的表恰好在备份文件的比较靠前的位置时,该脚本的速度会非常快。

一个实际工作例子:

$ls -lh backup.sql.gz
-rw-r--r-- 1 mysql dba 14G Nov 21 04:49 backup.sql.gz
$date && gunzip -c backup.sql.gz|./tbdba-restore-mysqldump.pl -s monitor_general -t monitor_host_info && date
Fri Nov 25 14:35:06 CST 2011
Fri Nov 25 14:46:49 CST 2011
(the unzip of backup.sql.gz is 88G)

如果要全量恢复的话,根据经验值:88GB的sql文件完全恢复约需要400分钟(经验值)。

(2) 为了让每个独立的单表备份文件能够准确恢复,脚本做了两个额外的处理工作:在每个单表备份前加上'use db',让该表能够恢复到正确的数据库;为了让单表恢复时字符集不出错误,脚本在某个单表备份前加上了对应的SET NAMES utf8、SET TIME_ZONE等命令。

4. 其他人都怎么做

Extract a Single Table from a mysqldump File:这篇文章提到了三个办法,分别是:perl脚本(我这里的做法基本“雷同”),awk解析后切割,先恢复到临时库(对大文件这个不现实...)。对比了我们的Perl脚本,这里做了几个改进:可以同时解析出多个表;完成目标表的切割后,则立刻退出,不再扫描剩余部分;会把mysqldump头部输出放到每一个切割文件中,方便各种字符集的恢复;

Restore a Single Table From mysqldump:这篇文章介绍如何用Sed来完成这个工作。

MySQL - Restoring a single table from nightly backup :这位朋友则,想出一个“更损”的招:只给恢复用户赋予需要恢复的表的权限,然后用--force参数恢复整个mysqldump文件。

On restoring a single table from mysqldump:这篇文章则对比了使用grep sed 和“权限控制”三种方法的速度。

最后,如果不喜欢mysqldump这种一股脑的备份方式,可以考虑试用mydumper。

OK,That's all.

广告:我们寻找靠谱的人 | 感谢作者

喜欢本文,那就收藏到:

8条评论 关于 “使用tbdba-restore-mysqldump.pl切割mysqldump文件”

  1. huangzhiyong 发表于: 十二月 15th, 2011 00:21

    赞个!!
    :)
    还可以+个小功能,能对表再分离+多线程恢复。我们已经完成这个工具了。最近忙,没时间去整理。

  2. dbaeyes 发表于: 十二月 17th, 2011 19:38

  3. 使用tbdba-restore-mysqldump.pl切割mysqldump文件 | 岭南六少 - 一朵在LAMP架构下挣扎的云 发表于: 十二月 19th, 2011 19:48

    [...] FROM:http://www.orczhou.com/index.php/2011/12/how-to-split-mysqldump-file/ [...]

  4. 李明 发表于: 三月 12th, 2012 15:52

    周老师好,我想切割出,某一库下的所有表,未能成功。mysqldump选项用的是 -l -f -R

  5. 李明 发表于: 三月 12th, 2012 15:52

    文件内是多个库的备份

  6. orczhou 发表于: 三月 12th, 2012 16:41

    tbdba-restore-mysqldump.pl 你用了怎么的参数? 能more一段备份出来的文件的前面部分发给我看下吗?

  7. 张盛东 发表于: 七月 18th, 2012 15:18

    可能周哥一直很忙,估计没时间回复我,
    我看了你的perl源代码,我有个疑问,你虽然可以指定到什么库,但是你怎么确定mysql实例,例如:你要进入mysql你必须用类似如下的命令:

    mysql -uroot -p'XXX' -S /data/3307/mysql.sock

    你这个脚本里面,貌似没有,那如何做到,恢复数据库呢?

    本人愚笨,需点拨

  8. orczhou 发表于: 七月 23rd, 2012 14:22

    @张盛东 这里只做切割 没有做恢复相关的操作


发表您的评论