我有50GB的mysql数据库(80个表),我需要从中删除一些内容。 我有一个参考表,其中包含需要从其他表中删除的产品ID的列表。
现在,其他表各为2 GB,包含需要删除的项目。
我的问题是:由于它不是一个小型数据库,最安全的删除方式是什么 为了避免问题,一次性使用数据?
验证整个数据被删除的最佳方法是什么?
答案 0 :(得分:1)
可能这不再有用了。但是在创建数据库时应该记住这一点。在mysql中(取决于表存储类型,例如在InnoDB中),您可以指定关系(它们被称为foreign key constraints)。这些关系意味着如果从一行(例如产品)中删除条目,则可以自动更新或删除将该行作为外键(例如product_storage)的其他表中的条目。这些关系保证你有100%的一致状态。然而,事后看来,这些关系可能很难补充。如果您打算更频繁地这样做,那么如果您可以将这些添加到您的数据库中,绝对值得研究,它们将为您节省大量工作(各种查询变得更简单)
如果没有这些关系,你就无法100%肯定。因此,您必须遍历所有表,而不是要检查哪些列,并编写一堆sql查询以确保没有条目。
答案 1 :(得分:1)
正如Thirler指出的那样,如果你有外键会很好。如果没有它们,burnall的解决方案可以用于事务处理,以确保不会出现任何不一致的情况。
无论你如何做,这可能需要很长时间,甚至数小时,所以请为此做好准备。
答案 2 :(得分:1)
正如前面所指出的,外键在这个地方会很好。但是对于问题1,您可以在MySQL提示符下的事务中运行更改。这假设您正在使用InnoDB之类的事务安全存储引擎。如果需要,您可以从myisam转换为InnoDB。无论如何这样的事情:
START TRANSACTION;
...Perform changes...
...Control changes...
COMMIT;
...or...
ROLLBACK;
有任何停机时间可以接受吗?
使用数据库> 250Gb的PostgreSQL时,我们在生产服务器上使用此技术以执行数据库更改。如果结果不如预期,我们只是回滚交易。当然,由于I / O系统必须工作一点,因此会受到惩罚。
//约翰
答案 3 :(得分:0)
我同意Thirler的说法,使用外键是可取的。它保证了整个数据库的参照完整性和一致性 我相信生活有时需要更复杂的逻辑。 所以你可以使用像
这样的手动查询delete from a where id in (select id from keys)
您可以一次删除所有记录,也可以按键范围删除所有记录,或者在DELETE中使用LIMIT。适当的指数是必须的。 要验证一致性,您需要功能或查询。例如:
create function check_consistency() returns boolean
begin
return not exists(select * from child where id not in (select id from parent) )
and not exists(select * from child2 where id not in (select id from parent) );
-- and so on
end
答案 4 :(得分:0)
也许可以研究一下MySQL表中的分区。有关更多信息,请查看参考手册:
http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
归结为您可以按日期时间值或索引集在不同分区中划分表(例如)。