'ALTER table' para todas as tabelas em um banco de dados

4

Como posso executar o seguinte para cada tabela em um banco de dados:

ALTER table [table_name] type=innodb;

Eu não quero ter que executá-lo manualmente para cada tabela, mas sim executá-lo para todas as tabelas em um banco de dados. Como um aparte: Se você está curioso para saber porque eu estou executando isso: link & link

    
por BassKozz 22.03.2010 / 01:58

3 respostas

12

Supondo que você tenha suas credenciais configuradas no seu my.cnf, um comando como este pode fazer o que você quiser.

mysql --batch --skip-column-names --execute \
'select concat("alter table ",TABLE_SCHEMA,".",TABLE_NAME," type=innodb;") 
 from information_schema.TABLES where TABLE_SCHEMA="database_name"' | mysql

É claro que substitua database_name pelo nome do seu banco de dados.

Quanto a você questão principal. Parece que você quer recuperar espaço depois de deixar suas tabelas innodb ficarem grandes. Como o bug disse, a única forma segura de lidar com isso é usar o mysqldump para exportar tudo. Exclua os arquivos e, em seguida, restaure.

Como esse artigo observa. Você pode ativar a opção innodb_file_per_table para o my.cnf do seu servidor fará com que cada arquivo exista como um arquivo separado. Dessa forma, a recuperação de espaço pode ser feita excluindo / restaurando a tabela de problemas em vez de tudo.

    
por 22.03.2010 / 03:54
2

Sobre a resposta da Zoredache (que tem sido muito útil para mim, obrigado): - os nomes das colunas ignoradas devem ser usados para remover o título.

mysql --batch --skip-column-names -e \ 
'select concat("alter table ",TABLE_SCHEMA,".",TABLE_NAME," type=innodb;")  
 from information_schema.TABLES where TABLE_SCHEMA="database_name"' | mysql
    
por 30.11.2010 / 15:29
0

Eu não sei qual idioma você está usando, mas provavelmente você pode simplesmente executar:

show table status from 'DATABASE';

Em seguida, percorra o conjunto de resultados, gerando uma consulta para cada um.

    
por 22.03.2010 / 04:00

Tags