Maneira mais simples de converter todas as tabelas do InnoDB para o MyISAM

13

Anteriormente, eu uso isso:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Eu estou procurando uma maneira mais simples de converter todas as tabelas em um banco de dados, em vez de escrever cada nome de tabela, um por um

    
por cewebugil 10.03.2011 / 16:56

4 respostas

11

Não tenho conhecimento de nenhuma maneira de fazer isso no próprio mysql, mas um simples script de shell fará o trabalho:

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
    
por 10.03.2011 / 17:15
7

Você pode usar o MySQL para fazer o script e executá-lo:

Isto irá converter cada tabela InnoDB no banco de dados dbname para 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}

Isto irá converter cada tabela InnoDB para 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}

Se você não quiser que a conversão das tabelas seja replicada para o Slaves, basta colocar SET SQL_LOG_BIN=0; como a primeira linha. Dessa forma, você pode testar a conversão em uma configuração Mestre / Escravo convertendo somente o Escravo primeiro e depois o Mestre mais tarde.

Isto irá converter cada tabela InnoDB no banco de dados dbname para MyISAM e não replicar para outros 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}

Isto irá converter cada tabela InnoDB para MyISAM e não replicar para outros 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}

Experimente!

    
por 11.03.2011 / 03:35
0

Para quem ainda tem esse problema, você pode seguir este caminho para fazê-lo, encontrei essa resposta em um site. Isso me ajuda muito:

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

Atualize os valores username e db_name com seus próprios valores.

Depois de executar o script, ele salvará um arquivo com o nome: alter.sql Abra o arquivo e execute o conteúdo na linha de comando phpmyadmin ou mysql .

Felicidades!

    
por 16.07.2016 / 19:21
-1

Eu prefiro os one-liners para esse tipo de coisa. Esta é uma versão de uma linha da resposta mais aceita.

Isso funciona se você tiver seu nome de usuário e senha do MySQL definidos em ~/.my.cnf .

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
    
por 21.03.2015 / 14:43