webentwicklung-frage-antwort-db.com.de

MySQL OPTIMIZE alle Tabellen?

MySQL verfügt über den Befehl OPTIMIZE TABLE , mit dem nicht genutzter Speicherplatz in einer MySQL-Installation wiederhergestellt werden kann. Gibt es eine Möglichkeit (integrierter Befehl oder eine allgemein gespeicherte Prozedur), diese Optimierung für jede Tabelle in der Datenbank- und/oder Server-Installation auszuführen, oder müssen Sie dies selbst tun?

223
Alan Storm

Sie können mysqlcheck verwenden, um dies in der Befehlszeile auszuführen.

Eine Datenbank:

mysqlcheck -o <db_schema_name>

Alle Datenbanken:

mysqlcheck -o --all-databases
373
Ike Walker

Ich habe dieses "einfache" Skript gemacht:

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;

Um es auszuführen, fügen Sie es einfach in einem mit Ihrer Datenbank verbundenen SQL IDE ein.

Hinweis: Dieser Code funktioniert nicht auf phpmyadmin.

Wie es funktioniert

Es führt eine show tables-Anweisung aus und speichert sie in einer vorbereiteten Anweisung. Dann wird ein optimize table im ausgewählten Satz ausgeführt.

Sie können steuern, welche Tabellen optimiert werden sollen, indem Sie in der Variable @c einen anderen Wert festlegen.

20
Ismael Miguel

Das folgende Beispiel für ein PHP-Skript kann Ihnen dabei helfen, alle Tabellen in Ihrer Datenbank zu optimieren

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

für alle Datenbanken:

mysqlcheck -Aos -uuser -p 

Für eine Datenbankoptimierung:

mysqlcheck -os -uroot -p dbtest3
10
Muni

Führen Sie alle erforderlichen Verfahren aus, um alle Tabellen in allen Datenbanken mit einem einfachen Shell-Skript zu reparieren:

#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
10
Ivan Velkov

Von der Kommandozeile:

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

geben Sie dann das Passwort ein

5
si le

Sie können mit dem MySQL-Client alle Tabellen der Datenbank optimieren/prüfen und reparieren.

Zuerst sollten Sie alle Tabellenlisten mit ',' trennen:

mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|Perl -pe 's/ /,/g'

Wenn Sie nun alle Tabellen zur Optimierung haben:

mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]
4

Von phpMyAdmin und anderen Quellen können Sie Folgendes verwenden:

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

Dann können Sie das Ergebnis in eine neue Abfrage kopieren und einfügen oder es aus Ihrer eigenen Quelle ausführen.

4
Frank

Der MySQL Administrator (Teil der MySQL-GUI-Tools) kann dies auf Datenbankebene für Sie tun.

Wählen Sie einfach Ihr Schema aus und drücken Sie die Schaltfläche Maintenance in der rechten unteren Ecke.

Da die GUI-Tools den Lebensende-Status erreicht haben, sind sie auf der MySQL-Seite nur schwer zu finden. Fanden sie über Google: http://dev.mysql.com/downloads/gui-tools/5.0.html

Ich weiß nicht, ob die neue MySQL Workbench das auch kann.

Und Sie können das Befehlszeilenwerkzeug mysqlcheck verwenden, das auch dazu in der Lage sein sollte.

3

Wenn Sie alle Tabellen in allen Datenbanken Ihres MySQL-Servers analysieren, reparieren und optimieren möchten, können Sie dies auf einmal von der Befehlszeile aus tun. Sie werden jedoch root benötigen, um das zu tun.

mysqlcheck -u root -p --auto-repair --optimize --all-databases

Sobald Sie dies ausgeführt haben, werden Sie aufgefordert, Ihr MySQL-Root-Passwort einzugeben. Danach startet es und Sie sehen Ergebnisse, wenn es passiert.

Beispielausgabe:

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

Wenn Sie das Root-Passwort nicht kennen und WHM verwenden, können Sie es innerhalb von WHM ändern. Gehen Sie zu: Home> SQL-Dienste> MySQL Root Password

2
Chris

Dieses Bash-Skript akzeptiert das Root-Passwort als Option und optimiert es nacheinander mit Statusausgabe:

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

Ein Starter-Bash-Skript zum Auflisten und Ausführen eines Tools für die DBs 

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

Wenn Sie direkt auf die Datenbank zugreifen, können Sie folgende Abfrage schreiben:

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