Forma más sencilla de convertir todas las tablas de InnoDB a MyISAM

13

Anteriormente, uso esto:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Estoy buscando una forma más sencilla de convertir todas las tablas en una base de datos, en lugar de escribir cada nombre de tabla uno por uno

cewebugil
fuente
1
Más simple cómo? Eso me parece bastante simple.
Zoredache
55
Aprenda a usar secuencias de comandos para lograr sus objetivos.
Tom O'Connor

Respuestas:

11

No conozco ninguna manera de hacer esto en mysql, pero un simple script de shell hará el trabajo:

TABLES=$(mysql -pXXXXXXX -uXXXXXXX --skip-column-names -B -D $DB -e 'show tables')
for T in $TABLES
do
    mysql -pXXXXX -uXXXXX -D $DB -e "ALTER TABLE $T ENGINE=MYISAM"
done
Insyte
fuente
1
¿Cómo deshabilitar la verificación de clave externa?
realtebo
7

Puede usar MySQL para escribirlo y ejecutarlo:

Esto convertirá cada tabla InnoDB en la base dbnamede datos a MyISAM

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Esto convertirá todas las tablas de InnoDB a MyISAM

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Si no desea que la conversión de las tablas se replique en esclavos, simplemente ponga SET SQL_LOG_BIN=0;como primera línea. De esa manera, puede probar la conversión en una configuración Maestro / Esclavo convirtiendo solo el Esclavo primero y luego el Maestro después.

Esto convertirá todas las tablas de InnoDB en la base dbnamede datos a MyISAM y no se replicará a otros servidores

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Esto convertirá cada tabla de InnoDB a MyISAM y no se replicará a otros servidores

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
Yendo desde MyIsam2InnoDB en el mundo real, probablemente querrás un SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; lugar para evitar el no_zero_date desde mysql 5.7 - Fuente stackoverflow.com/questions/9192027/…
Antony Gibbs
Yendo desde MyIsam2InnoDB en el mundo real, probablemente querrás un SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; lugar para evitar el no_zero_date desde mysql 5.7 - Fuente stackoverflow.com/questions/9192027/…
Antony Gibbs
0

Para aquellos que todavía tienen este problema, pueden seguir esta forma de hacerlo, encontré esta respuesta en un sitio web. Me ayuda mucho:

shell> mysql -u username -p -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'" | tail -n+2 >> alter.sql

Actualización usernamey db_namevalores con sus propios valores.

Afet ejecutar el script, se guardará un archivo con el nombre: alter.sql Abrir el archivo y ejecutar el contenido de su phpmyadmino de mysqllínea de comandos.

¡Salud!

mayoralito
fuente
-1

Prefiero frases para este tipo de cosas. Esta es una versión de una sola línea de la respuesta más aceptada.

Esto funciona si tiene configurado su nombre de usuario y contraseña de MySQL ~/.my.cnf.

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
kqw
fuente