MySQL导入数据库但忽略特定的表

Dan*_*ard 38 mysql mysqldump mysqlimport

我有一个包含一个数据库和大约150个表的大型SQL文件.我想mysqlimport用来导入该数据库,但是,我希望导入过程忽略或跳过几个表.导入所有表的正确语法是什么,但忽略其中一些?谢谢.

Don*_*Don 120

RandomSeed接受的答案可能需要很长时间!导入表(只是稍后删除)可能非常浪费,具体取决于大小.

对于使用创建的文件

mysqldump -u user -ppasswd --opt --routines DBname > DBdump.sql
Run Code Online (Sandbox Code Playgroud)

我目前得到一个大约7GB的文件,其中6GB是日志表的数据,我不需要在那里; 重新加载此文件需要几个小时.如果我需要重新加载(为了开发目的,或者如果需要进行实时恢复),我将浏览文件:

sed '/INSERT INTO `TABLE_TO_SKIP`/d' DBdump.sql > reduced.sql
Run Code Online (Sandbox Code Playgroud)

并重新加载:

mysql -u user -ppasswd DBname < reduced.sql
Run Code Online (Sandbox Code Playgroud)

这给了我一个完整的数据库,创建了"不需要的"表但是空的.如果你真的不想要这些表,只需在加载完成后删除空表.

对于多个表,您可以执行以下操作:

sed '/INSERT INTO `TABLE1_TO_SKIP`/d' DBdump.sql | \
sed '/INSERT INTO `TABLE2_TO_SKIP`/d' | \
sed '/INSERT INTO `TABLE3_TO_SKIP`/d' > reduced.sql
Run Code Online (Sandbox Code Playgroud)

有一个'gotcha' - 注意转储中可能包含"INSERT INTO TABLE_TO_SKIP"的过程.

  • 考虑````sed -r```选项和一个RegExp,如果你想一次消除更多的表,比如:````sed -r'/ INSERT INTO`(TABLE1_TO_SKIP | TABLE2_TO_SKIP)`/ d'DBdump .sql> reduced.sql``` (16认同)
  • 这是天才,1小时到30秒. (7认同)
  • 哇!!!真棒,我只是将备份从1GB减少到72MB,为我节省了很多时间,谢谢 (4认同)
  • 对于 windows 查找“sed for windows” - 现在可以在这里找到:http://gnuwin32.sourceforge.net/packages/sed.htm - 并使用双引号而不是单引号作为命令 (4认同)
  • 比接受的答案更好,谢谢 (2认同)
  • 只是FLY:`TABLE_TO_SKIP`区分大小写,通常是`table_to_skip` :) (2认同)

Ran*_*eed 10

mysqlimport不是导入SQL语句的正确工具.此工具用于导入格式化的文本文件,例如CSV.您要做的是mysql使用如下命令将sql转储直接提供给客户端:

bash > mysql -D your_database < your_sql_dump.sql
Run Code Online (Sandbox Code Playgroud)

既不提供您需要的功能mysql也不mysqlimport提供.你最好的机会是导入整个转储,然后丢弃你不想要的表.

如果您可以访问转储来自的服务器,那么您可以创建一个新的转储mysqldump --ignore-table=database.table_you_dont_want1 --ignore-table=database.table_you_dont_want2 ....


向下滚动以获得更好的选择


fes*_*skr 10

对于任何使用 .sql.gz 文件的人;我发现以下解决方案非常有用。我们的数据库是 25GB+,我不得不删除日志表。

gzip -cd "./mydb.sql.gz" | sed -r '/INSERT INTO `(log_table_1|log_table_2|log_table_3|log_table_4)`/d' | gzip > "./mydb2.sql.gz"
Run Code Online (Sandbox Code Playgroud)

感谢 Don 的回答和 Xosofox 的评论以及这篇相关帖子: 使用 zcat 和 sed 或 awk 编辑压缩的 .gz 文本文件


dGo*_*dGo 5

有点老了,但我想它仍然会派上用场......

我喜欢@Don的回答(/sf/answers/1846566221/),但发现它非常烦人,你必须先写入另一个文件......
在我的特殊情况下,这会花费太多时间并且椎间盘空间

所以我写了一个小 bash 脚本:

#!/bin/bash

tables=(table1_to_skip table2_to_skip ... tableN_to_skip)


tableString=$(printf "|%s" "${tables[@]}")
trimmed=${tableString:1}
grepExp="INSERT INTO \`($trimmed)\`"

zcat $1 | grep -vE "$grepExp" | mysql -uroot -p
Run Code Online (Sandbox Code Playgroud)

这不会生成新的 sql 脚本,而是将其直接通过管道传输到数据库
,它确实创建表,只是不导入数据(这是我在处理巨大日志表时遇到的问题)