MySQL are o OPTIMIZAREA MASĂ command, care poate fi folosit pentru a recupera spațiu nefolosit într-un MySQL instalat. Există o modalitate (built-in comanda sau comune proceduri stocate) pentru a rula această optimizare pentru fiecare tabel din baza de date și/sau instalare server, sau este ceva ce'd trebuie să script-ul singur?
Puteți utiliza mysqlcheck
pentru a face acest lucru de la linia de comandă.
O bază de date:
mysqlcheck -o <db_schema_name>
Toate bazele de date:
mysqlcheck -o --all-databases
Am făcut acest lucru 'simplu' script:
set @tables_like = null;
set @optimize = null;
set @show_tables = concat("show tables where", ifnull(concat(" `Tables_in_", database(), "` like '", @tables_like, "' and"), ''), " (@optimize:=concat_ws(',',@optimize,`Tables_in_", database() ,"`))");
Prepare `bd` from @show_tables;
EXECUTE `bd`;
DEALLOCATE PREPARE `bd`;
set @optimize := concat('optimize table ', @optimize);
PREPARE `sql` FROM @optimize;
EXECUTE `sql`;
DEALLOCATE PREPARE `sql`;
set @show_tables = null, @optimize = null, @tables_like = null;
Pentru a rula, pur și simplu inserați în orice SQL IDE conectat la baza de date.
Notă: acest cod a CÂȘTIGAT'T lucru pe phpmyadmin.
Se ruleaza o emisiune de mese` declarație și o stochează într-o declarație. Apoi se execută un optimiza masa în setul selectat.
Puteți controla ce mese pentru a optimiza setând o valoare diferită în var @tables_like
(de exemplu: set @tables_like = '%test%';
).
Următorul exemplu de script php vă poate ajuta să optimizați toate tabelele din baza de date
<?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());
}
}
?>
Face toate procedurile necesare pentru fixarea toate tabelele din bazele de date, cu un simplu script de shell:
#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
Din phpMyAdmin și alte surse pe care le puteți utiliza:
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>'
Apoi, puteți copia & inserați duce la o nouă interogare sau executa din surse proprii. Dacă tu nu't vedea întreaga declarație:
Puteți optimiza/check and repair la toate tabelele din baza de date, folosind mysql client.
În primul rând, trebuie să obțineți toate tabelele de lista, separate cu ',':
mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|perl -pe 's/ /,/g'
Acum, când ai toate tabelele de lista pentru optimizare:
mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]
Anii `MySQL Administrator (partea de MySQL GUI Tools) pot face asta pentru tine la un nivel de baze de date.
Doar selectați schema și apăsați butonul "Întreținere" butonul din colțul din dreapta jos.
De la Instrumente GUI au ajuns la End-of-life statutul ele sunt greu de a găsi pe mysql pagina. Le-a găsit prin Google: http://dev.mysql.com/downloads/gui-tools/5.0.html
Eu nu't știu dacă noul MySQL Workbench poate face asta, de asemenea.
Și puteți utiliza mysqlcheck
instrument de linie de comandă care ar trebui să fie capabil de a face asta, de asemenea.
Dacă vrei să analizeze, de reparare și de a optimiza toate tabelele în toate bazele de date în MySQL server-ul dvs., puteți face acest lucru într-un du-te la linia de comandă. Veți avea nevoie de rădăcină pentru a face asta.
mysqlcheck -u root -p --auto-repair --optimize --all-databases
O dată tu a alerga aceea, vi se va solicita să introduceți MySQL parola de root. După aceea, se va începe și veți vedea rezultatele ca's-a întâmplat.
Exemplu de ieșire:
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
Dacă tu nu't știu parola de root și sunt, folosind WHM, puteți schimba din cadrul WHM de a merge la: Home > SQL Servicii > MySQL Parola de Root
Acest script bash va accepta parola de root ca opțiune și de a optimiza unul câte unul, cu starea de ieșire:
#!/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 starter script bash pentru a lista și a alerga un instrument împotriva 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
my 2cents: începe cu masă cu cea mai mare fragmentare
for table in `mysql -sss -e "select concat(table_schema,".",table_name) from information_schema.tables where table_schema not in ('mysql','information_schema','performance_schema') order by data_free desc;"
do
mysql -e "OPTIMIZE TABLE $table;"
done