Migration là các script có đánh số phiên bản để thay đổi schema một cách có kiểm soát — giống "git cho cấu trúc DB". Mỗi migration có phần up (áp dụng) và down (rollback), được ghi lại trong bảng _migrations để biết cái nào đã chạy.
Công cụ thường gặp: Prisma Migrate (prisma migrate dev sinh migration từ diff schema, prisma migrate deploy áp lên production), Knex, Flyway, Liquibase.
Trong CI/CD: migration chạy trước khi deploy code mới, để schema sẵn sàng cho code.
Migration không downtime trên bảng lớn cần nhiều bước nhỏ, mỗi bước một lần deploy:
thêm cột nullable → deploy code đọc cột mới → backfill dữ liệu → mới thêm NOT NULL → bỏ cột cũ.
Nguy hiểm cần nhớ:
- ALTER TABLE ... ALTER COLUMN ... SET NOT NULL trên bảng lớn phải quét toàn bảng để kiểm chứng trong khi giữ khoá độc quyền. Trên PostgreSQL, cách tránh là thêm CHECK (col IS NOT NULL) NOT VALID trước, VALIDATE CONSTRAINT (khoá nhẹ hơn), rồi mới SET NOT NULL — bước cuối lúc đó gần như tức thì. Đừng nhầm với ADD COLUMN ... NOT NULL không default: câu đó thất bại luôn khi bảng đã có dữ liệu.
- DROP COLUMN không rollback được nếu đã có dữ liệu.
Nguyên tắc: không bao giờ sửa migration đã deploy, test cả down trước khi merge, và review migration kỹ như review code — thay đổi schema gần như không thể đảo ngược.