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

Mob*_*ius 181 mysql backup restore mysqldump

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

小智 272

您可以尝试使用sed以仅提取所需的表.

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

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump
Run Code Online (Sandbox Code Playgroud)

这将在文件中复制mytable.dump位于CREATE TABLE mytableCREATE TABLE一个表和下一个表之间的文件.

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

  • 对于不添加/删除DROP TABLE,通过`table structure for table`注释匹配更有用,而不是通过CREATE TABLE进行匹配.这将确保如果忘记删除其DROP TABLE语句,则不会删除下一个表,并允许管道进行单命令表恢复(gzip | sed | mysql).但是,这个解决方案依赖于mysqldump注释语法(我不知道它是多么标准). (19认同)
  • 甜!请记住在顶部添加DROP TABLE并删除文件底部的DROP TABLE [下一个表]. (13认同)
  • 通过Olexa的修改,它是完美的:sed -n -e'/表结构.*`mytable /,/表结构为/ p'whole.sql> mytable.sql (11认同)
  • 这甚至比我的回答更好,因为它也会处理CREATE TABLE,但你应该用反引号搜索,以免得到另一个名为"thisismytabletoo"的表. (5认同)

bry*_*ryn 111

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

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
Run Code Online (Sandbox Code Playgroud)

  • 我建议至少在表名中添加反引号:`\`mytable \``以避免匹配表`mytable2`,就像我的情况一样. (8认同)
  • 对于那些不包含`DROP TABLE`的SQL文件(我的MySQL转储没有这个)可能想要使用:`sed -n -e'/ - 表``<Table Name> /,/ UNLOCK的表结构TABLES/p'<SQL File>> table.sql`这将使用MySQl转储中每个表之前提供的表注释,并确保像`/*!40101 SET @saved_cs_client = @@ character_set_client*/;`get这样的行包括在内. (5认同)
  • 这实际上是一个比上面选择的答案更好的解决方案.不敢相信它没有得到更多的赞成. (3认同)
  • 你救了我的屁股 (3认同)

小智 47

这可以更轻松地完成吗?我就这样做了:

创建临时数据库(例如恢复):

mysqladmin -u root -p create restore

恢复临时数据库中的完整转储:

mysql -u root -p restore <fulldump.sql

转储要恢复的表:

mysqldump恢复mytable> mytable.sql

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

mysql -u root -p database <mytable.sql

  • 对于非常庞大的数据库,它可能非常奇怪 - 为一个100 MB的表恢复150 GB的数据. (6认同)
  • 根据[此编辑建议](http://stackoverflow.com/review/suggested-edits/9403385),您应该添加“--one-database”参数,以确保您只恢复**一个**数据库并且不要破坏其他一切。 (4认同)
  • 这是大多数人所需要的. (2认同)
  • 非常糟糕的做法!我在转储中只有很少的数据库,并试图仅恢复一个,删除了所有其他数据库。 (2认同)

小智 11

一个简单的解决方案是简单地创建一个只想要单独恢复的表的转储.您可以使用mysqldump命令使用以下语法执行此操作:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql
Run Code Online (Sandbox Code Playgroud)

然后像往常一样导入它,它只会导入转储的表.


JCC*_*CyC 9

无论如何,执行该操作的任何进程都必须遍历转储的整个文本并以某种方式解析它.我只是为了

INSERT INTO `the_table_i_want`
Run Code Online (Sandbox Code Playgroud)

并将输出传递给mysql.看一下转储中的第一个表,确保你以正确的方式获得INSERT.

编辑:好的,这次格式正确.

  • 如果你认为你爱grep,当你学习awk时,你将成为它快乐的性奴隶:http://en.wikipedia.org/wiki/Awk (6认同)

小智 7

您应该尝试使用@bryn命令,但使用`delimiter,否则您还将提取具有前缀或后缀的表,这是我通常所做的:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql
Run Code Online (Sandbox Code Playgroud)

同样出于测试目的,您可能希望在导入之前更改表名:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql
Run Code Online (Sandbox Code Playgroud)

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

mysql -u root -p'password' mydatabase < mytable_restore.sql
Run Code Online (Sandbox Code Playgroud)


小智 6

  1. 备用

    $ mysqldump -A | gzip > mysqldump-A.gz
    
    Run Code Online (Sandbox Code Playgroud)
  2. 恢复单个表

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    
    Run Code Online (Sandbox Code Playgroud)