Jika Anda sedikit suka berpetualang, Anda bisa membawa masalah ke tangan Anda dengan melakukan ALTER TABLE dalam tahapan yang bisa Anda lihat. Misalkan tabel yang ingin Anda ubah disebut WorkingTable. Anda bisa melakukan perubahan secara bertahap seperti ini:
#
# 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;
Anda dapat melakukan ini pada semua budak. Bagaimana dengan tuannya ??? Bagaimana Anda mencegah ini dari replikasi ke budak. Sederhana: Jangan mengirim SQL ke log biner master. Cukup matikan biner logging di sesi sebelum melakukan hal-hal 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;
Tapi tunggu !!! Bagaimana dengan data baru yang masuk saat memproses perintah ini ??? Mengganti nama tabel di awal operasi harus melakukan trik. Biarkan sedikit perubahan kode ini untuk mencegah memasukkan data baru dalam hal itu:
#
# 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;
- Script 1 dapat dieksekusi pada slave apa pun yang tidak memiliki log biner diaktifkan
- Script 2 dapat dieksekusi pada slave apa pun yang memiliki log biner diaktifkan
- Script 3 dapat dieksekusi pada master atau di mana pun
Cobalah !!!