La siguiente técnica que voy a mostrar requerirá agallas de acero.
Dados los siguientes criterios
- datadir es
/var/lib/mysql
- la mesa es
mydb.mytb
- enum columna llamada se llama
enum_col
- motor es MyISAM
Aquí hay un crack que desafía a la muerte:
CREATE TABLE mydb.mybt LIKE mydb.mytb;
ALTER TABLE mydb.mybt MODIFY enum_col ENUM('First value','Second value');
SET wait_timeout=86400; SET interactive_timeout=86400;
FLUSH TABLES WITH READ LOCK;
En una sesión separada de OS / SSH, intercambie los archivos .frm
$ mv /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/myxx.frm
$ mv /var/lib/mysql/mydb/mybt.frm /var/lib/mysql/mydb/mytb.frm
$ mv /var/lib/mysql/mydb/myxx.frm /var/lib/mysql/mydb/mybt.frm
UNLOCK TABLES;
DROP TABLE mydb.mybt;
Eso es !!!
CAVEAT: ¡NO PUEDO TOMAR CRÉDITO POR ESTO!
Esta técnica proviene de "MySQL de alto rendimiento: optimización, copias de seguridad, replicación y más", páginas 146-148 bajo el subtítulo Acelerar TABLA ALTER . El párrafo 1 de la página 147 dice:
La técnica que estamos a punto de demostrar es incompatible, indocumentada y puede no funcionar. Úselo bajo su responsabilidad. ¡Le recomendamos que haga una copia de seguridad de sus datos primero!
Darle una oportunidad ! (Por favor, háganos saber cómo resultó)
ACTUALIZACIÓN 2011-10-05 17:49 EDT
Si la tabla es MyISAM y tiene suficiente espacio en producción y una ventana de tiempo de inactividad directa, intente esto:
service mysql restart --skip-networking
En una sesión separada de OS / SSH, haga una copia de la tabla
cp /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/mytbplay.frm
cp /var/lib/mysql/mydb/mytb.MYD /var/lib/mysql/mydb/mytbplay.MYD
cp /var/lib/mysql/mydb/mytb.MYI /var/lib/mysql/mydb/mytbplay.MYI
INFORMATION_SCHEMA.TABLESdetectará automáticamente la presencia de la nueva tabla llamada mydb.mytbplay.
Realice el algoritmo de tripas de acero en mydb.mytbplay
Usted prueba la integridad de mydb.mytbplay
Si estas satisfecho
ALTER TABLE mydb.mytb RENAME mydb.mytb_backup;
ALTER TABLE mydb.mytbplay RENAME mydb.mytb;
service mysql restart
¡Darle una oportunidad!