Cơ sở dữ liệu 22/09/2026 6 phút

Migration lớn không downtime trong PostgreSQL: đổi schema an toàn trên bảng đang chạy

Đổi schema trên bảng production đang phục vụ mà không gây downtime — mấu chốt là mức khoá và thao tác có viết lại bảng không. Bài này đo thật: ADD COLUMN default tức thì, đổi kiểu cột khoá cả bảng, CREATE INDEX CONCURRENTLY không chặn ghi, và NOT VALID cho ràng buộc. PostgreSQL 16.

Lập trình 22/09/2026 10 phút

Đổi schema không downtime đo thật: ADD COLUMN mất 1 ms nhưng một giao dịch quên COMMIT làm mọi SELECT về 0 trong 5 giây, lock_timeout cắt còn 2 giây, DEFAULT random() viết lại bảng 739 ms, CREATE INDEX chặn ghi còn CONCURRENTLY thì không

PostgreSQL 16, timing phía máy chủ: ADD COLUMN 7,6 ms, NOT NULL DEFAULT hằng 1,1 ms, DEFAULT now() 1,0 ms vì now() là stable, DEFAULT random() 739 ms viết lại 1 triệu dòng, SET NOT NULL trực tiếp 241 ms. Một giao dịch mở 8 giây cộng một ALTER vô hại làm tps đọc từ 80.000 về 0 trong 5 giây; lock_timeout 2 giây cắt tổn thất còn 2 giây. CREATE INDEX giữ ShareLock và chặn UPDATE 113 ms, CONCURRENTLY để UPDATE qua trong 1,6 ms. ADD CHECK trực tiếp dưới tải ghi mất 5 giây với ghi về 0, NOT VALID rồi VALIDATE không chặn giây nào. SET NOT NULL sau CHECK VALID còn 26 ms.