Como converter todas as tabelas do MyISAM para InnoDB?

264

Eu sei que posso emitir uma tabela alter individualmente para alterar o armazenamento da tabela do MyISAM para o InnoDB.

Gostaria de saber se existe uma maneira de mudar rapidamente todos eles para o InnoDB?

Pentium10
fonte
1
Dicas sobre a conversão.
Rick James

Respostas:

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
fonte
5
Provavelmente seria melhor limitar isso ao banco de dados em que você está se concentrando. Adicionar um " 'dbname' E TABLE_SCHEMA =, caso contrário, este pode / vai mudar todas as tabelas internet MySQL para InnoDB, bem como (quando alguns deles deve ser memória)
Noodles
7
A mysql_*interface do PHP foi descontinuada e removida da versão 7. Não use esse código como está.
21717 Rick Rick
4
@GajendraBang - Sim, a resposta é válida quando apresentada. Mas para os recém-chegados, não é mais válido. Minha intenção era alertar contra o uso como está .
21917 Rick Rick
1
A questão não menciona PHP que seja
phil294
1
Como a edição mais recente não é sinalizada? A parte do MySQL é uma cópia direta da resposta de Will Jones. Observe cada histórico de edição para descobrir que a resposta de Will apareceu em 2013 e em 2019. Como resultado, a integridade desta pergunta está comprometida.
rmutalik 19/02
549

Execute esta instrução SQL (no cliente MySQL, phpMyAdmin ou qualquer outro local) para recuperar todas as tabelas MyISAM no seu banco de dados.

Substitua o valor da name_of_your_dbvariável pelo nome do banco de dados.

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;

Em seguida, copie a saída e execute como uma nova consulta SQL.

Will Jones
fonte
4
Isso funcionou muito bem! Eu colocá-lo em um script de exemplo shell aqui: shrubbery.mynetgear.net/c/display/W/...
Joshua Davis
4
"# 1267 mistura ilegal de agrupamentos ..." Estou recebendo esse erro, ele não funciona
Rápli András
1
Por curiosidade, qual é o sentido da ordenação descendente explícita? ( ORDER BY table_name DESC)
rinogo 7/03/2014
12
Se você está lidando com vários bancos de dados e não deseja alterar o banco de dados toda vez, mude CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')paraCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r
1
Se você deseja obter as instruções para todos os bancos de dados (exceto os bancos de dados do 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 como um encanto.

Isso fornecerá uma lista de todas as tabelas com as alterações de consultas que você pode executar em um lote

Omkar Kulkarni
fonte
5
Depois de executar isso, primeiro é necessário executar a seguinte consulta: USE databasename; Em seguida, você pode usar as consultas que o script acima fornece.
gijs007
Como você executa um lote?
Marc Alexander
A consulta acima fornecerá alterações nas consultas da tabela. basta selecionar todos eles e executá-los juntos. ou dividi-los em grupos de 50 consultas e executá-los se houver muitas tabelas no conjunto de resultados
Omkar Kulkarni
2
Está funcionando até em 2018 e no Percona Cluster. Se você usá-lo no PHPMyAdmin, receberá apenas 20 nomes ou mais e, em seguida, "..." ou um símbolo de paginação >>. Isso significa que você precisa clicar e continuar copiando todas as próximas páginas para não perder nenhuma tabela. Se você esquecer isso, poderá reaplicar com segurança a consulta acima e ela fornecerá as próximas tabelas do MyISAM a serem convertidas.
Dario Fumagalli
23

Nos scripts abaixo, substitua <username>, <password> e <schema> pelos seus dados específicos.

Para mostrar as instruções que você pode copiar e colar em uma sessão do cliente mysql, digite o seguinte:

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

Para simplesmente executar a alteração, use o seguinte:

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 é uma variação do que foi descrito neste artigo .

Vijay Varadan
fonte
23

Uma linha:

 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
fonte
1
A MELHOR e a resposta mais INTELIGENTE!
Biniam
Quando executo isso em um script bash, ele interpreta o $ 1 como uma variável de script bash, substituindo a definição NR. Alguma maneira de contornar isso?
Works for a Living
O @WorksforaLiving inclui os "$1"backticks como este: `"$1"`semelhante ao que está na minha resposta.
Vijay Varadan 29/04
20

Use isso como uma consulta sql no seu phpMyAdmin

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';
Zwarmapapa
fonte
3
Isso realmente não parece converter as tabelas para o InnoDB.
Charlie Schliesser
3
Isso gera um script que você executa para converter as tabelas - são duas etapas. No entanto, ele tenta converter as tabelas INFORMATION_SCHEMA - isso é ruim. Precisa limitá-lo ao banco de dados correto.
Brilliand #
1
Você precisará filtrar nossas tabelas internas do mysql - de acordo com os documentos "Não converta tabelas do sistema MySQL no banco de dados mysql (como usuário ou host) para o tipo InnoDB. Esta é uma operação não suportada. As tabelas do sistema sempre devem ser do tipo MyISAM. " link
eug 01/09/16
Sem editar para incorporar o comentário de @ eug nesta resposta, acho que merece um voto negativo, embora seja tão elegante quanto qualquer uma das variantes nesta página.
Mc0e
Hmm. @ charlie-s também está correto, e isso não produz SQL funcionando. Um voto negativo parece-me justificado.
Mc0e
18

Você pode executar esta instrução na ferramenta de linha 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

Você pode precisar especificar nome de usuário e senha usando: mysql -u nome de usuário -p O resultado é um script sql que você pode canalizar de volta para o mysql:

mysql name-of-database < convert.sql

Substitua "nome do banco de dados" na instrução e linha de comando acima.

Hendrik Brummermann
fonte
@itsraja, "echo" é um comando suportado pelo sh no linux / unix e cmd nos sistemas Microsoft; o resultado é canalizado como entrada para a ferramenta mysql.
Hendrik Brummermann
2
está certo. Mas você mencionou como "ferramenta de linha de comando mysql"
itsraja
1
Além disso, echo "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') DE TABELAS ONDE MOTOR! = 'InnoDB' E TABLE_TYPE = 'BASE TABLE' E TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql ERRO 1146 (42S02) na linha 1: A tabela 'testinno.TABLES' não existe
itsraja
Eu coloquei isso em um script de exemplo shell aqui: shrubbery.mynetgear.net/c/display/W/...
Joshua Davis
1
Como podemos escapar adequadamente da instrução sql como uma string? Como é agora, eu recebo-bash: ,TABLE_NAME,: command not found
arjan
10

É muito simples, existem apenas duas etapas, basta copiar e colar:

passo 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 e cole todos os resultados na guia sql)

