Wenn Sie ein wenig abenteuerlustig sind, können Sie die Dinge selbst in die Hand nehmen, indem Sie die ALTER-TABELLE in sichtbaren Schritten ausführen. Angenommen, die zu ändernde Tabelle heißt WorkingTable. Sie können die Änderungen in folgenden Schritten durchführen:
#
# 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;
Dies können Sie an allen Slaves durchführen. Was ist mit dem Meister ??? Wie verhindern Sie, dass dies auf die Slaves repliziert wird? Einfach: Senden Sie die SQL nicht in die Binärprotokolle des Masters. Beenden Sie einfach die Binärprotokollierung in der Sitzung, bevor Sie die ALTER TABLE-Aufgaben ausführen:
#
# 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;
Aber warte !!! Was ist mit neuen Daten, die während der Verarbeitung dieser Befehle eingehen? Das Umbenennen der Tabelle zu Beginn der Operation sollte ausreichen. Ändern Sie diesen Code ein wenig, um zu verhindern, dass diesbezüglich neue Daten eingegeben werden:
#
# 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;
- Skript 1 kann auf jedem Slave ausgeführt werden, für den keine Binärprotokolle aktiviert sind
- Skript 2 kann auf jedem Slave ausgeführt werden, für den Binärprotokolle aktiviert sind
- Skript 3 kann auf einem Master oder an einem anderen Ort ausgeführt werden
Versuche es !!!