Wie konvertiere ich alle Tabellen von MyISAM in InnoDB?

264

Ich weiß, dass ich eine Änderungstabelle einzeln ausgeben kann, um den Tabellenspeicher von MyISAM in InnoDB zu ändern.

Ich frage mich, ob es eine Möglichkeit gibt, alle schnell auf InnoDB umzustellen.

Pentium10
quelle
1
Tipps zur Konvertierung.
Rick James

Antworten:

173
<?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);
    }
?>
Gajendra Bang
quelle
5
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'
ORDER BY table_name DESC;

Kopieren Sie dann die Ausgabe und führen Sie sie als neue SQL-Abfrage aus.

Will Jones
quelle
4
Das hat gut funktioniert! Ich habe es hier in ein Beispiel-Shell-Skript eingefügt: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
4
"# 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

Omkar Kulkarni
quelle
5
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:

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 .

Vijay Varadan
quelle
23

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
Kuzea
quelle
1
Die BESTE und INTELLIJENTSTE Antwort!
Biniam
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';
Zwarmapapa
quelle
3
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.

Hendrik Brummermann
quelle
@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
itsraja
Ich habe dies hier in ein Beispiel-Shell-Skript eingefügt: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
1
Wie können wir der SQL-Anweisung als Zeichenfolge ordnungsgemäß entkommen? Wie es jetzt ist, bekomme ich-bash: ,TABLE_NAME,: command not found
Arjan
10

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;

Sachin aus Pune
quelle
10

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.

  • Die Antwort basiert auf den obigen Antworten, verbessert jedoch die Schemabehandlung.
Lavi Avigdor
quelle
8

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.)

Quinn Comendant
quelle
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");

        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
Blutegel
quelle
5

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;"
PJ Brunet
quelle
5

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;
Harald Leithner
quelle
Ich bin überrascht, dass es nicht mehr gespeicherte prozedurbasierte Lösungen gab!
FrustratedWithFormsDesigner
Da das Schreiben und Testen von Verfahren in MySQL schmerzhaft ist ;-), hat der Kommentar nichts mit der Frage zu tun.
Harald Leithner
3

Verwenden Sie diese Zeile, um das Datenbankmodul für eine einzelne Tabelle zu ändern.

  ALTER TABLE table_name ENGINE = INNODB;
Entwickler
quelle
3

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.

user3035649
quelle
3

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:

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 :)

FreeSoftwareServer
quelle
3

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=MyISAMdurch ENGINE=INNODBund speichern Sie sie

Die Anzahl oder Ersetzung sollte die Anzahl Ihrer Tabellen sein

Importieren Sie es in MySQL (phpMyAdmin oder Befehlszeile)

Und Voila!

Malibou
quelle
2

Sie können ein Skript schreiben, um dies in Ihrer bevorzugten Skriptsprache zu tun. Das Skript würde Folgendes tun:

  1. Problem SHOW FULL TABLES .
  2. Überprüfen Sie für jede zurückgegebene Zeile, ob in der zweiten Spalte steht 'BASE TABLE' nicht" angegeben ist'VIEW' .
  3. Ist dies nicht 'VIEW'der Fall, geben Sie den entsprechenden ALTER TABLEBefehl ein.
Hammerit
quelle
2

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
Muhammad Reda
quelle
2

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;
user3035727
quelle
1
<?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");
    }
  }
Rodrigo Gregorio
quelle
1

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>';
    }
touzas
quelle
1
<?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();

?>
Russell G.
quelle
1

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);
} ?>
Berdan
quelle
0

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_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 }}"
Synchro
quelle
-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | cut -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "alter table {} ENGINE = INNODB;" -uroot -pXXXXX

api984
quelle