我有一个名为forum.sql的大型mySQL数据库转储。我想只恢复一个表,但是当我恢复完整数据库时,导入“post”表需要很长时间。
是否有任何选项可以跳过“post”表来恢复此数据库?
答案 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.sql
从sed
中提取需要还原的表:
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)
据我所知,没有。
您必须手动编辑转储文件中不需要的表的CREATE
和INSERT
语句。
答案 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
会将命令发送到后台。