首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在恢复mysql数据库时跳过表?

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

Stack Overflow用户
提问于 2011-04-26 00:36:44
回答 6查看 14.1K关注 0票数 1

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

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

EN

回答 6

Stack Overflow用户

发布于 2014-02-13 20:24:33

如果要从转储文件恢复,只需写下行号,就可以轻松地构建一个新的转储文件,而不需要这个表。

起始线

代码语言:javascript
复制
> grep dumpfile.sql -ne "Dumping data for table \`avoid_tablename\`" -m 1
43:-- Dumping data for table `avoid_tablename`

总行数

代码语言:javascript
复制
> wc -l dumpfile.sql
63 dumpfile.sql

创建一个新文件

代码语言:javascript
复制
> head -n 43 dumpfile.sql > dumpfile-lite.sql
> tail -n 20 dumpfile.sql >> dumpfile-lile.sql

20来自减法63 - 43

不干净,但很有用

票数 4
EN

Stack Overflow用户

发布于 2011-04-26 00:48:32

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

示例:

代码语言:javascript
复制
mysqldump -u USERNAME -pPASSWORD --tables TABLE_NAME database_name > TABLE_NAME.sql
票数 1
EN

Stack Overflow用户

发布于 2018-03-17 03:27:51

恢复单个表

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

代码语言:javascript
复制
cat dump.sql | grep -v '^INSERT INTO' | mysql -u <user> -p<pw> <dbname>

在这里使用grep -v将排除任何与模式匹配的语句。本例中的模式使用^在行首进行匹配。结果应该是一个恢复后的模式,其中没有数据。

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

代码语言:javascript
复制
cat dump.sql | grep '^INSERT INTO \\\`<table>\\\`' | mysql -u <user> -p<pw> <dbname>

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

恢复除一个表之外的所有表

当我想要恢复整个数据库,但从一两个表中排除数据时,我经常使用的另一种技术是...在推送到数据库之前,您可以通过筛选器将转储传递出去,从而过滤掉任何不需要的INSERT语句。下面是一个使用grep作为过滤器的示例:

代码语言:javascript
复制
nohup sh -c "cat dump.sql | grep -v 'INSERT INTO \\\`<table>\\\`' | mysql -u <user> -p<pw> <dbname>" &

即使您从nohup注销,shell命令也会使sh命令保持运行。如果您有一个很大的转储文件,需要相当长的时间才能恢复,那么这会非常方便。

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

末尾的&会将命令发送到后台。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5780575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档