Einfachere Möglichkeit, alle Tabellen von InnoDB nach MyISAM zu konvertieren


13

Bisher benutze ich Folgendes:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Ich suche nach einer einfacheren Möglichkeit, alle Tabellen in einer Datenbank zu konvertieren, anstatt jeden Tabellennamen einzeln zu schreiben


1
Einfacher wie? Das sieht für mich ziemlich einfach aus.
Zoredache

5
Erfahren Sie, wie Sie mit Skripten Ihre Ziele erreichen.
Tom O'Connor

Antworten:


11

Ich kenne keine Möglichkeit, dies in MySQL selbst zu tun, aber ein einfaches Shell-Skript erledigt den Job:

TABLES=$(mysql -pXXXXXXX -uXXXXXXX --skip-column-names -B -D $DB -e 'show tables')
for T in $TABLES
do
    mysql -pXXXXX -uXXXXX -D $DB -e "ALTER TABLE $T ENGINE=MYISAM"
done

1
Wie deaktiviere ich die Fremdschlüsselprüfung?
Realtebo

7

Sie können MySQL verwenden, um es zu skripten und auszuführen:

Dadurch wird jede InnoDB-Tabelle in der Datenbank dbnamein MyISAM konvertiert

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Dadurch wird jede InnoDB-Tabelle in MyISAM konvertiert

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Wenn Sie nicht möchten, dass die Konvertierung der Tabellen in Slaves repliziert wird, geben Sie einfach SET SQL_LOG_BIN=0;die erste Zeile ein. Auf diese Weise können Sie die Konvertierung in einem Master / Slave-Setup testen, indem Sie zuerst den Slave und später den Master konvertieren.

Dadurch wird jede InnoDB-Tabelle in der Datenbank dbnamein MyISAM konvertiert und nicht auf andere Server repliziert

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Dadurch wird jede InnoDB-Tabelle in MyISAM konvertiert und nicht auf andere Server repliziert

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Versuche es !!!


Wenn man von MyIsam2InnoDB in der realen Welt Sie wahrscheinlich werden wollen SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; irgendwo Bypass der NO_ZERO_DATE seit MySQL 5.7 - Quelle stackoverflow.com/questions/9192027/...
Antony Gibbs

Wenn man von MyIsam2InnoDB in der realen Welt Sie wahrscheinlich werden wollen SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; irgendwo Bypass der NO_ZERO_DATE seit MySQL 5.7 - Quelle stackoverflow.com/questions/9192027/...
Antony Gibbs

0

Für diejenigen, die immer noch dieses Problem haben, können Sie dies folgendermaßen tun. Ich habe diese Antwort auf einer Website gefunden. Das hilft mir sehr:

shell> mysql -u username -p -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'" | tail -n+2 >> alter.sql

Aktualisieren Sie usernameund db_nameWerte mit Ihren eigenen Werten.

Wenn Sie das Skript ausführen, wird eine Datei unter dem Namen gespeichert: alter.sql Öffnen Sie die Datei und führen Sie den Inhalt auf Ihrer phpmyadminoder mysqlKommandozeile aus.

Prost!


-1

Ich bevorzuge Einzeiler für diese Art von Sachen. Dies ist eine einzeilige Version der am häufigsten akzeptierten Antwort.

Dies funktioniert, wenn Sie Ihren MySQL-Benutzernamen und Ihr Passwort eingegeben haben ~/.my.cnf.

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.