Prostszy sposób konwersji wszystkich tabel z InnoDB na MyISAM

13

Wcześniej używam tego:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Szukam prostszego sposobu na konwersję wszystkich tabel w bazie danych, zamiast pisać każdą nazwę tabeli jedna po drugiej

Cewebugil
źródło
1
Prostsze jak? To wydaje mi się dość proste.
Zoredache,
5
Naucz się korzystać ze skryptów, aby osiągnąć swoje cele.
Tom O'Connor,

Odpowiedzi:

11

Nie wiem, jak to zrobić w samym mysql, ale wystarczy prosty skrypt powłoki:

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
Insyte
źródło
1
jak wyłączyć sprawdzanie klucza obcego?
realtebo
7

Możesz użyć MySQL do skryptu i wykonania:

Spowoduje to konwersję każdej tabeli InnoDB w bazie danych dbnamedo MyISAM

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}

Spowoduje to konwersję każdej tabeli InnoDB do MyISAM

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}

Jeśli nie chcesz, aby konwersja tabel była replikowana do Slave, po prostu wstaw SET SQL_LOG_BIN=0;jako pierwszy wiersz. W ten sposób możesz przetestować konwersję w konfiguracji Master / Slave, najpierw konwertując tylko Slave, a następnie Master.

Spowoduje to konwersję każdej tabeli InnoDB w bazie danych dbnamedo MyISAM i nie powiela się na innych serwerach

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}

Spowoduje to konwersję każdej tabeli InnoDB do MyISAM i nie powiela się na innych serwerach

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}

Spróbuj !!!

RolandoMySQLDBA
źródło
Przechodząc z MyIsam2InnoDB w prawdziwym świecie, prawdopodobnie będziesz chciał SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; gdzieś ominąć no_zero_date od mysql 5.7 - Źródło stackoverflow.com/questions/9192027/...
Antony Gibbs
Przechodząc z MyIsam2InnoDB w prawdziwym świecie, prawdopodobnie będziesz chciał SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; gdzieś ominąć no_zero_date od mysql 5.7 - Źródło stackoverflow.com/questions/9192027/...
Antony Gibbs
0

Dla tych, którzy nadal mają ten problem, możesz to zrobić w ten sposób, znalazłem tę odpowiedź na stronie internetowej. To bardzo mi pomaga:

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

Aktualizuj usernamei db_namewartości z własnymi wartościami.

Po uruchomieniu skryptu zapisze plik pod nazwą: alter.sql Otwórz plik i uruchom zawartość w linii poleceń phpmyadminlub mysql.

Twoje zdrowie!

mayoralito
źródło
-1

Wolę jedno-linijki do tego typu rzeczy. Jest to jednoliniowa wersja najbardziej akceptowanej odpowiedzi.

Działa to, jeśli masz ustawioną nazwę użytkownika i hasło MySQL ~/.my.cnf.

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
kqw
źródło