¿Cómo convertir todas las tablas de MyISAM a InnoDB?

264

Sé que puedo emitir una tabla alter individualmente para cambiar el almacenamiento de la tabla de MyISAM a InnoDB.

Me pregunto si hay una manera de cambiarlos rápidamente a InnoDB.

Pentium10
fuente
1
Consejos sobre la conversión.
Rick James

Respuestas:

173
<?php
    // connect your database here first 
    // 

    // Actual code starts here 

    $sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = 'your_database_name' 
        AND ENGINE = 'MyISAM'";

    $rs = mysql_query($sql);

    while($row = mysql_fetch_array($rs))
    {
        $tbl = $row[0];
        $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
        mysql_query($sql);
    }
?>
Gajendra Bang
fuente
55
Probablemente sería mejor limitar esto a la base de datos en la que se está enfocando. Agregue un "AND TABLE_SCHEMA = 'dbname', de lo contrario, esto puede / cambiará todas las tablas de MySQL de Internet a innodb también (cuando algunas de ellas deberían ser memoria)
Fideos
77
La mysql_*interfaz de PHP está en desuso y se elimina del ver 7. No use este código como está.
Rick James
44
@GajendraBang: Sí, la respuesta es válida cuando se presenta. Pero para los recién llegados, ya no es válido. Mi intención era advertir contra usarlo como está .
Rick James el
1
La pregunta no menciona PHP en absoluto
phil294
1
¿Cómo no se marca la edición más reciente? La parte de MySQL es una copia directa de la respuesta de Will Jones. Mire cada historial de edición para encontrar que la respuesta de Will apareció en 2013 mientras que esta respuesta apareció en 2019. Como resultado, la integridad de esta pregunta se ve comprometida.
rmutalik
549

Ejecute esta instrucción SQL (en el cliente MySQL, phpMyAdmin o donde sea) para recuperar todas las tablas MyISAM en su base de datos.

Reemplace el valor de la name_of_your_dbvariable con el nombre de su base de datos.

SET @DATABASE_NAME = 'name_of_your_db';

SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;

Luego, copie el resultado y ejecútelo como una nueva consulta SQL.

Will Jones
fuente
44
Eso funcionó muy bien! Lo puse en un script de shell de ejemplo aquí: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
44
"# 1267 mezcla ilegal de colaciones ..." Recibo este error, no funciona
Rápli András
1
Solo por curiosidad, ¿cuál es el punto del ordenamiento descendente explícito? ( ORDER BY table_name DESC)
rinogo
12
Si está tratando con múltiples bases de datos y no quiere cambiar la base de datos cada vez, cambie CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')aCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r el
1
Si desea obtener las declaraciones para todas las bases de datos (excepto las bases de datos del sistema MySQL): SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name
dr fu manchu
61
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';

Funciona de maravilla.

Esto le dará una lista de todas las tablas con las consultas alternativas que puede ejecutar en un lote

Omkar Kulkarni
fuente
55
Después de ejecutar esto, primero debe ejecutar la siguiente consulta: USE databasename; Luego puede usar las consultas que proporciona el script anterior.
gijs007
¿Cómo se ejecuta un lote?
Marc Alexander
La consulta anterior le dará consultas de tablas alternativas. simplemente selecciónelos todos y ejecútelos juntos. o divídalos en grupos de 50 consultas y ejecútelos si hay demasiadas tablas en el conjunto de resultados
Omkar Kulkarni
2
Funciona incluso en 2018 y en Percona Cluster. Si lo usa desde PHPMyAdmin, solo obtendrá unos 20 nombres, luego "..." o un símbolo de paginación >>. Esto significa que debe hacer clic y copiar todas las páginas siguientes para no perderse ninguna tabla. Si olvida eso, puede volver a aplicar con seguridad la consulta anterior y le dará las siguientes tablas MyISAM para convertir.
Dario Fumagalli
23

En los siguientes scripts, reemplace <nombre de usuario>, <contraseña> y <esquema> con sus datos específicos.

Para mostrar las declaraciones que puede copiar y pegar en una sesión de cliente mysql, escriba lo siguiente:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \

