Simulating MySql 5.7 delete query

时间:2017-03-30 18:36:27

标签: mysql sql-delete

I am working on purging a huge database (~ 1TB data ) with over 10 million records using InnoDB engine. Whoever set up the database schema, set the foreign keys but did not set on delete cascade. I want to do a selective time based purge. Two parts to my question

  1. Can I set "on delete cascade" without any side-effects ?
  2. Can I simulate my delete to check for foreign key reference violation ? I know I can use START TRANSACTION and ROLLBACK
    TRANSACTION, but it is not something I am looking for

1 个答案:

答案 0 :(得分:1)

1000万条记录很小。

1TB是巨大的。

这指向使用巨大的BLOB。将巨大的BLOB存储在数据库中总是一个好主意:每个人都知道备份时间越长越好。

现在,

  

我可以在没有任何副作用的情况下设置“删除级联”吗?

是的,只要你不删除任何东西......

  

我可以模拟删除以检查外键引用违规吗?我知道我可以使用START TRANSACTION和ROLLBACK   TRANSACTION,但它不是我要找的东西

是的,但ROLLBACK可能只需要你取消的操作,如果不是更多,最好的事情是......你不能打断它!你将坐在你的终端前......你不知道什么时候会结束!

现在,无论是“ON DELETE CASCADE”并且它都不会失败,如果你把它搞砸了它只会继续删除几天,或者它是ON DELETE RESTRICT它会在第一行失败尝试删除,没有什么可以回滚,所以它会很快。这两种情况都不会“模拟”任何有用的东西。

或者它是ON DELETE SET NULL,你的数据库最终搞砸了。

现在,如果你有大量的BLOB,并且你想在数据库中乱七八糟,这就是我的建议:制作数据库的副本,但没有BLOB。你知道,CREATE TABLE LIKE ...然后INSERT INTO SELECT。只需删除巨大的BLOB列。然后你可以随心所欲地练习,检查你的查询是否真的删除了正确的东西......

注意:如果删除90%的数据库,请考虑创建新表(使用INSERT INTO SELECT仅选择要保留的行)而不是DELETE。因为DELETE不会缩小文件。

关于那个:先考虑一下。如果你想要保存在新数据库中的内容,请阅读文档(我不记得详细信息),但也许你需要创建一个表空间或类似的东西,所以稍后你可以清除旧的1TB几乎空的ibdata文件。