Lesson 57 — Database Migrations
Ba module tương tác: (1) Migration timeline — apply up/down, theo dõi version &
bảng schema_migrations; (2) Expand-contract — animate đổi tên cột
zero-downtime qua 5 phase; (3) Lock impact — CREATE INDEX có và
không CONCURRENTLY.
① Migration timeline — up / down / goto
Database nhớ version cao nhất đã apply. up chạy các migration chưa apply theo thứ tự tăng; down đảo ngược theo thứ tự giảm.
Database đang ở version 0 (trống). Bấm up để apply migration đầu tiên.
Bảng schema_migrations
| version | dirty |
|---|---|
| 0 | false |
Schema hiện có
(trống)
② Expand-contract — đổi tên cột zero-downtime
Đổi users.name → users.full_name mà app vẫn chạy. KHÔNG RENAME trực tiếp — đi qua 5 phase, mỗi phase chờ rolling deploy rút hết code cũ.
0. Ban đầu
1. Expand
add cột
add cột
2. Backfill
3. Dual-write
4. Switch read
5. Contract
drop cũ
drop cũ
Schema (cột bảng users)
code đọc
code ghi
đọc+ghi
Code app đang chạy
③ Lock impact — CREATE INDEX vs CONCURRENTLY
CREATE INDEX thường lock write cả bảng tới khi xong → request ghi xếp hàng. CREATE INDEX CONCURRENTLY xây index không chặn write (chậm hơn).
CREATE INDEX idle
Write request: —
... CONCURRENTLY idle
Write request: —