Docs học tập
Backend nền tảng

D10 · Schema Migration an toàn

Migration được quản lý bằng code, có phiên bản, chạy tự động (Flyway, Liquibase, Prisma, Alembic…).

D10 · Middle

Sửa đường khi xe vẫn đang chạy: làm làn tạm, chuyển xe sang, rồi mới phá làn cũ – không thể chặn cả con đường.

Cốt lõi

  • Migration được quản lý bằng code, có phiên bản, chạy tự động (Flyway, Liquibase, Prisma, Alembic…).
  • Mẫu expand → migrate → contract: thêm cột mới → ghi song song và backfill dữ liệu → chuyển code sang cột mới → xóa cột cũ ở lần deploy sau.
  • Cẩn thận với thao tác khóa bảng lâu trên bảng lớn (thêm index, đổi kiểu cột).

Đánh đổi

Chậm hơn đổi thẳng nhưng không downtime và rollback được, vì cả code cũ lẫn code mới đều chạy được trong lúc chuyển giao.

Trong thực tế

Đổi tên cột full_name → name qua 3 lần deploy thay vì một lệnh RENAME làm code đang chạy lỗi ngay lập tức.

Bug thường gặp

Thêm cột NOT NULL không có giá trị mặc định vào bảng lớn → migration khóa bảng nhiều phút, production đứng hình.

Tự hỏi lại

Tạo index trên bảng hàng trăm triệu dòng mà không khóa bảng thế nào (ví dụ CREATE INDEX CONCURRENTLY của Postgres)?

On this page