passo 2: (copie todos os resultados na guia sql) e cole abaixo na linha

INICIAR A TRANSAÇÃO;

COMMIT;

por exemplo. INICIAR A TRANSAÇÃO;

ALTERAR A TABELA admin_files ENGINE = InnoDB;

COMMIT;

Sachin de Pune
fonte
10

Para gerar instruções ALTER para todas as tabelas em todos os esquemas não pertencentes ao sistema, ordenadas por esses esquemas / tabelas, execute o seguinte:

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;

Depois disso, execute essas consultas por meio de um cliente para executar a alteração.

  • A resposta é baseada nas respostas acima, mas melhora o tratamento do esquema.
Lavi Avigdor
fonte
8

Ainda não foi mencionado, então escreverei para a posteridade:

Se você estiver migrando entre servidores de banco de dados (ou tiver outro motivo para despejar e recarregar seu dta), basta modificar a saída de mysqldump:

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

Em seguida, carregue-o novamente:

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

(Além disso, na minha experiência limitada, esse pode ser um processo muito mais rápido do que alterar as tabelas 'ao vivo'. Provavelmente depende do tipo de dados e índices.)

Quinn Comendant
fonte
ty! Exatamente o que eu estava procurando. Testará em alguns dias.
Rainer
7

Aqui está uma maneira de fazer isso para usuários do 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

Adicione isso ao seu aplicativo nas pastas management / command / Depois você poderá converter todas as suas tabelas com o comando manage.py:

python manage.py convert_to_innodb
sanguessuga
fonte
5

No mysql, você pode usar a pesquisa / substituição usando um editor de texto:

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

Nota: Você provavelmente deve ignorar information_schema e mysql porque "Os bancos de dados mysql e information_schema, que implementam alguns dos internals do MySQL, ainda usam MyISAM. Em particular, você não pode alternar as tabelas de concessão para usar o InnoDB." ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )

De qualquer forma, observe as tabelas para ignorar e executar:

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

Agora basta copiar / colar essa lista no seu editor de texto e pesquisar / substituir "|" com "ALTER TABLE" etc.

