【问题标题】:How to skip a table when restoring mysql database?恢复mysql数据库时如何跳过表?
【发布时间】:2011-04-25 16:36:43
【问题描述】:

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

有没有什么选项可以跳过“post”表来恢复这个数据库?

【问题讨论】:

标签: mysql restore


【解决方案1】:

如果您从转储文件中恢复,您可以轻松地构建一个没有此表的新转储文件,只需写下行号。

首行

> 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 的减法

不干净,但有用

【讨论】:

  • 这可以在不知道文件总行数的情况下完成。 tail -n +43 output_file 处理大文件时很有帮助
【解决方案2】:

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

例子:

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

【讨论】:

  • 感谢回复我知道我只能转储表但我想恢复数据库其他表
【解决方案3】:

恢复单个表

首先,使用零插入进行还原:

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>

这将只恢复名为&lt;table&gt; 的表的数据。注意三个反斜杠。你需要一个反斜杠来转义一个反斜杠,然后你需要用两个反斜杠来转义反斜杠。

恢复除一张表之外的所有内容

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

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

nohup 命令将保持sh 命令运行,即使您退出 shell。如果您有一个需要相当长的时间来恢复的大型转储文件,这将非常方便。

grep-v 标志将排除与该模式匹配的任何内容。

最后的&amp;会将命令发送到后台。

【讨论】:

    【解决方案4】:

    或者,使用sedfulldump.sql提取需要恢复的表:

    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恢复。

    【讨论】:

      【解决方案5】:

      据我所知,没有。

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-07
          • 2010-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-25
          • 1970-01-01
          • 2019-07-04
          相关资源
          最近更新 更多