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


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

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 !!!


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é!


-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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.