Para ejecutar simplemente el cambio, use esto:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \
 | mysql -u <username> --password=<password> -D <schema>

CRÉDITO: Esta es una variación de lo que se describió en este artículo .

Vijay Varadan
fuente
23

Una línea:

 mysql -u root -p dbName -e 
 "show table status where Engine='MyISAM';" | awk 
 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
  mysql -u root -p dbName
kuzea
fuente
1
¡La MEJOR y la respuesta MÁS INTELIGENTE!
biniam
Cuando ejecuto esto en un script bash, interpreta el $ 1 como una variable de script bash que sobrescribe la definición NR. ¿Alguna forma de evitar esto?
Trabaja para vivir
@WorksforaLiving encierra los backticks "$1"como este: `"$1"`similar a lo que está en mi respuesta.
Vijay Varadan
20

Use esto como una consulta SQL en su phpMyAdmin

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';
Zwarmapapa
fuente
3
Esto no parece convertir realmente las tablas a InnoDB.
Charlie Schliesser
3
Esto genera un script que luego ejecuta para convertir las tablas: son dos pasos. Sin embargo, intenta convertir las tablas INFORMATION_SCHEMA; eso es algo malo. Necesita limitarlo a la base de datos correcta.
Brilliand
1
Tendrá que filtrar nuestras tablas internas de mysql, de acuerdo con los documentos "No convierta las tablas del sistema MySQL en la base de datos mysql (como usuario o host) al tipo InnoDB. Esta es una operación no admitida. Las tablas del sistema siempre deben ser del tipo MyISAM ". enlace
eug
Sin editar para incorporar el comentario de @ eug en esta respuesta, creo que merece un voto negativo, aunque por lo demás es tan elegante como cualquiera de las variantes en esta página.
mc0e
Hmm @ charlie-s también es correcto, y esto no produce SQL en funcionamiento. Un voto negativo me parece justificado.
mc0e
18

Puede ejecutar esta declaración en la herramienta de línea de comando mysql:

echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES 
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE' 
AND TABLE_SCHEMA='name-of-database'" | mysql > convert.sql

Es posible que deba especificar el nombre de usuario y la contraseña usando: mysql -u username -p El resultado es un script sql que puede volver a canalizar en mysql:

mysql name-of-database < convert.sql

Reemplace "nombre-de-base de datos" en la declaración anterior y la línea de comando.

Hendrik Brummermann
fuente
@itsraja, "echo" es un comando compatible con sh en linux / unix y cmd en sistemas Microsoft, el resultado se canaliza como entrada a la herramienta mysql.
Hendrik Brummermann
2
Así es. Pero has mencionado como "herramienta de línea de comando mysql"
itsraja
1
Además, echo "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') FROM TABLES WHERE ENGINE! = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql ERROR 1146 (42S02) en la línea 1: La tabla 'testinno.TABLES' no existe
itsraja
He puesto esto en un script de shell de ejemplo aquí: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
1
¿Cómo podemos escapar correctamente de la instrucción sql como una cadena? Tal como está ahora, obtengo-bash: ,TABLE_NAME,: command not found
arjan
10

Es muy simple, solo hay DOS pasos, solo copie y pegue:

paso 1.

  SET @DATABASE_NAME = 'name_of_your_db';
  SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS  sql_statements FROM information_schema.tables AS tb WHERE   table_schema = @DATABASE_NAME AND `ENGINE` = 'MyISAM' AND `TABLE_TYPE` = 'BASE TABLE' ORDER BY table_name DESC;

(copie y pegue todos los resultados en la pestaña sql)

paso 2: (copia todos los resultados en la pestaña sql) y pégalo debajo en la línea

INICIAR LA TRANSACCIÓN;

COMETER;

p.ej. INICIAR LA TRANSACCIÓN;

ALTER TABLE admin_filesENGINE = InnoDB;

COMETER;

Sachin de Pune
fuente
10

Para generar sentencias ALTER para todas las tablas en todos los esquemas que no son del sistema, ordenados por esos esquemas / tablas ejecute lo siguiente:

SELECT  CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables
WHERE   TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;

