[英]Is this zero-downtime database migration plan viable?
我正在考虑执行零停机时间的数据库迁移,并提出了最少的必要步骤。
“迁移”是指同一数据库中不向后兼容的任何更改,例如重命名、拆分或删除列。
由于我在其他地方找不到太多信息,因此我想与有这方面实践经验的人验证我的推理。 假设我们有能力执行滚动部署,否则我不相信零停机时间的数据库迁移是可能的。 所以:
table1.oldColumn
table1.oldColumn
重命名为table1.newColumn
,停机时间为零脚步:
创建table1.newColumn
: ALTER TABLE table1 ADD COLUMN newColumn(...)
逐步部署 V2。 V2 代码包含以下更改:
SELECT oldColumn FROM table1 WHERE userId = 1001
。 那是因为现在只有oldColumn
包含完整数据,而newColumn
只包含它的一个子集oldColumn
复制。 如果我们不这样做,我们将永远追逐不断变化oldColumn
INSERT INTO table1 (oldColumn, newColumn) VALUES ('abcd', 'abcd')
DELETE FROM table1 WHERE userId = 1001
DELETE FROM table1 WHERE oldColumn = 'xyz'
现在所有新数据始终保持同步, oldColumn
和newColumn
之间仍然存在差异。 为了消除oldColumn
和newColumn
之间的差异,我们运行一个后台脚本,从oldColumn
复制newColumn
中缺少的值
现在列已同步,逐步部署 V3。 V3 代码包含以下更改:SELECT、UPDATE、INSERT 和 DELETE 现在转到newColumn
。 table1.oldColumn
不再使用
删除未使用的table1.oldColumn
: ALTER table1 DROP COLUMN oldColumn
注意:步骤 3 和 5 可以在 V2 和 V3 启动期间作为数据库迁移的一部分执行
回顾:
newColumn
为空,所有数据都转到oldColumn
oldColumn
一起newColumn
。 此时,一些数据仍仅流入oldColumn
(因为我们正在执行滚动更新,因此并非所有实例都是 V2)oldColumn
和newColumn
中流动。 我们镜像更新和插入以保持列同步oldColumn
之前将一些数据插入到newColumn
中,并且一些数据是从滚动更新期间存在的剩余 V1 实例中获取的。 我们必须摆脱这种差异oldColumn
中缺少的newColumn
中的数据复制到那里您对术语的使用有点令人困惑,因为您所描述的不是通常使用的术语“迁移”。 此外,不清楚您所描述的需要零停机时间的要求是什么。 停机意味着使某些东西在一段时间内不可用; 您可以在不使该表对用户不可用的情况下从表中添加/删除列,因此更改需要零停机时间 - 但显然任何引用已删除列的查询将不再有效。
如果您想在不破坏任何内容的情况下更改数据库结构,那么您需要控制访问数据库的所有内容(这不太可能),并且您可以一次性部署数据库更改以及受其影响的所有内容 - 或者您可以保护用户通过使用隐藏数据库实现并只允许用户访问视图的视图来避免更改。
如果您所做的更改非常重要以至于无法隐藏在视图定义更改中,那么您可能别无选择,只能将此更改传达给您的用户,他们都需要通过适当的 SDLC 来确定更改是否会影响他们并更新他们的代码(如果有的话)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.