MySQL optymalizuje wszystkie tabele?
MySQL posiada polecenie OPTIMIZE TABLE, które można wykorzystać do odzyskania nieużywanego miejsca w instalacji MySQL. Czy istnieje sposób (wbudowane polecenie lub wspólna procedura składowana), aby uruchomić tę optymalizację dla każdej tabeli w bazie danych i / lub instalacji serwera, czy jest to coś, co trzeba skrypt się samemu?
15 answers
Możesz użyć mysqlcheck
aby to zrobić w wierszu poleceń.
Jedna baza danych:
mysqlcheck -o <db_schema_name>
Wszystkie bazy danych:
mysqlcheck -o --all-databases
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 16:10:16
Zrobiłem ten' prosty ' skrypt:
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;
Aby go uruchomić, po prostu wklej go w dowolnym SQL IDE podłączonym do bazy danych.
Uwaga: Ten kod nie będzie działał na phpmyadmin.
Jak to działa
Uruchamia show tables
oświadczenie i przechowuje je w przygotowanym oświadczeniu. Następnie uruchamia optimize table
w wybranym zestawie.
Możesz kontrolować, które tabele optymalizować, ustawiając inną wartość w var @tables_like
(np.: set @tables_like = '%test%';
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-06 11:15:43
Poniższy przykładowy skrypt php może pomóc w optymalizacji wszystkich tabel w bazie danych
<?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());
}
}
?>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 15:08:28
Wykonaj wszystkie procedury niezbędne do ustalenia wszystkich tabel we wszystkich bazach danych za pomocą prostego skryptu powłoki:
#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 11:52:03
Dla wszystkich baz danych:
mysqlcheck -Aos -uuser -p
Dla jednej optymalizacji bazy danych:
mysqlcheck -os -uroot -p dbtest3
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 11:54:54
Jeśli chcesz analizować, naprawiać i optymalizować wszystkie tabele we wszystkich bazach danych na serwerze MySQL, możesz to zrobić za jednym razem z linii poleceń. Będziesz musiał root, aby to zrobić.
mysqlcheck -u root -p --auto-repair --optimize --all-databases
Po uruchomieniu zostanie wyświetlony monit o podanie hasła głównego MySQL. Następnie rozpocznie się i zobaczysz wyniki, Jak to się dzieje.
Przykładowe wyjście:
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
Jeśli nie znasz hasła roota i używasz WHM, możesz zmienić je z poziomu WHM, przechodząc do: Home > SQL Services > MySQL root Password
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 21:34:57
Z phpMyAdmin i innych źródeł możesz użyć:
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>'
Następnie możesz skopiować i wkleić wynik do nowego zapytania lub wykonać go z własnego źródła. Jeśli nie widzisz całej wypowiedzi:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-17 10:48:55
Z linii poleceń:
mysqlcheck -o <db_name> -u<username> -p
Następnie wpisz hasło
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-18 15:18:36
Możesz zoptymalizować / sprawdzić i naprawić wszystkie tabele bazy danych, używając klienta mysql.
Najpierw należy pobrać listę wszystkich tabel, oddzieloną',':
mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|perl -pe 's/ /,/g'
Teraz, gdy masz listę wszystkich tabel do optymalizacji:
mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-02 08:47:10
MySQL Administrator
(część narzędzi GUI MySQL) może to zrobić za Ciebie na poziomie bazy danych.
Wystarczy wybrać schemat i nacisnąć przycisk Maintenance
W prawym dolnym rogu.
Ponieważ narzędzia GUI osiągnęły status końca życia, trudno je znaleźć na stronie mysql. Znaleziono je przez Google: http://dev.mysql.com/downloads/gui-tools/5.0.html
Nie wiem, czy nowy MySQL Workbench też może to zrobić.
I możesz użyć narzędzia linii poleceń mysqlcheck
, które to też powinno być w stanie zrobić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 15:42:40
Jeśli uzyskujesz bezpośredni dostęp do bazy danych, możesz napisać następujące zapytanie:
OPTIMIZE TABLE table1,table2,table3,table4......;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 05:45:17
Ten skrypt bash zaakceptuje hasło roota jako opcję i zoptymalizuje je jeden po drugim, z wyjściem stanu:
#!/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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 10:07:58
Skrypt startowy bash do wyświetlania i uruchamiania narzędzia przeciwko 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 02:40:03
Mój 1 cent, dodany {[1] } , więc możemy pominąć typ " VIEW
".
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') and TABLE_TYPE='BASE TABLE' order by data_free desc;"`
do
mysql -e "OPTIMIZE TABLE $table;"
done
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-19 16:59:25
My 2cents: start with table with highest fragmentation
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 16:42:10