Un moyen plus simple de convertir toutes les tables d'InnoDB en MyISAM

13

Auparavant, j'utilise ceci:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Je cherche un moyen plus simple de convertir toutes les tables d'une base de données, plutôt que d'écrire chaque nom de table un par un

cewebugil
la source
1
Plus simple comment? Cela me semble assez simple.
Zoredache
5
Apprenez à utiliser les scripts pour atteindre vos objectifs.
Tom O'Connor

Réponses:

11

Je ne connais aucun moyen de le faire dans mysql lui-même, mais un simple script shell fera le travail:

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
la source
1
comment désactiver la vérification des clés étrangères?
realtebo
7

Vous pouvez utiliser MySQL pour l'écrire et l'exécuter:

Cela convertira chaque table InnoDB de la base dbnamede données en 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}

Cela convertira chaque table InnoDB en 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}

Si vous ne souhaitez pas que la conversion des tables soit répliquée en esclaves, placez-la SET SQL_LOG_BIN=0;comme première ligne. De cette façon, vous pouvez tester la conversion dans une configuration maître / esclave en convertissant uniquement l'esclave d'abord, puis le maître plus tard.

Cela convertira chaque table InnoDB de la base dbnamede données en MyISAM et ne sera pas répliquée sur d'autres serveurs

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}

Cela convertira chaque table InnoDB en MyISAM et ne se répliquera pas sur d'autres serveurs

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}

Essaie !!!

RolandoMySQLDBA
la source
En passant de MyIsam2InnoDB dans le monde réel, vous voudrez probablement SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; quelque part pour contourner la no_zero_date depuis mysql 5.7 - Source stackoverflow.com/questions/9192027/…
Antony Gibbs
En passant de MyIsam2InnoDB dans le monde réel, vous voudrez probablement SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; quelque part pour contourner la no_zero_date depuis mysql 5.7 - Source stackoverflow.com/questions/9192027/…
Antony Gibbs
0

Pour ceux qui ont toujours ce problème, vous pouvez suivre cette façon de le faire, j'ai trouvé cette réponse dans un site Web. Cela m'aide beaucoup:

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

Mise à jour usernameet db_namevaleurs avec vos propres valeurs.

Après l'exécution du script, il enregistrera un fichier sous son nom: alter.sql ouvrez le fichier et exécutez le contenu sur votre ligne de commande phpmyadminou mysql.

À votre santé!

mayoralito
la source
-1

Je préfère les doublures pour ce type de trucs. Il s'agit d'une version à une ligne de la réponse la plus acceptée.

Cela fonctionne si vous avez défini votre nom d'utilisateur et votre mot de passe 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
la source