NhaLapTrinh.comNhà Lập Trình
Cơ sở dữ liệu

Sửa cấu trúc bảng khi hệ thống đang chạy

Sửa cấu trúc bảng trên hệ thống đang chạy cần chia làm nhiều bước nhỏ để mã cũ và mã mới cùng chạy được trong lúc chuyển: thêm trước, chuyển dữ liệu dần, đổi mã, rồi mới bỏ cái cũ. Luôn sao lưu trước, thử trên bản sao dữ liệu cỡ thật, và có đường lui cho từng bước.

🎙️
📑 Nội dung theo chương
  1. 0:36 Vì sao trên máy thật lại khác?
  2. 1:27 Thêm trước, bỏ sau
  3. 2:16 Chuyển dữ liệu từng đợt nhỏ
  4. 2:57 Thử trên bản sao cỡ thật
  5. 3:38 Ngày thực hiện
  6. 4:21 Câu hỏi thường gặp
🔊 Bản audio (lồng nhạc nền)

Sửa cấu trúc bảng trên một hệ thống đang chạy cần chia thành nhiều bước nhỏ, sao cho mã cũ và mã mới đều chạy được trong suốt thời gian chuyển: thêm cái mới trước, chuyển dữ liệu dần, đổi mã sang dùng cái mới, rồi mới bỏ cái cũ. Luôn sao lưu trước, thử trên bản sao dữ liệu có kích cỡ thật, và chuẩn bị đường lui cho từng bước.

Chào bạn, đây là Nhà Lập Trình. Trên máy mình, đổi tên một cột chỉ mất một giây. Trên hệ thống thật đang có khách đặt hàng, cùng thao tác đó có thể làm sập trang web, hoặc khoá bảng đơn hàng suốt nửa giờ. Tập này mình kể cách thay bóng đèn mà cửa hàng vẫn mở cửa.

Vì sao trên máy thật lại khác?

Khác biệt đầu tiên là kích cỡ. Bảng thử nghiệm có trăm dòng, bảng thật có chục triệu dòng. Thêm một cột có giá trị mặc định với vài cơ sở dữ liệu nghĩa là viết lại toàn bộ bảng. Chục triệu dòng có thể mất hàng chục phút.

Khác biệt thứ hai là khoá. Trong lúc sửa cấu trúc, nhiều cơ sở dữ liệu khoá bảng, không cho đọc hoặc ghi. Bảng đơn hàng bị khoá hai mươi phút nghĩa là hai mươi phút không ai đặt hàng được. Mỗi cơ sở dữ liệu và mỗi phiên bản xử lý khác nhau, có loại thay đổi làm được mà không khoá, có loại thì không.

Khác biệt thứ ba là mã đang chạy. Trên máy thật, mã phiên bản cũ đang phục vụ khách. Nếu bạn đổi tên một cột, mã cũ đang tìm cột theo tên cũ sẽ lỗi ngay lập tức, trước cả khi bạn kịp đưa mã mới lên.

Và khác biệt thứ tư: không có nút hoàn tác đơn giản. Đổi cấu trúc rồi mới phát hiện sai, quay lại có khi mất dữ liệu đã ghi trong lúc đó.

Thêm trước, bỏ sau

Nguyên tắc cốt lõi là không bao giờ đổi một thứ đang dùng trong một bước. Hãy tách thành các bước mà sau mỗi bước, cả mã cũ lẫn mã mới đều chạy đúng.

Ví dụ bạn muốn đổi một cột có tên viết tắt khó hiểu sang một tên đầy đủ, dễ đọc. Bước một, thêm cột mới, để trống. Mã cũ không biết cột mới, vẫn chạy bình thường. Bước hai, đưa lên mã ghi vào cả hai cột, đọc từ cột cũ. Bước ba, chép dữ liệu cũ sang cột mới, từng đợt nhỏ.

Bước bốn, đưa lên mã đọc từ cột mới. Theo dõi vài ngày. Bước năm, đưa lên mã chỉ ghi vào cột mới. Bước sáu, khi chắc chắn không còn gì dùng cột cũ, mới xoá nó.

Sáu bước cho một việc đổi tên nghe có vẻ quá mức. Nhưng mỗi bước đều an toàn, có thể dừng lại hoặc quay lui, và khách hàng không bao giờ thấy lỗi. Với bảng nhỏ ít quan trọng thì có thể gộp bước. Với bảng đơn hàng hay bảng tiền, sáu bước là rẻ.

Chuyển dữ liệu từng đợt nhỏ

