零停机迁移策略:通过影子表与渐进式模式迁移改造生产数据库
超越简单的<code>migrate</code>命令,学习如何在不锁表、不中断服务的情况下执行高风险迁移(如重命名列、修改约束)。使用影子表、触发器、双写策略实现平滑过渡。 · 难度:入门 · +10XP
零停机迁移策略
本教程实现一个ZeroDowntimeMigration基类,它自动创建影子表(_new后缀),通过触发器保持与原始表同步。迁移分四阶段:创建影子表、开启双写、数据回填、切换表。最后删除旧表。所有操作通过Django的RunSQL和SeparateDatabaseAndState管理,确保django_migrations状态一致。
from django.db import migrations, models
def forward(apps, schema_editor):
# 1. 创建影子表
schema_editor.execute('CREATE TABLE app_model_new (...);')
# 2. 创建触发器保持同步
schema_editor.execute('''
CREATE TRIGGER sync_trigger AFTER INSERT ON app_model
FOR EACH ROW BEGIN INSERT INTO app_model_new VALUES (NEW.*); END;
''')
# 3. 批量回填历史数据
schema_editor.execute('INSERT INTO app_model_new SELECT * FROM app_model;')
# 4. 原子切换
schema_editor.execute('RENAME TABLE app_model TO app_model_old, app_model_new TO app_model;')
class Migration(migrations.Migration):
operations = [
migrations.SeparateDatabaseAndState(state_operations=[], database_operations=forward)
]