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
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
Antworten:
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
Sie können MySQL verwenden, um es zu skripten und auszuführen:
dbname
in MyISAM konvertiertCONVERT_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}
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.
dbname
in MyISAM konvertiert und nicht auf andere Server repliziertCONVERT_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}
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 !!!
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/...
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/...
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 username
und db_name
Werte 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 phpmyadmin
oder mysql
Kommandozeile aus.
Prost!
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