Đổi tên hoặc xoá cột không downtime
Lúc migration vừa chạy xong, code cũ vẫn đang phục vụ trên schema mới cho tới khi code mới qua health check. Health check fail thì code cũ ở lại luôn trên schema mới. Và sau khi migration đã chạy, rollback code về bản trước bị chặn (ROLLBACK_INCOMPATIBLE).
Vì vậy mỗi migration phải chạy được với cả code cũ lẫn code mới. DROP COLUMN hay đổi tên cột trong một lần deploy thì không, nên tách làm 3 lần.
Đổi tên cột: orders.note → orders.comment
Phần tiêu đề “Đổi tên cột: orders.note → orders.comment”| Deploy | Migration | Code |
|---|---|---|
| 1. Expand | ALTER TABLE orders ADD COLUMN comment text; |
Ghi cả hai cột, đọc comment rồi fallback note |
| 2. Backfill | UPDATE orders SET comment = note WHERE comment IS NULL; |
Giữ nguyên |
| 3. Contract | ALTER TABLE orders DROP COLUMN note; |
Chỉ dùng comment |
- Deploy 3 chỉ push khi deploy 2 đã
healthyvà không còn code nào đọcnote. - Bảng lớn: chia
UPDATEtheo khoảng id thành nhiều file để tránh lock lâu (MIGRATION_LOCK_TIMEOUT).
Xoá cột
Phần tiêu đề “Xoá cột”| Deploy | Migration | Code |
|---|---|---|
| 1 | Không có | Bỏ mọi chỗ đọc và ghi cột |
| 2 | ALTER TABLE … DROP COLUMN …; |
Giữ nguyên |
Cột NOT NULL không có DEFAULT: deploy 1 thêm migration ALTER TABLE … ALTER COLUMN … DROP NOT NULL; để code mới insert được khi không ghi cột đó.
Approve
Phần tiêu đề “Approve”UPDATE,DROP COLUMNvàDROP NOT NULLthuộc nhóm đổi hoặc xoá data: cần approve cả ở staging.- Rehearsal thấy sẽ mất data (
MIGRATION_DATA_LOSS): người duyệt gõ thêmCONFIRM_MIGRATIONtrên web. - Cần giữ data của cột: export trước deploy contract. Sau migration không restore về mốc trước đó được.