Se você é um pouco aventureiro, pode resolver o problema executando a ALTER TABLE nos estágios que pode ver. Suponha que a tabela que você deseja alterar seja chamada WorkingTable. Você pode executar as alterações em estágios como este:
#
# 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;
Você pode fazer isso em todos os escravos. E o mestre ??? Como você evita que isso seja replicado para os escravos. Simples: não envie o SQL para os logs binários do mestre. Simplesmente desligue o log binário na sessão antes de executar o procedimento 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;
Mas espere !!! E quanto a novos dados que chegam ao processar esses comandos ??? Renomear a tabela no início da operação deve funcionar. Vamos alterar um pouco esse código para evitar a inserção de novos dados a esse respeito:
#
# 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;
- O script 1 pode ser executado em qualquer escravo que não tenha logs binários ativados
- O script 2 pode ser executado em qualquer escravo que possua logs binários habilitados
- O script 3 pode ser executado em um mestre ou em qualquer outro lugar
De uma chance !!!