2010-02-11 47 views
5

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

现在,其他表格可以是每个2 GB,包含需要删除的项目。

  1. 我的问题是:因为这是一个不小的数据库,什么是删除 为了避免出现问题一次性数据的最安全的方法?

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

回答

0

我同意Thirler使用外键是可取的。它保证了整个数据库的参照完整性和一致性。
我可以相信生活有时需要更棘手的逻辑。 所以,你可以使用手动查询,如

delete from a where id in (select id from keys) 

你可以一次或键的范围或删除使用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 
1

可能这对我们没有帮助了。但是在创建数据库时应该牢记这一点。在mysql中(取决于表存储类型,例如在InnoDB中),您可以指定关系(它们被称为foreign key constraints)。这些关系意味着,如果从一行(例如产品)中删除条目,则可以自动更新或删除其他表中具有该行作为外键的条目(例如product_storage)。这些关系警惕你有100%一致的状态。但事后看来,这些关系可能难以加以补充。如果你打算经常这样做,如果你可以将它们添加到你的数据库中,这将是非常值得研究的,它们将为你节省很多工作(各种查询变得更简单)

没有这些关系,你不能百分百肯定。所以你必须查看所有表格,而不是查看哪些列,然后编写一堆sql查询以确保没有任何条目。

1

正如Thirler指出的那样,如果你有外键,那将会很好。如果没有他们,可以使用burnall的解决方案进行交易,以确保没有不一致性。

无论你怎么做,这可能需要很长时间,甚至几小时,所以请为此做好准备。

1

正如前面指出的,外键在这个地方会很好用。但是关于问题1,您可以在MySQL提示符下运行事务中的更改。这假设你正在使用像InnoDB这样的事务安全存储引擎。如果需要,您可以从myisam转换到InnoDB。无论如何这样的事情:

START TRANSACTION; 

...Perform changes... 
...Control changes... 

COMMIT; 
...or... 
ROLLBACK; 

是否可以接受任何停机时间?

当使用数据库> 250Gb的PostgreSQL处理时,我们在生产服务器上使用此技术来执行数据库更改。如果结果不符合预期,我们只会回滚交易。当然,由于I/O系统必须工作一点,这是一种惩罚。

// John