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
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
Réponses:
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
Vous pouvez utiliser MySQL pour l'écrire et l'exécuter:
dbname
de données en MyISAMCONVERT_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}
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.
dbname
de données en MyISAM et ne sera pas répliquée sur d'autres serveursCONVERT_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}
Essaie !!!
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/…
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/…
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 username
et db_name
valeurs 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 phpmyadmin
ou mysql
.
À votre santé!
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