<?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);}?>
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'ORDERBY table_name DESC;
Em seguida, copie a saída e execute como uma nova consulta SQL.
"# 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
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:
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';
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.
@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
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 NOTIN('mysql','information_schema','performance_schema','innodb','sys','tmp')AND`ENGINE`='MyISAM'AND`TABLE_TYPE`='BASE TABLE'ORDERBY 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.
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:
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.)
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");forrowincursor.fetchall():ifrow[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:
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:
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;"
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;
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:
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.
<?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 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_NAMEFROM 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="ALTERTABLE`{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
with_items: "{{ converttables.stdout_lines }}"
Respostas:
fonte
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.Em seguida, copie a saída e execute como uma nova consulta SQL.
fonte
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
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
fonte
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:
Para simplesmente executar a alteração, use o seguinte:
CRÉDITO: Esta é uma variação do que foi descrito neste artigo .
fonte
Uma linha:
fonte
"$1"
backticks como este:`"$1"`
semelhante ao que está na minha resposta.Use isso como uma consulta sql no seu phpMyAdmin
fonte
Você pode executar esta instrução na ferramenta de linha de comando mysql:
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:
Substitua "nome do banco de dados" na instrução e linha de comando acima.
fonte
-bash: ,TABLE_NAME,: command not found
É muito simples, existem apenas duas etapas, basta copiar e colar:
passo 1.
(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;
fonte
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:
Depois disso, execute essas consultas por meio de um cliente para executar a alteração.
fonte
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
:Em seguida, carregue-o novamente:
(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.)
fonte
Aqui está uma maneira de fazer isso para usuários do Django:
Adicione isso ao seu aplicativo nas pastas management / command / Depois você poderá converter todas as suas tabelas com o comando manage.py:
fonte
No mysql, você pode usar a pesquisa / substituição usando um editor de texto:
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:
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:
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:
fonte
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.
fonte
use esta linha para alterar o mecanismo de banco de dados para uma única tabela.
fonte
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:
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.
fonte
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:
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.
Isso gerou um erro ao criar o mysql.db, mas tudo funciona muito bem agora :)
fonte
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
porENGINE=INNODB
e salve o arquivo editadoO 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!
fonte
Você pode escrever um script para fazê-lo na sua linguagem de script favorita. O script faria o seguinte:
SHOW FULL TABLES
.'BASE TABLE'
e não'VIEW'
.'VIEW'
, emita oALTER TABLE
comando apropriado .fonte
Experimente este script de shell
fonte
Algumas correções para este script util
fonte
fonte
Este é um script php simples.
fonte
fonte
para mysqli connect;
fonte
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.fonte
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
fonte