Você terá uma lista como esta, basta colar no seu 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;

Se o seu editor de texto não puder fazer isso facilmente, aqui está outra solução para obter uma lista semelhante (que você pode colar no mysql) para apenas um prefixo do seu banco de dados, no terminal linux:

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

Uma versão simples do MySQL.

Você pode simplesmente iniciar o executável mysql, usar o banco de dados e copiar e colar a consulta.

Isso converterá todas as tabelas MyISAM no banco de dados atual em tabelas 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
fonte
Estou surpreso que não havia mais soluções baseadas em procedimentos armazenados!
FrustratedWithFormsDesigner
Como escrever e testar procedimentos no MySQL é complicado ;-) o comentário não tem nada a ver com a pergunta.
Harald Leithner
3

use esta linha para alterar o mecanismo de banco de dados para uma única tabela.

  ALTER TABLE table_name ENGINE = INNODB;
Desenvolvedor
fonte
3

Sou novato e tive que encontrar minha própria solução, porque os comandos mysql na web geralmente estão repletos de erros de ortografia, criando um pesadelo na vida real para as pessoas que estão começando. Aqui está a minha solução ....

Em vez de em um comando por tabela, preparei dezenas de comandos (prontos para copiar e colar) de uma só vez usando o excel.

Quão? expanda sua janela de massa e digite mysql e execute o comando "SHOW TABLE STATUS;" e copie / cole a saída no microsoft excel. Vá para a guia Dados e use o recurso "texto para colunas" e delimite as colunas por uma tecla de espaço. Em seguida, classifique as colunas por qualquer coluna que mostre seus tipos de tabela e exclua todas as linhas em que as tabelas já estão no formato InnoDb (porque não precisamos executar comandos contra elas, elas já estão prontas). Em seguida, adicione 2 colunas à esquerda da coluna das tabelas e 2 colunas à direita. Em seguida, cole a primeira parte do comando na coluna 1 (veja abaixo). A coluna 2 deve conter apenas um espaço. A coluna 3 é sua coluna de tabelas. A coluna 4 deve conter apenas um espaço. A coluna 5 é a última parte do seu comando. Deve ficar assim:

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;

Em seguida, copie e cole cerca de 5 linhas por vez no mysql. Isso converterá cerca de 5 de uma vez. Notei que se eu fizesse mais do que isso de uma vez, os comandos falhariam.

user3035649
fonte
3

No meu caso, eu estava migrando de uma instância do MySQL com o padrão MyISAM para uma instância do MariaDB com um DEFAULT do InnoDB.

Por documentos de migração do MariaDB.

No servidor antigo, execute:

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

O --skip-create-options garante que o servidor de banco de dados use o mecanismo de armazenamento padrão ao carregar os dados, em vez do MyISAM.

mysql -u root -p < migration.sql

Isso gerou um erro ao criar o mysql.db, mas tudo funciona muito bem agora :)

FreeSoftwareServers
fonte
3

Apenas testei de outra maneira (simples?) E funcionou para mim.

Apenas exporte seu DB como arquivo .sql, edite-o com o gedit ou o bloco de notas;

Substitua ENGINE=MyISAMpor ENGINE=INNODBe salve o arquivo editado

O número ou a substituição feita deve ser o número de suas tabelas

Importe-o para o MySQL (phpMyAdmin ou linha de comando)

E Voila!

Malibou
fonte
2

Você pode escrever um script para fazê-lo na sua linguagem de script favorita. O script faria o seguinte:

  1. Questão SHOW FULL TABLES .
  2. Para cada linha retornada, verifique se a segunda coluna diz 'BASE TABLE'e não'VIEW' .
  3. Caso contrário 'VIEW', emita o ALTER TABLEcomando apropriado .
Hammerite
fonte
2

Experimente 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
fonte
2

Algumas correções para este script util

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;
user3035727
fonte
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
fonte
1

Este é um script php simples.

<?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
fonte
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
fonte
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
fonte
0

Ainda outra opção ... Veja como fazê-lo de forma ansível. Ele pressupõe que o nome do seu banco de dados esteja dbnamee que você já configurou o acesso.

- 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
fonte
-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | cut -d "." -f1 xargs -I {} -n1 mysql -D DBNAME -e "altera a tabela {} ENGINE = INNODB;" -uroot -pXXXXX

api984
fonte