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
答案 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文件。