Respostas:
<?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);
}
?>
mysql_*
interface do PHP foi descontinuada e removida da versão 7. Não use esse código como está.
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_db
variá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.
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
paraCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
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
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
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 .
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
"$1"
backticks como este: `"$1"`
semelhante ao que está na minha resposta.
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';
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.
-bash: ,TABLE_NAME,: command not found
É 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;
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.
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.)
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
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;"
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;
use esta linha para alterar o mecanismo de banco de dados para uma única tabela.
ALTER TABLE table_name ENGINE = INNODB;
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.
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 :)
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=MyISAM
por ENGINE=INNODB
e 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!
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
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;
<?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");
}
}
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>';
}
<?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();
?>
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);
} ?>
Ainda outra opção ... Veja como fazê-lo de forma ansível. Ele pressupõe que o nome do seu banco de dados esteja dbname
e 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 }}"