我可以从完整的mysql mysqldump文件恢复单个表吗?

我有我的MySQL数据库的mysqldump备份,包括我们所有的表大约440兆。 我想恢复mysqldump的其中一个表的内容。 这可能吗? 从理论上讲,我可以删除重build表格所需的部分,但我甚至不知道如何有效地编辑这个大小的文本文档。

你可以尝试使用sed来只提取你想要的表。

假设你的表名是mytable ,文件mysql.dump是包含你的巨大转储的文件:

 $ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump 

这将在文件mytable.dump复制CREATE TABLE mytable和对应于下一个表的下一个CREATE TABLE之间的内容。

然后可以调整包含表mytable结构的文件mytable.dump和数据( INSERT列表)。

我使用了uloBasEI的sed命令的修改版本。 它包含前面的DROP命令,并读取直到mysql完成将数据转储到表(UNLOCK)。 为我工作(重新)导入wp_users到一堆WordPress的网站。

 sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql 

这可以更容易地完成? 这是我做到的:

创build一个临时数据库(例如恢复):

mysqladmin -u root -p创build恢复

还原临时数据库中的完整转储:

mysql -u root -p restore <fulldump.sql

转储您要恢复的表:

mysqldump还原mytable> mytable.sql

在另一个数据库中导入表格:

mysql -u root -p database <mytable.sql

一个简单的解决scheme是简单地创build一个你想要单独恢复的表的转储。 您可以使用mysqldump命令使用以下语法执行此操作:

 mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql 

然后正常导入它,它只会导入转储表。

无论如何,任何一个进程都必须通过转储的整个文本并以某种方式进行parsing。 我只是希望

 INSERT INTO `the_table_i_want` 

并输出到MySQL。 看看转储中的第一张表格,以确保您正确地获取INSERT。

编辑:好的,这次得到了格式化权。

你应该尝试@bryn命令,但是使用分隔符,否则你也将提取有前缀或后缀的表,这是我通常做的:

 sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql 

另外为了testing目的,您可能需要在导入之前更改表名称:

 sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql 

要导入,您可以使用mysql命令:

 mysql -u root -p'password' mydatabase < mytable_restore.sql 
  1. 备用

     $ mysqldump -A | gzip > mysqldump-A.gz 
  2. 还原单个表格

     $ mysql -e "truncate TABLE_NAME" DB_NAME $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME 

解决这个问题的一种可能的方法是恢复到临时数据库,并从临时数据库中转储该表。 然后使用新的脚本。

这个工具可能是你想要的:tbdba-restore-mysqldump.pl

https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

例如从数据库转储文件恢复表:

tbdba-restore-mysqldump.pl -t yourtable -s yourdb -f backup.sql

这也可能有帮助。

 # mysqldump -u root -p database0 > /tmp/database0.sql # mysql -u root -p -e 'create database database0_bkp' # mysql -u root -p database0_bkp < /tmp/database0.sql # mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want' 

大多数现代的文本编辑器应该能够处理一个文本文件的大小,如果你的系统是由它决定的。

无论如何,我必须很快地做到这一点,我没有时间find任何工具。 我build立一个新的MySQL实例,导入整个备份,然后吐出我想要的表。

然后,我将该表导入主数据库。

这是乏味,但相当容易。 祝你好运。

创build一个testing数据库,还原整个数据库,然后将单个表转储到一个文件 – 然后将数据还原到“生产”数据库不是很容易吗?

你可以用vi编辑器。 types:

 vi -o mysql.dump mytable.dump 

打开整个转储mysql.dump和一个新文件mytable.dump 。 按/find合适的插入行,然后键入一个短语,例如:“insert into mytable`”,然后使用yy复制该行。 按ctrl+w切换到下一个文件,然后down arrow key ,粘贴复制的行与pp 。 最后通过input:wq和相当vi编辑器来保存新文件:q

请注意,如果您已经使用多个插入来转储数据,则可以使用Nyy一次性复制(抽出)所有这些Nyy ,其中N是要复制的行数。

我已经做了920 MB大小的文件。

SQL的块被“表my_table表结构”和“表my_table转储数据”封锁。

您可以按如下所示使用Windows命令行来获取各个部分的行号。 根据需要调整search的string。

find/ n“表”sql.txt“

以下内容将被退回:

———- SQL.TXT

[4384] – 表my_table表结构

[4500] – 为表my_table转储数据

[4514] – 表some_other_table表结构

…等

如果我只知道如何使用他们…调查,那么这就得到了你需要的行数。

回到08年,我也需要这样做。 我写了一个Perl脚本来做,现在是我select的方法。 还总结了如何在awk中做到这一点或如何恢复别处和提取。 最近我也将这个sed方法添加到列表中。 你可以在这里find脚本和其他方法: http : //blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html

我尝试了几个非常慢的选项。 这在几分钟内将一个360GB转储分成几张表:

如何将mysqldump的输出分割成更小的文件?

 sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql 

这是比其他一些更好的解决scheme,因为并非所有的SQL转储都包含DROP TABLE语句。 这一个将工作将各种倾倒。

前面提到的'sed'解决scheme很好,但是提到的不是100%的安全

  • 你可能有INSERT命令的数据包含:… CREATE TABLE …(无论)… mytable …

  • 甚至确切的string“CREATE TABLE mytable”;“ 如果你正在存储DML命令,例如!

(如果表是巨大的,你不想手动检查)

我会validation使用的转储版本的确切语法,并有一个更严格的模式search:

避免使用“*”,并使用“^”来确保我们从行首开始。 而我更愿意抓住最初的“DROP”

总而言之,这对我更好:

 sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump 

得到像Notepad ++或Vim这样的像样的文本编辑器(如果你已经熟练的话)。 search表名,并且应该只能突出显示该表的CREATE,ALTER和INSERT命令。 用键盘而不是鼠标导航可能会更容易。 而且我会确保你的机器有足够的内存,所以一次加载整个文件不会有问题。 一旦你突出显示并复制了你所需要的行,最好把复制的部分备份到它自己的备份文件中,然后把它导入到MySQL中。