我有我的mysql数据库的mysqldump备份,该数据库由我们的所有表组成,大约440兆。我想从mysqldump恢复仅其中一个表的内容。这可能吗?从理论上讲,我可以剪掉重建所需表的部分,但我什至不知道如何有效地编辑该大小的文本文档。
你可以尝试使用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.dump
包含表结构mytable
和数据(的列表INSERT
)的文件。
这比我的回答还要好,因为它也处理了CREATE TABLE,但是您应该使用反引号进行搜索,以免获得另一个称为“ thisismytabletoo”的表。
真的。我不确定所有mysql转储中的表名是否总是被反引号包围,或者“ CREATE TABLE mytable”是否也可能。如果我们知道转储的样子,我们可以轻松地适应第一个正则表达式。第二个问题可能是表mytable不是唯一的(一个在数据库db1中,另一个在数据库db2中)。两者都将导出到文件mytable.dump中。如果表不是唯一的,我们可以使用相同的sed命令,首先使用CREATE DATABASE以便仅提取正确的数据库。然后,将sed命令与CREATE TABLE一起使用。
甜的!请记住,在文件顶部添加DROP TABLE,在文件底部删除DROP TABLE [next table]。
对于不添加/删除DROP TABLE的情况,通过
Table structure for table
注释匹配而不是通过CREATE TABLE进行匹配更加有用。这样可以确保即使忘记删除其DROP TABLE语句也不会删除下一个表,并允许通过管道进行单命令表还原(gzip | sed | mysql)。但是,此解决方案取决于mysqldump注释语法(我不知道它的标准程度)。通过Olexa的修改,它是完美的:sed -n -e'/*.mytable/的表结构,/// p的表结构'Whole.sql> mytable.sql