我有一个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'

其他回答

Get a decent text editor like Notepad++ or Vim (if you're already proficient with it). Search for the table name and you should be able to highlight just the CREATE, ALTER, and INSERT commands for that table. It may be easier to navigate with your keyboard rather than a mouse. And I would make sure you're on a machine with plenty or RAM so that it will not have a problem loading the entire file at once. Once you've highlighted and copied the rows you need, it would be a good idea to back up just the copied part into it's own backup file and then import it into MySQL.

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

INSERT INTO `the_table_i_want`

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

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

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

您可以尝试使用sed,以便只提取所需的表。

假设你的表名为mytable,文件名为mysql。Dump是包含你的巨大转储的文件:

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

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

然后可以调整文件mytable。其中包含表mytable的结构和数据(一个INSERT列表)。

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

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

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

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

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