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

发布于 2024-11-03 06:30:35 字数 111 浏览 2 评论 0原文

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

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

I have a big mySQL database dump named forum.sql. I want to restore only one table, but when I restore the full database, it takes a long time to import the "post" table.

Is there any option to restore this database skipping the "post" table?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

轮廓§ 2024-11-10 06:30:35

如果要从转储文件恢复,则无需此表即可轻松构建新的转储文件,只需记下行号即可。

初始行

> 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

不干净,但有用

If you are restoring from a dump file, you can easily build a new dumpfile without this table, just by writting down the line numbers.

Initial line

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

Total lines

> wc -l dumpfile.sql
63 dumpfile.sql

Make a new file

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

20 comes from substracting 63 - 43

not clean, but usefull

段念尘 2024-11-10 06:30:35

或者,使用 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

...etc

现在从 temp.sql 恢复>。

Alternatively, extract the table(s) that need to be restored from fulldump.sql using 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

...etc

Now restore from temp.sql.

一张白纸 2024-11-10 06:30:35

恢复单个表

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

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>

这将仅恢复名为 的表的数据。请注意三个反斜杠。您需要一个反斜杠来转义反斜杠,然后您需要用另外 2 个反斜杠来转义反斜杠。

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

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

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

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

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

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

Restore a single table

First, do the restore with zero inserts:

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

Using grep -v here will exclude any statements matching the pattern. The pattern in this case uses ^ to match at the beginning of a line. The result should be a restored schema with zero data.

Next, restore only your desired INSERT statements:

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

That will restore data only for the table named <table>. Note the triple backslashes. You need a backslash to escape a backtick and then you need to escape the backslash with 2 more backslashes.

Restore everything except one table

Another technique I use all the time when I want to restore an entire database but exclude the data from a table or two is this... You can filter out any unwanted INSERT statements by passing your dump through a filter before pushing into the db. Here's an example using grep as the filter:

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

The nohup command will keep the sh command running even if you log out of your shell. That can be pretty handy if you have a large dump file that will take quite some time to restore.

The -v flag for grep will exclude anything matching the pattern.

The & at the end will send the command to the background.

随梦而飞# 2024-11-10 06:30:35

据我所知,没有。

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

As far as I know, no.

You would have to manually edit the CREATE and INSERT statements of the undesired table out of the dump file.

等数载,海棠开 2024-11-10 06:30:35

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

例子:

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

I don't think you can do it. But you can dump tables separately when necessary, using --tables myqsldump option. So, you can generate a dump for post table and another dump for the remaining tables.

Example:

mysqldump -u USERNAME -pPASSWORD --tables TABLE_NAME database_name > TABLE_NAME.sql
半山落雨半山空 2024-11-10 06:30:35

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

You could alter your dump statement so that it uses ignore table? http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_ignore-table

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文