MYSQL批量删除80个表

时间:2010-02-11 08:39:29

标签: mysql transactions dependencies

我有50GB的mysql数据库(80个表),我需要从中删除一些内容。 我有一个参考表,其中包含需要从其他表中删除的产品ID的列表。

现在,其他表各为2 GB,包含需要删除的项目。

  1. 我的问题是:由于它不是一个小型数据库,最安全的删除方式是什么 为了避免问题,一次性使用数据?

  2. 验证整个数据被删除的最佳方法是什么?

5 个答案:

答案 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

归结为您可以按日期时间值或索引集在不同分区中划分表(例如)。