Risposte:
<?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_*
interfaccia di PHP è obsoleta e rimossa dalla versione 7. Non utilizzare questo codice così com'è.
Eseguire questa istruzione SQL (nel client MySQL, phpMyAdmin o ovunque) per recuperare tutte le tabelle MyISAM nel database.
Sostituisci il valore della name_of_your_db
variabile con il nome del tuo database.
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;
Quindi, copia l'output ed eseguilo come una nuova query SQL.
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
passa aCONCAT('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';
Funziona come un fascino.
Questo ti darà un elenco di tutte le tabelle con le query di modifica che puoi eseguire in un batch
Negli script seguenti, sostituisci <nomeutente>, <password> e <schema> con i tuoi dati specifici.
Per mostrare le istruzioni che è possibile copiare e incollare in una sessione client mysql digitare quanto segue:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
Per eseguire semplicemente la modifica, utilizzare questo:
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>
CREDITO: Questa è una variante di ciò che è stato delineato in questo articolo .
Una linea:
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"
in questo modo: `"$1"`
simile a quello che c'è nella mia risposta.
Usalo come query sql nel tuo phpMyAdmin
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
È possibile eseguire questa istruzione nello strumento da riga di 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
Potrebbe essere necessario specificare nome utente e password utilizzando: mysql -u username -p Il risultato è uno script sql che è possibile reindirizzare a mysql:
mysql name-of-database < convert.sql
Sostituisci "nome-database" nell'istruzione e nella riga di comando sopra.
-bash: ,TABLE_NAME,: command not found
È molto semplice, ci sono solo DUE passaggi, basta copiare e incollare:
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;
(copia e incolla tutti i risultati nella scheda sql)
passaggio 2: (copia tutto il risultato nella scheda sql) e incolla sotto nella riga
INIZIA L'OPERAZIONE;
COMMETTERE;
per esempio. INIZIA L'OPERAZIONE;
ALTER TABLE admin_files
ENGINE = InnoDB;
COMMETTERE;
Per generare istruzioni ALTER per tutte le tabelle in tutti gli schemi non di sistema, ordinati da tali schemi / tabelle, eseguire quanto segue:
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;
Successivamente, esegui quelle query tramite un client per eseguire l'alterazione.
Non è ancora stato menzionato, quindi lo scriverò per i posteri:
Se stai migrando tra i server DB (o hai un altro motivo per scaricare e ricaricare il tuo dta), puoi semplicemente modificare l'output da mysqldump
:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
Quindi caricarlo di nuovo:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Inoltre, nella mia esperienza limitata, questo può essere un processo molto più veloce rispetto alla modifica delle tabelle "live". Probabilmente dipende dal tipo di dati e indici.)
Ecco un modo per farlo per gli utenti di 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
Aggiungilo alla tua app sotto le cartelle gestione / comandi / Quindi puoi convertire tutte le tue tabelle con un comando manage.py:
python manage.py convert_to_innodb
Dall'interno di mysql, è possibile utilizzare la ricerca / sostituzione utilizzando un editor di testo:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Nota: probabilmente dovresti ignorare information_schema e mysql perché "I database mysql e information_schema, che implementano alcuni interni di MySQL, usano ancora MyISAM. In particolare, non puoi cambiare le tabelle delle sovvenzioni per usare InnoDB." ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
In ogni caso, notare le tabelle da ignorare ed eseguire:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Ora copia / incolla quell'elenco nel tuo editor di testo e cerca / sostituisci "|" con "ALTER TABLE" ecc.
Avrai quindi un elenco come questo che puoi semplicemente incollare nel tuo terminale 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 il tuo editor di testo non può farlo facilmente, ecco un'altra soluzione per ottenere un elenco simile (che puoi incollare in mysql) per un solo prefisso del tuo database, dal terminale Linux:
mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Una semplice versione di MySQL.
Puoi semplicemente avviare eseguibile mysql, utilizzare il database e copiare e incollare la query.
Ciò convertirà tutte le tabelle MyISAM nel database corrente in tabelle 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;
utilizzare questa riga per modificare il motore di database per singola tabella.
ALTER TABLE table_name ENGINE = INNODB;
Sono un principiante e ho dovuto trovare la mia soluzione perché i comandi mysql sul web sono solitamente pieni di errori ortografici che creano un vero incubo per le persone che hanno appena iniziato. Ecco la mia soluzione ....
Invece di in 1 comando per tabella, ho preparato dozzine di comandi (pronti per essere copiati e incollati) contemporaneamente usando Excel.
Come? espandere la finestra del mastice e inserire mysql, quindi eseguire il comando "MOSTRA STATO TABELLA;" e copia / incolla l'output su microsoft excel. Vai alla scheda Dati e usa la funzione "testo in colonne" per delimitare le colonne con una chiave spaziale. Quindi ordina le colonne in base alla colonna che mostra i tipi di tabella ed elimina tutte le righe che sono già in formato InnoDb (poiché non è necessario eseguire comandi contro di esse, sono già state eseguite). Quindi aggiungi 2 colonne a sinistra della colonna delle tabelle e 2 colonne a destra. Quindi incolla la prima parte del comando nella colonna 1 (vedi sotto). La colonna 2 dovrebbe contenere solo uno spazio. La colonna 3 è la colonna delle tue tabelle. La colonna 4 dovrebbe contenere solo uno spazio. La colonna 5 è l'ultima parte del tuo comando. Dovrebbe sembrare come questo:
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;
Quindi copia e incolla circa 5 righe alla volta in mysql. Questo convertirà circa 5 contemporaneamente. Ho notato che se avessi fatto più di quello in una volta, i comandi sarebbero falliti.
Nel mio caso, stavo migrando da un'istanza MySQL con un'impostazione predefinita di MyISAM, a un'istanza MariaDB con DEFAULT di InnoDB.
Sulla vecchia esecuzione del server:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
--Skip-create-options assicura che il server di database utilizzi il motore di archiviazione predefinito durante il caricamento dei dati, anziché MyISAM.
mysql -u root -p < migration.sql
Questo ha generato un errore per quanto riguarda la creazione di mysql.db, ma ora tutto funziona alla grande :)
Ho appena provato un altro modo (semplice?) E ha funzionato per me.
Esporta semplicemente il tuo DB come file .sql, modificalo con gedit o notepad;
Sostituisci ENGINE=MyISAM
con ENGINE=INNODB
e salva il file modificato
Il numero o la sostituzione effettuata dovrebbe essere il numero delle tue tabelle
Importalo su MySQL (phpMyAdmin o riga di comando)
E voilà!
Puoi scrivere uno script per farlo nel tuo linguaggio di scripting preferito. Lo script farebbe quanto segue:
SHOW FULL TABLES
.'BASE TABLE'
e non 'VIEW'
.'VIEW'
, emettere il ALTER TABLE
comando appropriato .Prova questo script di 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
Alcune correzioni a questo 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");
}
}
Questo è un semplice script php.
<?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();
?>
per 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);
} ?>
Ancora un'altra opzione ... Ecco come farlo in ansible. Presuppone che sia presente il nome del database dbname
e che tu abbia già configurato l'accesso.
- 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 }}"