<?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);}?>
Es wäre wahrscheinlich besser, dies auf die Datenbank zu beschränken, auf die Sie sich konzentrieren. Fügen Sie ein "AND TABLE_SCHEMA = 'dbname' hinzu, andernfalls kann / wird dies auch alle Internet-MySQL-Tabellen in innodb ändern (wenn einige von ihnen Speicher sein sollten)
Noodles
7
Die PHP- mysql_*Schnittstelle ist veraltet und wurde aus Version 7 entfernt. Verwenden Sie diesen Code nicht so wie er ist.
Rick James
4
@ GajendraBang - Ja, die Antwort gilt als gültig, wenn sie präsentiert wird. Aber für Neulinge ist es nicht mehr gültig. Meine Absicht war es, davor zu warnen, es so zu verwenden, wie es ist .
Rick James
1
Die Frage erwähnt PHP überhaupt nicht
phil294
1
Wie wird die letzte Bearbeitung nicht markiert? Der MySQL-Teil ist eine direkte Kopie der Antwort von Will Jones. Sehen Sie sich jeden Bearbeitungsverlauf an, um festzustellen, dass Wills Antwort 2013 und diese Antwort 2019 erschienen sind. Infolgedessen ist die Integrität dieser Frage beeinträchtigt.
rmutalik
549
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_dbVariablen 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'ORDERBY table_name DESC;
Kopieren Sie dann die Ausgabe und führen Sie sie als neue SQL-Abfrage aus.
"# 1267 illegale Mischung von Kollatierungen ..." Ich
erhalte
1
Was bringt die explizite absteigende Reihenfolge aus Neugier? ( ORDER BY table_name DESC)
Rinogo
12
Wenn Sie mit mehreren Datenbanken zu tun haben und die Datenbank nicht jedes Mal ändern möchten, wechseln Sie CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')zuCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r
1
Wenn Sie die Anweisungen für alle Datenbanken (außer den MySQL-Systemdatenbanken) erhalten 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
möchten
61
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
Nachdem Sie dies ausgeführt haben, müssen Sie zuerst die folgende Abfrage ausführen: USE-Datenbankname; Dann können Sie die Abfragen verwenden, die das obige Skript gibt.
gijs007
Wie führt man einen Stapel aus?
Marc Alexander
Mit der obigen Abfrage können Sie Tabellenabfragen ändern. Wählen Sie sie einfach alle aus und führen Sie sie zusammen aus. oder teilen Sie sie in Gruppen von 50 Abfragen und führen Sie sie aus, wenn die Ergebnismenge zu viele Tabellen enthält
Omkar Kulkarni
2
Es funktioniert sogar im Jahr 2018 und im Percona Cluster. Wenn Sie es von PHPMyAdmin verwenden, erhalten Sie nur etwa 20 Namen, dann "..." oder ein Paginierungssymbol >>. Dies bedeutet, dass Sie auf alle nächsten Seiten klicken und diese weiter kopieren müssen, damit Sie keine Tabelle verpassen. Wenn Sie dies vergessen, können Sie die obige Abfrage sicher erneut anwenden und erhalten die nächsten zu konvertierenden MyISAM-Tabellen.
Dario Fumagalli
23
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:
Wenn ich dies in einem Bash-Skript ausführe, interpretiert es $ 1 als Bash-Skriptvariable, die die NR-Definition überschreibt. Wie kann man das umgehen?
Arbeitet für den
@WorksforaLiving fügen die "$1"Backticks wie folgt bei: `"$1"`Ähnlich wie in meiner Antwort.
Vijay Varadan
20
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';
Dies scheint die Tabellen nicht wirklich in InnoDB zu konvertieren.
Charlie Schliesser
3
Dies gibt ein Skript aus, das Sie dann ausführen, um die Tabellen zu konvertieren - es sind zwei Schritte. Es wird jedoch versucht, INFORMATION_SCHEMA-Tabellen zu konvertieren - das ist eine schlechte Sache. Sie müssen es auf die richtige Datenbank beschränken.
Brilliand
1
Sie müssen unsere internen MySQL-Tabellen filtern - gemäß den Dokumenten "Konvertieren Sie MySQL-Systemtabellen in der MySQL-Datenbank (z. B. Benutzer oder Host) nicht in den InnoDB-Typ. Dies ist eine nicht unterstützte Operation. Die Systemtabellen müssen immer sein vom Typ MyISAM. " link
eug
Ohne zu bearbeiten, um den Kommentar von @ eug in diese Antwort aufzunehmen, denke ich, dass es eine Abwertung verdient, obwohl es ansonsten so elegant ist wie jede der Varianten auf dieser Seite.
mc0e
Hmm. @ charlie-s ist auch korrekt, und dies erzeugt kein funktionierendes SQL. Eine Abwertung erscheint mir gerechtfertigt.
mc0e
18
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.
@itsraja, "echo" ist ein Befehl, der sowohl von sh unter Linux / Unix als auch von cmd auf Microsoft-Systemen unterstützt wird. Das Ergebnis wird als Eingabe an das MySQL-Tool weitergeleitet.
Hendrik Brummermann
2
das stimmt. Aber Sie haben als "MySQL-Befehlszeilen-Tool" erwähnt
itsraja
1
Echo "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') FROM TABLES WHERE ENGINE! = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql FEHLER 1146 (42S02) in Zeile 1: Tabelle 'testinno.TABLES' existiert nicht
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 NOTIN('mysql','information_schema','performance_schema','innodb','sys','tmp')AND`ENGINE`='MyISAM'AND`TABLE_TYPE`='BASE TABLE'ORDERBY TABLE_SCHEMA, table_name DESC;
Führen Sie danach diese Abfragen über einen Client aus, um die Änderung durchzuführen.
Die Antwort basiert auf den obigen Antworten, verbessert jedoch die Schemabehandlung.
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:
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.)
ty! genau das, wonach ich gesucht habe. Wird es in ein paar Tagen testen.
Rainer
7
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");forrowincursor.fetchall():ifrow[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:
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:
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;"
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;
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:
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.
<?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 dbnameund 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_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 }}"
Antworten:
quelle
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.Kopieren Sie dann die Ausgabe und führen Sie sie als neue SQL-Abfrage aus.
quelle
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
Klappt wunderbar.
Dadurch erhalten Sie eine Liste aller Tabellen mit den Änderungsabfragen, die Sie in einem Stapel ausführen können
quelle
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:
Verwenden Sie Folgendes, um die Änderung einfach auszuführen:
KREDIT: Dies ist eine Variation dessen, was in diesem Artikel beschrieben wurde .
quelle
Eine Linie:
quelle
"$1"
Backticks wie folgt bei:`"$1"`
Ähnlich wie in meiner Antwort.Verwenden Sie dies als SQL-Abfrage in Ihrem phpMyAdmin
quelle
Sie können diese Anweisung im MySQL-Befehlszeilentool ausführen:
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:
Ersetzen Sie "Name der Datenbank" in der obigen Anweisung und Befehlszeile.
quelle
-bash: ,TABLE_NAME,: command not found
Es ist sehr einfach, es gibt nur ZWEI Schritte, einfach kopieren und einfügen:
Schritt 1.
(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;
quelle
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:
Führen Sie danach diese Abfragen über einen Client aus, um die Änderung durchzuführen.
quelle
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
:Dann laden Sie es erneut:
(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.)
quelle
Hier ist eine Möglichkeit, dies für Django-Benutzer zu tun:
Fügen Sie dies Ihrer App unter Ordnerverwaltung / Befehle / hinzu. Dann können Sie alle Ihre Tabellen mit einem Befehl manage.py konvertieren:
quelle
In MySQL können Sie das Suchen / Ersetzen mit einem Texteditor verwenden:
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:
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:
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:
quelle
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.
quelle
Verwenden Sie diese Zeile, um das Datenbankmodul für eine einzelne Tabelle zu ändern.
quelle
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:
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.
quelle
In meinem Fall habe ich von einer MySQL-Instanz mit der Standardeinstellung MyISAM auf eine MariaDB-Instanz mit der Standardeinstellung InnoDB migriert.
Per MariaDB Migration Doc's.
Auf altem Server ausführen:
Die Option --skip-create-stellt sicher, dass der Datenbankserver beim Laden der Daten anstelle von MyISAM die Standardspeicher-Engine verwendet.
Dies warf einen Fehler beim Erstellen von mysql.db auf, aber jetzt funktioniert alles hervorragend :)
quelle
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
durchENGINE=INNODB
und speichern Sie sieDie Anzahl oder Ersetzung sollte die Anzahl Ihrer Tabellen sein
Importieren Sie es in MySQL (phpMyAdmin oder Befehlszeile)
Und Voila!
quelle
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 entsprechendenALTER TABLE
Befehl ein.quelle
Versuchen Sie dieses Shell-Skript
quelle
Einige Korrekturen an diesem Util-Skript
quelle
quelle
Dies ist ein einfaches PHP-Skript.
quelle
quelle
für mysqli verbinden;
quelle
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.quelle
cd / var / lib / mysql / DBNAME
ls | grep ".frm" | cut -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "alter table {} ENGINE = INNODB;" -uroot -pXXXXX
quelle