我有一个名为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
如果转储太大而无法编辑,您也可以删除表并重新创建,这比删除记录要快。