Khi cần chuyển hay sửa dữ liệu hàng loạt, đừng làm trong một lệnh duy nhất trên cả bảng. Một lệnh cập nhật chục triệu dòng sẽ chạy rất lâu, giữ khoá rất lâu, và nếu thất bại giữa chừng thì phải hoàn tác cũng rất lâu.

Hãy chia thành từng đợt, mỗi đợt vài nghìn dòng, nghỉ một chút giữa các đợt để cơ sở dữ liệu thở và phục vụ khách. Ghi lại đã xử lý tới đâu, để nếu phải dừng thì chạy tiếp được từ chỗ đó.

Làm vào giờ thấp điểm nếu có thể. Theo dõi tải của máy chủ trong lúc chạy. Nếu thấy khách bắt đầu bị chậm, giảm kích cỡ đợt hoặc tạm dừng.

Viết công cụ chuyển dữ liệu sao cho chạy lại nhiều lần vẫn cho cùng kết quả. Nếu lỡ chạy hai lần một đợt, dữ liệu không bị nhân đôi hay hỏng.

Thử trên bản sao cỡ thật

Trước khi chạm vào máy thật, hãy thử toàn bộ quy trình trên một bản sao dữ liệu có kích cỡ gần như thật, trên máy cấu hình gần giống. Đo thời gian mỗi bước. Xem bước nào khoá bảng, khoá bao lâu.

Rất nhiều bất ngờ lộ ra ở đây. Một lệnh thêm chỉ mục bạn nghĩ mất một phút, trên bản sao mất bốn mươi phút. Một bước chuyển dữ liệu gặp những dòng có giá trị lạ mà dữ liệu thử không có.

Nếu bản sao chứa dữ liệu cá nhân, hãy làm mờ trước khi đưa sang môi trường thử nghiệm, và giới hạn người được truy cập.

Viết ra kế hoạch: từng bước làm gì, mất bao lâu, kiểm tra thế nào là thành công, nếu thất bại thì quay lui thế nào. Đưa kế hoạch cho một đồng nghiệp đọc. Hai cặp mắt thấy nhiều hơn một.

Ngày thực hiện

Sao lưu ngay trước khi bắt đầu, và chắc chắn bản sao lưu đó khôi phục được. Thông báo cho đội, cho người vận hành, cho bộ phận chăm sóc khách hàng nếu có nguy cơ ảnh hưởng.

Làm từng bước theo kế hoạch, kiểm tra sau mỗi bước. Đừng ứng biến. Nếu có gì khác với lúc thử, dừng lại, suy nghĩ, bàn với đồng nghiệp, rồi mới quyết định tiếp tục hay quay lui.

Sau khi xong, theo dõi hệ thống kỹ trong vài giờ, vài ngày. Nhật ký lỗi, tốc độ truy vấn, phản hồi của khách. Có những vấn đề chỉ lộ ra khi một chức năng ít dùng được ai đó bấm vào.

Đổi cấu trúc dữ liệu trên hệ thống đang chạy là một trong những việc đòi hỏi sự cẩn thận nhất của nghề. Nó không cần thông minh, chỉ cần kiên nhẫn chia nhỏ và không bao giờ đặt cược tất cả vào một bước.

Câu hỏi thường gặp

Thêm cột vào bảng lớn có làm sập hệ thống không?

Có thể, tuỳ cơ sở dữ liệu và loại thay đổi. Một số thay đổi phải viết lại toàn bộ bảng và khoá bảng lâu. Nên thử trên bản sao cỡ thật để đo trước.

Vì sao không đổi tên cột trực tiếp?

Vì mã phiên bản cũ đang chạy vẫn dùng tên cũ và sẽ lỗi ngay khi tên đổi. Nên thêm cột mới, chuyển dần rồi mới bỏ cột cũ để cả mã cũ và mới cùng chạy được.

Chuyển dữ liệu hàng loạt nên làm thế nào?

Chia thành từng đợt nhỏ, nghỉ giữa các đợt, ghi lại tiến độ để chạy tiếp được, và viết sao cho chạy lại nhiều lần vẫn cho cùng kết quả.

Có cần sao lưu trước khi đổi cấu trúc bảng không?

Luôn cần. Sao lưu ngay trước khi bắt đầu và chắc chắn bản sao lưu khôi phục được. Đây là đường lui cuối cùng nếu mọi thứ khác thất bại.

Nên đổi cấu trúc dữ liệu vào lúc nào?

Vào giờ thấp điểm, khi có đủ người theo dõi và không trùng với sự kiện kinh doanh quan trọng. Tránh làm vào cuối ngày thứ sáu khi không ai trực để xử lý sự cố.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.