web-dev-qa-db-fra.com

MySQL optimiser toutes les tables?

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?

223
Alan Storm

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
373
Ike Walker

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.

Comment ça marche

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.

20
Ismael Miguel

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());

   }
}

?>
16
Dmitriy Naumov

pour toutes les bases de données:

mysqlcheck -Aos -uuser -p 

Pour une optimisation de base de données:

mysqlcheck -os -uroot -p dbtest3
10
Muni

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
10
Ivan Velkov

En ligne de commande:

mysqlcheck -o <db_name> -u<username> -p

puis tapez mot de passe

5
si le

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]
4
Victor Driantsov

À 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.

4
Frank

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.

3
Jürgen Steinblock

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

2
Chris

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
0
rubo77

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
0
Mike Q

Si vous accédez directement à la base de données, vous pouvez écrire la requête suivante:

OPTIMIZE TABLE table1,table2,table3,table4......;
0
Anand agrawal