我们要运行大型架构迁移,并且我们不希望该站点长时间停机,因此我们尝试动态执行此操作,而无需锁定所涉及的表。所涉及的表只能在一天中的特定时间写入,所以我们有一个窗口,我们可以负担得起写锁;虽然很多mysql文档声称ALTER TABLE
应该只写锁表,但根据我们的经验,任何非常重要的事情,如添加索引读取锁定它。
因此,我们必须手动进行迁移。我们在以下程序中取得了一些成功:
CREATE TABLE new_mytable LIKE mytable;
new_mytable
mysqldump -t mydb mytable > mytable.sql
mytable.sql
以插入new_mytable
mysql mydb < mytable.sql
mytable
上 - 它们不会被CREATE TABLE ... LIKE ...
new_mytable
RENAME TABLE mytable TO old_mytable, new_mytable TO mytable
DROP TABLE old_mytable
正如我所说,所涉及的表格只在一天中的特定时间写入,所以我们确定数据保持一致 - 否则我们不会梦想尝试类似的东西。即便如此,我们遇到了一个问题。到目前为止,我们只在FK指向外的桌子上尝试过。今天我在一张桌子上试了一下,其他几张桌子都提到了这张桌子。当我丢弃旧表时,我被告知外键约束失败,并且看到引用表现在引用旧表时感到震惊。
现在,我们可以放弃FK并将它们重新添加到新的FK中,但这个过程非常脆弱。有很多表指向这个;并重新添加密钥可能会给我们读锁。我们确定 - 某些 - 新表包含与第一个相同的所有数据,所以最好的方法是更改这些FK的引用而不删除和添加它们。有没有办法操纵数据库,以便更改现有的FK以引用新表?
答案 0 :(得分:1)
如果您知道如何更改表格本身。
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
...Alter the tables and change the keys
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;