Después de eso, ejecute esas consultas a través de un cliente para realizar la modificación.

  • La respuesta se basa en las respuestas anteriores, pero mejora el manejo del esquema.
Lavi Avigdor
fuente
8

Todavía no se ha mencionado, así que lo escribiré para la posteridad:

Si está migrando entre servidores de base de datos (o tiene otra razón por la que volcaría y volvería a cargar su dta), puede modificar la salida desde mysqldump:

mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;

Luego cárguelo nuevamente:

mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql

(Además, en mi experiencia limitada, este puede ser un proceso mucho más rápido que alterar las tablas 'en vivo'. Probablemente depende del tipo de datos e índices).

Quinn Commandado
fuente
ty! Exactamente lo que estaba buscando. Lo probaré en unos días.
Rainer
7

Aquí hay una manera de hacerlo para los usuarios de Django:

from django.core.management.base import BaseCommand
from django.db import connections


class Command(BaseCommand):

    def handle(self, database="default", *args, **options):

        cursor = connections[database].cursor()

        cursor.execute("SHOW TABLE STATUS");

        for row in cursor.fetchall():
            if row[1] != "InnoDB":
                print "Converting %s" % row[0],
                result = cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])
                print result

Agregue eso a su aplicación en la carpeta de administración / comandos / Luego puede convertir todas sus tablas con un comando manage.py:

python manage.py convert_to_innodb
sanguijuela
fuente
5

Desde mysql, puede usar buscar / reemplazar usando un editor de texto:

SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

Nota: Probablemente debería ignorar information_schema y mysql porque "las bases de datos mysql e information_schema, que implementan algunos de los componentes internos de MySQL, aún usan MyISAM. En particular, no puede cambiar las tablas de concesión para usar InnoDB". ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )

En cualquier caso, tenga en cuenta las tablas para ignorar y ejecutar:

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

Ahora solo copie / pegue esa lista en su editor de texto y busque / reemplace "|" con "ALTER TABLE", etc.

Luego tendrá una lista como esta que simplemente puede pegar en su terminal mysql:

ALTER TABLE arth_commentmeta           ENGINE=Innodb;
ALTER TABLE arth_comments              ENGINE=Innodb;
ALTER TABLE arth_links                 ENGINE=Innodb;
ALTER TABLE arth_options               ENGINE=Innodb;
ALTER TABLE arth_postmeta              ENGINE=Innodb;
ALTER TABLE arth_posts                 ENGINE=Innodb;
ALTER TABLE arth_term_relationships    ENGINE=Innodb;
ALTER TABLE arth_term_taxonomy         ENGINE=Innodb;
ALTER TABLE arth_terms                 ENGINE=Innodb;
ALTER TABLE arth_usermeta              ENGINE=Innodb;

Si su editor de texto no puede hacer esto fácilmente, aquí hay otra solución para obtener una lista similar (que puede pegar en mysql) para solo un prefijo de su base de datos, desde la terminal de Linux:

mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
PJ Brunet
fuente
5

Una versión simple de MySQL.

Simplemente puede iniciar el ejecutable mysql, usar la base de datos y copiar y pegar la consulta.

Esto convertirá todas las tablas MyISAM de la base de datos actual en tablas INNODB.

DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()
BEGIN
mainloop: LOOP
  SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
  WHERE `TABLE_SCHEMA` LIKE DATABASE()
  AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
  IF @convertTable IS NULL THEN 
    LEAVE mainloop;
  END IF;
  SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = INNODB');
  PREPARE convertTables FROM @sqltext;
  EXECUTE convertTables;
  DEALLOCATE PREPARE convertTables;
  SET @convertTable = NULL;
END LOOP mainloop;

END//
DELIMITER ;

CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;
Harald Leithner
fuente
¡Me sorprende que no haya más soluciones basadas en procedimientos almacenados!
FrustratedWithFormsDesigner
Debido a que escribir y probar procedimientos en MySQL es doloroso ;-) el comentario no tiene nada que ver con la pregunta.
Harald Leithner
3

use esta línea para alterar el motor de la base de datos para una sola tabla.

  ALTER TABLE table_name ENGINE = INNODB;
Desarrollador
fuente
3

