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.TABLES
detectará 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!