如何从大型 SQL 文件中删除一些表?

如何从大型 SQL 文件中删除一些表?

我有一个大小约为 3 GB 的 SQL 文件。因此,每次我从生产中获取最近的转储时,这都需要很长时间才能恢复。

在这个表中,“access_log”本身占用了 2.2 GB,这只是一个日志。出于测试目的,将该表清空是可以的。在恢复数据库时,有没有什么方法可以避免使用该表。

我的恢复命令如下

mysqldump -u uname -p pwd --no-data site_name_com | awk '/DROP TABLE/ { print }' | mysql -u uname -p pwd site_name_com && mysql -u uname -p pwd site_name_com < /..file_path../..file_name.sql

如何进行排除某个特定表的数据库转储?

答案1

输出mysqldump格式只是一长串 SQL 命令,旨在反馈到mysql程序中。

您可以用来mysqldump --ignore-table=<database>.<table>创建根本不包含access_log表的转储。

然后您就可以用mysqldump --no-data=true它来转储表的结构access_log

如果将两者连接起来,您将得到一个不包括表数据的完整转储脚本access_log

只要您只需要对一个或几个表执行此操作,并控制原始 mysqldump 调用,那应该是一个实用的解决方案。

在 Google 上搜索mysqldump 排除表,这让我想到了我主要的灵感来源,那就是使用 mysqldump 跳过某些表Stack Overflow 问题,以及其公认的答案

答案2

如果您有一个由 生成的 SQL 文件mysqldump,它应该包含注释,指示下一行的作用。

例子:

--
-- Table structure for table `access_log`
--

我们可以使用它们在将文件流式传输到 mysql 命令时过滤掉语句范围。

例如,为了忽略两个CREATE TABLE语句之间的任何内容,我们可以执行以下操作:

cat backup.sql | sed '/Dumping data for table `first_table_to_skip`/,/Dumping data for table `next_table_to_include`/d' | mysql

这个答案有关 sed 此功能的更多信息。

相关内容