【发布时间】:2011-04-25 16:36:43
【问题描述】:
我有一个名为 forum.sql 的大型 mySQL 数据库转储。我只想恢复一张表,但是当我恢复整个数据库时,导入“post”表需要很长时间。
有没有什么选项可以跳过“post”表来恢复这个数据库?
【问题讨论】:
我有一个名为 forum.sql 的大型 mySQL 数据库转储。我只想恢复一张表,但是当我恢复整个数据库时,导入“post”表需要很长时间。
有没有什么选项可以跳过“post”表来恢复这个数据库?
【问题讨论】:
如果您从转储文件中恢复,您可以轻松地构建一个没有此表的新转储文件,只需写下行号。
首行
> 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 的减法
不干净,但有用
【讨论】:
我认为你做不到。但是您可以在必要时使用--tables myqsldump 选项单独转储表。因此,您可以为post 表生成一个转储,并为其余表生成另一个转储。
例子:
mysqldump -u USERNAME -pPASSWORD --tables TABLE_NAME database_name > TABLE_NAME.sql
【讨论】:
首先,使用零插入进行还原:
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>" &
nohup 命令将保持sh 命令运行,即使您退出 shell。如果您有一个需要相当长的时间来恢复的大型转储文件,这将非常方便。
grep 的 -v 标志将排除与该模式匹配的任何内容。
最后的&会将命令发送到后台。
【讨论】:
或者,使用sed从fulldump.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恢复。
【讨论】:
据我所知,没有。
您必须从转储文件中手动编辑不需要的表的CREATE 和INSERT 语句。
【讨论】:
您可以更改您的转储语句,使其使用忽略表? http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_ignore-table
【讨论】: