Antworten:
<?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_*
Schnittstelle ist veraltet und wurde aus Version 7 entfernt. Verwenden Sie diesen Code nicht so wie er ist.
Führen Sie diese SQL-Anweisung aus (im MySQL-Client, in phpMyAdmin oder wo auch immer), um alle MyISAM-Tabellen in Ihrer Datenbank abzurufen.
Ersetzen Sie den Wert der name_of_your_db
Variablen durch Ihren Datenbanknamen.
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;
Kopieren Sie dann die Ausgabe und führen Sie sie als neue SQL-Abfrage aus.
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
zuCONCAT('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';
Klappt wunderbar.
Dadurch erhalten Sie eine Liste aller Tabellen mit den Änderungsabfragen, die Sie in einem Stapel ausführen können
Ersetzen Sie in den folgenden Skripten <Benutzername>, <Kennwort> und <Schema> durch Ihre spezifischen Daten.
Geben Sie Folgendes ein, um die Anweisungen anzuzeigen, die Sie kopieren und in eine MySQL-Client-Sitzung einfügen können:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
Verwenden Sie Folgendes, um die Änderung einfach auszuführen:
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>
KREDIT: Dies ist eine Variation dessen, was in diesem Artikel beschrieben wurde .
Eine Linie:
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 wie folgt bei: `"$1"`
Ähnlich wie in meiner Antwort.
Verwenden Sie dies als SQL-Abfrage in Ihrem phpMyAdmin
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
Sie können diese Anweisung im MySQL-Befehlszeilentool ausführen:
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
Möglicherweise müssen Sie den Benutzernamen und das Kennwort wie folgt angeben: mysql -u Benutzername -p Das Ergebnis ist ein SQL-Skript, das Sie zurück in mysql leiten können:
mysql name-of-database < convert.sql
Ersetzen Sie "Name der Datenbank" in der obigen Anweisung und Befehlszeile.
-bash: ,TABLE_NAME,: command not found
Es ist sehr einfach, es gibt nur ZWEI Schritte, einfach kopieren und einfügen:
Schritt 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;
(Kopieren und Einfügen aller Ergebnisse in SQL-Registerkarte)
Schritt 2: (Kopieren Sie alle Ergebnisse in die Registerkarte SQL) und fügen Sie sie unten in die Zeile ein
TRANSAKTION STARTEN;
VERPFLICHTEN;
z.B. TRANSAKTION STARTEN;
ALTER TABLE admin_files
ENGINE = InnoDB;
VERPFLICHTEN;
Führen Sie Folgendes aus, um ALTER-Anweisungen für alle Tabellen in allen Nicht-Systemschemas zu generieren, die nach diesen Schemas / Tabellen geordnet sind:
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;
Führen Sie danach diese Abfragen über einen Client aus, um die Änderung durchzuführen.
Es wurde noch nicht erwähnt, also schreibe ich es für die Nachwelt:
Wenn Sie zwischen DB-Servern migrieren (oder einen anderen Grund haben, warum Sie Ihre dta sichern und neu laden würden), können Sie die Ausgabe einfach ändern von mysqldump
:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
Dann laden Sie es erneut:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Nach meiner begrenzten Erfahrung kann dies auch ein viel schnellerer Prozess sein als das Ändern der Tabellen "live". Dies hängt wahrscheinlich von der Art der Daten und Indizes ab.)
Hier ist eine Möglichkeit, dies für Django-Benutzer zu tun:
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
Fügen Sie dies Ihrer App unter Ordnerverwaltung / Befehle / hinzu. Dann können Sie alle Ihre Tabellen mit einem Befehl manage.py konvertieren:
python manage.py convert_to_innodb
In MySQL können Sie das Suchen / Ersetzen mit einem Texteditor verwenden:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Hinweis: Sie sollten information_schema und mysql wahrscheinlich ignorieren, da "die Datenbanken mysql und information_schema, die einige der MySQL-Interna implementieren, weiterhin MyISAM verwenden. Insbesondere können Sie die Grant-Tabellen nicht auf InnoDB umstellen." ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
Beachten Sie in jedem Fall die zu ignorierenden und auszuführenden Tabellen:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Kopieren Sie nun einfach diese Liste in Ihren Texteditor und suchen / ersetzen Sie "|" mit "ALTER TABLE" etc.
Sie haben dann eine Liste wie diese, die Sie einfach in Ihr MySQL-Terminal einfügen können:
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;
Wenn Ihr Texteditor dies nicht einfach tun kann, finden Sie hier eine andere Lösung, um eine ähnliche Liste (die Sie in MySQL einfügen können) für nur ein Präfix Ihrer Datenbank vom Linux-Terminal abzurufen:
mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Eine einfache MySQL-Version.
Sie können einfach die ausführbare MySQL-Datei starten, die Datenbank verwenden und die Abfrage kopieren und einfügen.
Dadurch werden alle MyISAM-Tabellen in der aktuellen Datenbank in INNODB-Tabellen konvertiert.
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;
Verwenden Sie diese Zeile, um das Datenbankmodul für eine einzelne Tabelle zu ändern.
ALTER TABLE table_name ENGINE = INNODB;
Ich bin ein Neuling und musste meine eigene Lösung finden, da MySQL-Befehle im Web normalerweise mit Rechtschreibfehlern durchsetzt sind und einen echten Albtraum für Leute darstellen, die gerade erst anfangen. Hier ist meine Lösung ....
Anstelle von 1 Befehl pro Tabelle habe ich Dutzende von Befehlen (zum Kopieren und Einfügen bereit) gleichzeitig mit Excel vorbereitet.
Wie? Erweitern Sie Ihr Kittfenster, geben Sie mysql ein und führen Sie den Befehl "SHOW TABLE STATUS;" aus. und das Kopieren / Einfügen der Ausgabe in Microsoft Excel. Gehen Sie zur Registerkarte Daten und verwenden Sie die Funktion "Text in Spalten", um die Spalten durch eine Leertaste zu begrenzen. Sortieren Sie dann die Spalten nach der Spalte, in der Ihre Tabellentypen angezeigt werden, und löschen Sie alle Zeilen, für die die Tabellen bereits im InnoDb-Format vorliegen (da keine Befehle für sie ausgeführt werden müssen, sind sie bereits ausgeführt). Fügen Sie dann links von der Tabellenspalte 2 Spalten und rechts 2 Spalten hinzu. Fügen Sie dann den ersten Teil des Befehls in Spalte 1 ein (siehe unten). Spalte 2 sollte nur ein Leerzeichen enthalten. Spalte 3 ist Ihre Tabellenspalte. Spalte 4 sollte nur ein Leerzeichen enthalten. Spalte 5 ist der letzte Teil Ihres Befehls. Es sollte so aussehen:
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;
Kopieren Sie dann etwa 5 Zeilen gleichzeitig und fügen Sie sie in MySQL ein. Dies wird ungefähr 5 auf einmal konvertieren. Ich bemerkte, wenn ich mehr als das auf einmal tat, würden die Befehle fehlschlagen.
In meinem Fall habe ich von einer MySQL-Instanz mit der Standardeinstellung MyISAM auf eine MariaDB-Instanz mit der Standardeinstellung InnoDB migriert.
Auf altem Server ausführen:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
Die Option --skip-create-stellt sicher, dass der Datenbankserver beim Laden der Daten anstelle von MyISAM die Standardspeicher-Engine verwendet.
mysql -u root -p < migration.sql
Dies warf einen Fehler beim Erstellen von mysql.db auf, aber jetzt funktioniert alles hervorragend :)
Habe gerade einen anderen (einfachen?) Weg getestet und für mich gearbeitet.
Exportieren Sie einfach Ihre Datenbank als SQL-Datei und bearbeiten Sie sie mit gedit oder notepad.
Ersetzen Sie die bearbeitete Datei ENGINE=MyISAM
durch ENGINE=INNODB
und speichern Sie sie
Die Anzahl oder Ersetzung sollte die Anzahl Ihrer Tabellen sein
Importieren Sie es in MySQL (phpMyAdmin oder Befehlszeile)
Und Voila!
Sie können ein Skript schreiben, um dies in Ihrer bevorzugten Skriptsprache zu tun. Das Skript würde Folgendes tun:
SHOW FULL TABLES
.'BASE TABLE'
nicht" angegeben ist'VIEW'
.'VIEW'
der Fall, geben Sie den entsprechenden ALTER TABLE
Befehl ein.Versuchen Sie dieses Shell-Skript
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
Einige Korrekturen an diesem Util-Skript
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");
}
}
Dies ist ein einfaches PHP-Skript.
<?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();
?>
für mysqli verbinden;
<?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);
} ?>
Noch eine Option ... So geht's in ansible. Es wird davon ausgegangen, dass sich der Name Ihrer Datenbank in befindet dbname
und Sie den Zugriff bereits konfiguriert haben.
- 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 }}"