恢复mysql数据库时如何跳过表?

时间:2011-04-25 16:36:44

标签: mysql restore

我有一个名为forum.sql的大型mySQL数据库转储。我想只恢复一个表,但是当我恢复完整数据库时,导入“post”表需要很长时间。

是否有任何选项可以跳过“post”表来恢复此数据库?

6 个答案:

答案 0 :(得分:3)

如果要从转储文件进行恢复,只需写下行号,即可轻松构建没有此表的新转储文件。

初始线

> grep dumpfile.sql -ne "Dumping data for table \`avoid_tablename\`" -m 1
43:-- Dumping data for table `avoid_tablename`

总行数

> wc -l dumpfile.sql
63 dumpfile.sql

制作新文件

> head -n 43 dumpfile.sql > dumpfile-lite.sql
> tail -n 20 dumpfile.sql >> dumpfile-lile.sql

20来自减去63 - 43

不干净,但很有用

答案 1 :(得分:1)

我认为你不能这样做。但是,您可以使用--tables myqsldump选项在必要时单独转储表。因此,您可以为post表生成转储,为剩余的表生成另一个转储。

示例:

mysqldump -u USERNAME -pPASSWORD --tables TABLE_NAME database_name > TABLE_NAME.sql

答案 2 :(得分:1)

或者,使用fulldump.sqlsed中提取需要还原的表:

sed -n -e '/CREATE TABLE.*tableName1/,/CREATE TABLE/p' fulldump.sql > temp.sql
sed -n -e '/CREATE TABLE.*tableName2/,/CREATE TABLE/p' fulldump.sql >> temp.sql

...等

现在从temp.sql恢复。

答案 3 :(得分:0)

据我所知,没有。

您必须手动编辑转储文件中不需要的表的CREATEINSERT语句。

答案 4 :(得分:0)

您可以更改转储语句,以便它使用忽略表吗? http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_ignore-table

答案 5 :(得分:0)

恢复单个表

首先,使用零插入执行恢复:

cat dump.sql | grep -v '^INSERT INTO' | mysql -u <user> -p<pw> <dbname>

在此处使用grep -v将排除与模式匹配的任何语句。在这种情况下,模式使用^来匹配行的开头。结果应该是一个没有数据的恢复模式。

接下来,只恢复所需的INSERT语句:

cat dump.sql | grep '^INSERT INTO \\\`<table>\\\`' | mysql -u <user> -p<pw> <dbname>

这将仅恢复名为<table>的表的数据。注意三重反斜杠。你需要一个反斜杠来逃避反击,然后你需要用另外两个反斜杠来逃避反斜杠。

恢复除一个表

之外的所有内容

当我想要恢复整个数据库但是从一两个表中排除数据时,我一直使用的另一种技术是...你可以通过将转储传递给一个来过滤掉任何不需要的INSERT语句在推入数据库之前进行过滤。以下是使用grep作为过滤器的示例:

nohup sh -c "cat dump.sql | grep -v 'INSERT INTO \\\`<table>\\\`' | mysql -u <user> -p<pw> <dbname>" &

即使您退出shell,nohup命令也会使sh命令保持运行。如果你有一个需要很长时间才能恢复的大型转储文件,这可能非常方便。

-v的{​​{1}}标记将排除与该模式匹配的任何内容。

最后的grep会将命令发送到后台。