Nếu bạn là một người thích phiêu lưu, bạn có thể đưa vấn đề vào tay bằng cách thực hiện BẢNG THAY ĐỔI trong các giai đoạn bạn có thể thấy. Giả sử bảng bạn muốn thay đổi được gọi là WorkTable. Bạn có thể thực hiện các thay đổi trong các giai đoạn như thế này:
#
# Script 1
# Alter table structure of a single column of a large table
#
CREATE TABLE WorkingTableNew LIKE WorkingTable;
ALTER TABLE WorkingTableNew MODIFY BigColumn VARCHAR(50);
INSERT INTO WorkingTableNew SELECT * FROM WorkingTable;
ALTER TABLE WorkingTable RENAME WorkingTableOld;
ALTER TABLE WorkingTableNew RENAME WorkingTable;
DROP TABLE WorkingTableOld;
Bạn có thể thực hiện điều này trên tất cả các nô lệ. Còn chủ thì sao ??? Làm thế nào để bạn ngăn chặn điều này sao chép vào nô lệ. Đơn giản: Đừng gửi SQL vào nhật ký nhị phân của chủ. Đơn giản chỉ cần tắt ghi nhật ký nhị phân trong phiên trước khi thực hiện công cụ ALTER TABLE:
#
# Script 2
# Alter table structure of a single column of a large table
# while preventing it from replicating to slaves
#
SET SQL_LOG_BIN = 0;
CREATE TABLE WorkingTableNew LIKE WorkingTable;
ALTER TABLE WorkingTableNew MODIFY BigColumn VARCHAR(50);
INSERT INTO WorkingTableNew SELECT SQL_NO_CACHE * FROM WorkingTable;
ALTER TABLE WorkingTable RENAME WorkingTableOld;
ALTER TABLE WorkingTableNew RENAME WorkingTable;
DROP TABLE WorkingTableOld;
Nhưng chờ đã !!! Điều gì về bất kỳ dữ liệu mới nào xuất hiện trong khi xử lý các lệnh này ??? Đổi tên bảng khi bắt đầu hoạt động nên thực hiện thủ thuật. Hãy thay đổi mã này một chút để ngăn nhập dữ liệu mới theo khía cạnh đó:
#
# Script 3
# Alter table structure of a single column of a large table
# while preventing it from replicating to slaves
# and preventing new data from entering into the old table
#
SET SQL_LOG_BIN = 0;
ALTER TABLE WorkingTable RENAME WorkingTableOld;
CREATE TABLE WorkingTableNew LIKE WorkingTableOld;
ALTER TABLE WorkingTableNew MODIFY BigColumn VARCHAR(50);
INSERT INTO WorkingTableNew SELECT SQL_NO_CACHE * FROM WorkingTableOld;
ALTER TABLE WorkingTableNew RENAME WorkingTable;
DROP TABLE WorkingTableOld;
- Tập lệnh 1 có thể được thực thi trên bất kỳ nô lệ nào không kích hoạt nhật ký nhị phân
- Tập lệnh 2 có thể được thực thi trên bất kỳ nô lệ nào có bật nhật ký nhị phân
- Kịch bản 3 có thể được thực thi trên bản gốc hoặc bất kỳ nơi nào khác
Hãy thử một lần !!!