删除转储SQL文件中的记录



我有一个名为my_dump.sql的转储sql文件.

在该转储文件中有各种表。我感兴趣的是名为foo_bars的表,它有很多记录。我想修改这个sql文件,执行以下操作:

  • 保留foo_bars表结构,但从sql文件中删除所有记录。

结果:当我通过这个sql文件创建一个新的数据库时,它正确地有foo_bars表,但所有的记录都不见了。

注意:我意识到我可以创建一个具有所有foo_bars表记录完整的新数据库,然后在创建数据库后发出delete语句。但我不想这样做,因为有大量的记录。我宁愿删除记录事先从sql文件。

我该怎么做呢?

您是否仍然可以访问获得转储文件的源MySQL实例?您可以使用--no-data选项创建一个新的转储文件。这将转储表定义,后面没有任何INSERT语句。

另一个棘手的选择:编辑转储文件并更改表选项以添加ENGINE=BLACKHOLE(替换该表上现有的引擎选项,如果有的话)。然后将处理以下所有INSERT语句,但不会占用任何存储空间。

完成转储文件的处理后,运行ALTER TABLE foo_bars ENGINE=InnoDB;将表更改回InnoDB(或者任何你想使用的引擎,但我更喜欢InnoDB)。

阅读更多关于BLACKHOLE的信息:https://dev.mysql.com/doc/refman/8.0/en/blackhole-storage-engine.html

你还没有展示你想用这种方式处理的表,所以我不能保证你的表将与黑洞引擎兼容。我想不出任何潜在的不兼容,但我还没有试过,所以我不能确定。

我不确定这个方法是否对你有帮助,因为正如你所说,所有的记录都消失了。搜索my_dump.sql将所有INSERT INTO foo_bars命令的文件替换为INSERT IGNORE INTO foo_bars,这样就不会将所有重复的记录插入到表中。让我知道它是否有效

我认为Bill Karwin的解决方案是最好和最快的。你也可以这样做:

在插入foo_bars之前编辑您的转储文件

START TRANSACTION;
SET autocommit = 0;

插入foo_bars的最后一条insert语句结束后

ROLLBACK;
SET autocommit = 1;

您可以在这里阅读更多关于autocommit模式,ROLLBACK和事务:https://dev.mysql.com/doc/refman/8.0/en/commit.html


如果转储太大而无法编辑,您也可以删除表并重新创建,这比删除记录要快。

最新更新