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


当前回答

这也可能有所帮助。

# 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'

其他回答

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

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

不管怎样,任何这样做的进程都必须遍历转储的整个文本,并以某种方式解析它。我只要grep

INSERT INTO `the_table_i_want`

并将输出导入mysql。看一下之前转储中的第一个表,以确保您以正确的方式获取INSERT。

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

我欣赏这里的一些独创性,但实际上根本没有理由使用sed来解决OP的问题。

注释“use——one-database”是正确答案,内置在MySQL/MariaDB中。不需要第三方黑客。

Mysql -u root -p databasename——one-database < localhost。SQL将只导入所需的数据库。

我还发现,在某些情况下,当使用它来导入一系列数据库时,它会在列表中为我创建下一个数据库(但不会在其中放入任何东西)。不知道为什么它这样做,但它使恢复更容易。

使用此命令,交互式地输入密码,它将导入所请求的数据库。

我尝试了一些选择,它们都非常慢。这将在几分钟内将一个360GB的转储拆分到它的表中:

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

表应该在转储和数据库中呈现相同的结构。

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

or

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`