Soy un novato y tuve que encontrar mi propia solución porque los comandos de mysql en la web generalmente están plagados de errores ortográficos que crean una pesadilla en la vida real para las personas que recién comienzan. Aquí está mi solución ...

En lugar de 1 comando por tabla, preparé docenas de comandos (listos para copiar y pegar) a la vez usando Excel.

¿Cómo? expanda su ventana de masilla e ingrese mysql y luego ejecute el comando "SHOW TABLE STATUS"; y el copiar / pegar la salida a Microsoft Excel. Vaya a la pestaña Datos y use la función "texto a columnas" y delimite las columnas con una tecla de espacio. Luego ordene las columnas según la columna que muestre sus tipos de tabla y elimine todas las filas en las que las tablas ya están en formato InnoDb (porque no necesitamos ejecutar comandos contra ellas, ya están hechas). Luego agregue 2 columnas a la izquierda de la columna de tablas y 2 columnas a la derecha. Luego pegue la primera parte del comando en la columna 1 (ver más abajo). La columna 2 debe contener solo un espacio. La columna 3 es su columna de tablas. La columna 4 debe contener solo un espacio. La columna 5 es la última parte de su comando. Debe tener un aspecto como este:

column-1        column-2            column-3         column-4     column-5
ALTER TABLE     t_lade_tr           ENGINE=InnoDB;
ALTER TABLE     t_foro_detail_ms    ENGINE=InnoDB;
ALTER TABLE     t_ljk_ms            ENGINE=InnoDB;

Luego copie y pegue aproximadamente 5 filas a la vez en mysql. Esto convertirá aproximadamente 5 a la vez. Noté que si hacía más que eso de una vez, los comandos fallaban.

usuario3035649
fuente
3

En mi caso, estaba migrando de una instancia de MySQL con un valor predeterminado de MyISAM a una instancia de MariaDB con un DEFAULT de InnoDB.

Por MariaDB Migration Doc's.

En el antiguo servidor Ejecutar:

mysqldump -u root -p --skip-create-options --all-databases > migration.sql

--Skip-create-options asegura que el servidor de la base de datos use el motor de almacenamiento predeterminado al cargar los datos, en lugar de MyISAM.

mysql -u root -p < migration.sql

Esto arrojó un error con respecto a la creación de mysql.db, pero todo funciona muy bien ahora :)

FreeSoftwareServers
fuente
3

Simplemente probé otra forma (¿simple?) Y funcionó para mí.

Simplemente exporte su DB como archivo .sql, edítelo con gedit o notepad;

Reemplace ENGINE=MyISAMcon ENGINE=INNODBy guarde el archivo editado

El número o reemplazo realizado debe ser el número de sus tablas

Importarlo a MySQL (phpMyAdmin o línea de comando)

Y voilá !

Malibú
fuente
2

Puede escribir un guión para hacerlo en su lenguaje de secuencias de comandos favorito. El script haría lo siguiente:

  1. Problema SHOW FULL TABLES .
  2. Para cada fila devuelta, verifique que la segunda columna dice 'BASE TABLE'y no'VIEW' .
  3. Si no es así 'VIEW', emita el ALTER TABLEcomando apropiado .
Hammerita
fuente
2

Prueba este script de shell

DBENGINE='InnoDB' ;
DBUSER='your_db_user' ;
DBNAME='your_db_name' ;
DBHOST='your_db_host'
DBPASS='your_db_pass' ;
mysqldump --add-drop-table -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME > mtest.sql; mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "SHOW TABLES;" | while read TABLE ; do mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "ALTER TABLE $TABLE ENGINE=$DBENGINE;" ; done
Muhammad Reda
fuente
2

Algunas correcciones a este script de utilidad

SET @DATABASE_NAME = 'Integradb';

SELECT  CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;
usuario3035727
fuente
1
<?php

  // connect your database here first

  mysql_connect('host', 'user', 'pass');

  $databases = mysql_query('SHOW databases');

  while($db = mysql_fetch_array($databases)) {
    echo "database => {$db[0]}\n";
    mysql_select_db($db[0]);

    $tables = mysql_query('SHOW tables');

    while($tbl = mysql_fetch_array($tables)) {
      echo "table => {$tbl[0]}\n";
      mysql_query("ALTER TABLE {$tbl[0]} ENGINE=MyISAM");
    }
  }
