MySQL a une commande OPTIMIZE TABLE qui peut être utilisée pour récupérer de l’espace inutilisé dans une installation MySQL. Existe-t-il un moyen (commande intégrée ou procédure stockée commune) d'exécuter cette optimisation pour chaque table de la base de données et/ou de l'installation du serveur, ou s'agit-il d'un moyen de script par vous-même?
Vous pouvez utiliser mysqlcheck
pour le faire en ligne de commande.
Une base de données:
mysqlcheck -o <db_schema_name>
Toutes les bases de données:
mysqlcheck -o --all-databases
J'ai fait ce script 'simple':
set @a=null,@c=null,@b=concat("show tables where",ifnull(concat(" `Tables_in_",database(),"` like '",@c,"' and"),'')," (@a:=concat_ws(',',@a,`Tables_in_",database(),"`))");
Prepare `bd` from @b;
EXECUTE `bd`;
DEALLOCATE PREPARE `bd`;
set @a:=concat('optimize table ',@a);
PREPARE `sql` FROM @a;
EXECUTE `sql`;
DEALLOCATE PREPARE `sql`;
set @a=null,@b=null,@c=null;
Pour l'exécuter, collez-le simplement dans tout SQL IDE connecté à votre base de données.
Remarque: ce code NE FONCTIONNE PAS sur phpmyadmin.
Il exécute une instruction show tables
et la stocke dans une instruction préparée. Ensuite, il exécute un optimize table
dans le jeu sélectionné.
Vous pouvez contrôler les tables à optimiser en définissant une valeur différente dans var @c
.
L'exemple suivant de script php peut vous aider à optimiser toutes les tables de votre base de données.
<?php
dbConnect();
$alltables = mysql_query("SHOW TABLES");
while ($table = mysql_fetch_assoc($alltables))
{
foreach ($table as $db => $tablename)
{
mysql_query("OPTIMIZE TABLE '".$tablename."'")
or die(mysql_error());
}
}
?>
pour toutes les bases de données:
mysqlcheck -Aos -uuser -p
Pour une optimisation de base de données:
mysqlcheck -os -uroot -p dbtest3
Effectuez toutes les procédures nécessaires pour corriger toutes les tables de toutes les bases de données avec un simple script Shell:
#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
En ligne de commande:
mysqlcheck -o <db_name> -u<username> -p
puis tapez mot de passe
Vous pouvez optimiser/vérifier et réparer toutes les tables de la base de données, en utilisant le client mysql.
Tout d’abord, vous devriez obtenir toute la liste des tables, séparées par ',':
mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|Perl -pe 's/ /,/g'
Maintenant, quand vous avez toute la liste des tables pour l'optimisation:
mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]
À partir de phpMyAdmin et d’autres sources, vous pouvez utiliser:
SET SESSION group_concat_max_len = 99999999;
SELECT GROUP_CONCAT(concat('OPTIMIZE TABLE `', table_name, '`;') SEPARATOR '') AS O
FROM INFORMATION_SCHEMA.TABLES WHERE
TABLE_TYPE = 'BASE TABLE'
AND table_name!='dual'
AND TABLE_SCHEMA = '<your databasename>'
Vous pouvez ensuite copier-coller le résultat dans une nouvelle requête ou l'exécuter à partir de votre propre source.
Le MySQL Administrator
(partie des outils de l'interface graphique MySQL) peut le faire pour vous au niveau de la base de données.
Sélectionnez simplement votre schéma et appuyez sur le bouton Maintenance
dans le coin inférieur droit.
Depuis que les outils graphiques ont atteint l'état de fin de vie, ils sont difficiles à trouver sur la page mysql. Les ont trouvés via Google: http://dev.mysql.com/downloads/gui-tools/5.0.html
Je ne sais pas si le nouveau MySQL Workbench peut le faire aussi.
Et vous pouvez utiliser l'outil de ligne de commande mysqlcheck
qui devrait pouvoir le faire également.
Si vous souhaitez analyser, réparer et optimiser toutes les tables de toutes les bases de données de votre serveur MySQL, vous pouvez le faire en une fois, à partir de la ligne de commande. Vous aurez cependant besoin de root pour le faire.
mysqlcheck -u root -p --auto-repair --optimize --all-databases
Une fois que vous avez exécuté cela, vous serez invité à entrer votre mot de passe root MySQL. Après cela, cela commencera et vous verrez les résultats au fur et à mesure.
Exemple de sortie:
yourdbname1.yourdbtable1 OK
yourdbname2.yourdbtable2 Table is already up to date
yourdbname3.yourdbtable3
note : Table does not support optimize, doing recreate + analyze instead
status : OK
etc..
etc...
Repairing tables
yourdbname10.yourdbtable10
warning : Number of rows changed from 121378 to 81562
status : OK
Si vous ne connaissez pas le mot de passe root et utilisez WHM, vous pouvez le modifier depuis WHM en allant à: Accueil> Services SQL> Mot de passe root MySQL
Ce script bash accepte le mot de passe root comme option et l’optimise un par un avec la sortie du statut:
#!/bin/bash
if [ -z "$1" ] ; then
echo
echo "ERROR: root password Parameter missing."
exit
fi
MYSQL_USER=root
MYSQL_PASS=$1
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
TBLLIST=""
COMMA=""
SQL="SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE"
SQL="${SQL} table_schema NOT IN ('information_schema','mysql','performance_schema')"
for DBTB in `mysql ${MYSQL_CONN} -ANe"${SQL}"`
do
echo OPTIMIZE TABLE "${DBTB};"
SQL="OPTIMIZE TABLE ${DBTB};"
mysql ${MYSQL_CONN} -ANe"${SQL}"
done
Un script de démarrage pour lister et exécuter un outil sur les bases de données ...
#!/bin/bash
declare -a dbs
unset opt
for each in $(echo "show databases;" | mysql -u root) ;do
dbs+=($each)
done
echo " The system found [ ${#dbs[@]} ] databases." ;sleep 2
echo
echo "press 1 to run a check"
echo "press 2 to run an optimization"
echo "press 3 to run a repair"
echo "press 4 to run check,repair, and optimization"
echo "press q to quit"
read input
case $input in
1) opt="-c"
;;
2) opt="-o"
;;
3) opt="-r"
;;
4) opt="--auto-repair -c -o"
;;
*) echo "Quitting Application .."; exit 7
;;
esac
[[ -z $opt ]] && exit 7;
echo " running option: mysqlcheck $opt in 5 seconds on all Dbs... "; sleep 5
for ((i=0; i<${#dbs[@]}; i++)) ;do
echo "${dbs[$i]} : "
mysqlcheck $opt ${dbs[$i]} -u root
done
Si vous accédez directement à la base de données, vous pouvez écrire la requête suivante:
OPTIMIZE TABLE table1,table2,table3,table4......;