如何在不停机的情况下对实时数据库进行架构更改?
例如,假设我有一个Postgresql数据库,其中包含各种用户数据(如电子邮件地址等),这些数据都与特定用户相关联.如果我想将电子邮件地址移动到新的专用表,我必须更改架构,然后将电子邮件数据迁移到新表.如何在不停止写入原始表的情况下完成此操作?当数据从旧表写入新表时,新数据将继续写入旧表并被遗漏,对吧?
我想这个问题经常出现,但我找不到任何标准的解决方案来处理它.
This article处理问题,但我并不真正理解第3步.他说要写入两个表,然后将旧数据从第一个表迁移到新表.您如何确保只迁移旧数据?
(我用的是PostgreSQL on Heroku.)
你几乎已经得到了答案:
>并行创建新结构
>开始写两个结构
>将旧数据迁移到新结构
>只写和读新结构
>删除旧列
至于第3步,使用这样的东西(在一次交易中):
插入尚未存在的内容:
INSERT INTO new_tbl (old_id,data) SELECT old_id,data FROM old_tbl WHERE NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);
在此期间更新已更改的内容:
UPDATE new_tbl SET data = old.data USING old_tbl WHERE new_tbl.old_id = old_tbl.old_id AND new_tbl.data IS DISTINCT FROM old_tbl.data;
不会触及新数据,因为它在两个地方都是相同的.