Rodrigo Gregorio
fuente
1

Este es un script PHP simple.

<?php
    @error_reporting(E_ALL | E_STRICT);
    @ini_set('display_errors', '1');


    $con = mysql_connect('server', 'user', 'pass');
    $dbName = 'moodle2014';

    $sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '".$dbName."';";
    $rs = mysql_query($sql, $con);

    $count = 0;
    $ok = 0;
    while($row = mysql_fetch_array($rs)){
            $count ++;
            $tbl = $row[0];
            $sql = "ALTER TABLE ".$dbName.".".$tbl." ENGINE=INNODB;";
            $resultado = mysql_query($sql);
            if ($resultado){
                    $ok ++;
                    echo $sql."<hr/>";
            }
    }
    if ($count == $ok){
            echo '<div style="color: green"><b>ALL OK</b></div>';
    }else{
            echo '<div style="color: red"><b>ERRORS</b>Total tables: '.$count.', updated tables:'.$ok.'</div>';
    }
touzas
fuente
1
<?php

// Convert all MyISAM tables to INNODB tables in all non-special databases.
// Note: With MySQL less than 5.6, tables with a fulltext search index cannot be converted to INNODB and will be skipped.

if($argc < 4)
    exit("Usage: {$argv[0]} <host> <username> <password>\n");
$host = $argv[1];
$username = $argv[2];
$password = $argv[3];

// Connect to the database.
if(!mysql_connect($host, $username, $password))
    exit("Error opening database. " . mysql_error() . "\n");

// Get all databases except special ones that shouldn't be converted.
$databases = mysql_query("SHOW databases WHERE `Database` NOT IN ('mysql', 'information_schema', 'performance_schema')");
if($databases === false)
    exit("Error showing databases. " . mysql_error() . "\n");

while($db = mysql_fetch_array($databases))
{
    // Select the database.
    if(!mysql_select_db($db[0]))
        exit("Error selecting database: {$db[0]}. " . mysql_error() . "\n");
    printf("Database: %s\n", $db[0]);

    // Get all MyISAM tables in the database.
    $tables = mysql_query("SHOW table status WHERE Engine = 'MyISAM'");
    if($tables === false)
        exit("Error showing tables. " . mysql_error() . "\n");

    while($tbl = mysql_fetch_array($tables))
    {
        // Convert the table to INNODB.
        printf("--- Converting %s\n", $tbl[0]);
        if(mysql_query("ALTER TABLE `{$tbl[0]}` ENGINE = INNODB") === false)
            printf("--- --- Error altering table: {$tbl[0]}. " . mysql_error() . "\n");
    }
}

mysql_close();

?>
Russell G
fuente
1

para mysqli connect;

<?php

$host       = "host";
$user       = "user";
$pass       = "pss";
$database   = "db_name";


$connect = new mysqli($host, $user, $pass, $database);  

// Actual code starts here Dont forget to change db_name !!
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'db_name' 
    AND ENGINE = 'MyISAM'";

$rs = $connect->query($sql);

while($row = $rs->fetch_array())
{
    $tbl = $row[0];
    $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
    $connect->query($sql);
} ?>
Berdan
fuente
0

Otra opción más ... He aquí cómo hacerlo en ansible. Se supone que el nombre de su base de datos está en dbnamey que ya ha configurado el acceso.

- name: Get list of DB tables that need converting to InnoDB
  command: >
    mysql --batch --skip-column-names --execute="SELECT TABLE_NAME
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = '{{ dbname }}' AND ENGINE = 'MyISAM';"
  register: converttables
  check_mode: no
  changed_when: False

- name: Convert any unconverted tables
  command: >
    mysql --batch --skip-column-names --execute="ALTER TABLE `{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
  with_items: "{{ converttables.stdout_lines }}"
Synchro
fuente
-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | cortar -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "alter table {} ENGINE = INNODB;" -uroot -pXXXXX

api984
fuente