MySQL优化所有表?
MySQL有一个OPTIMIZE TABLE命令,可用于回收MySQL安装中未使用的空间。 有没有一种方法(内置命令或通用存储过程)为数据库和/或服务器安装中的每个表运行此优化,还是您必须自己编写脚本?
您可以使用mysqlcheck
在命令行执行此操作。
一个数据库:
mysqlcheck -o <db_schema_name>
所有数据库:
mysqlcheck -o --all-databases
我做了这个简单的脚本:
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;
要运行它,只需将其粘贴到连接到数据库的任何SQL IDE中即可。
注意:这段代码不能在phpmyadmin上运行。
怎么运行的
它运行一个show tables
语句并将其存储在一个准备好的语句中。 然后在选定的集合中运行一个optimize table
。
您可以通过在var @c
设置不同的值来控制要优化哪些表。
下面的示例php脚本可以帮助您优化数据库中的所有表
<?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()); } } ?>
通过一个简单的shell脚本来完成修复所有数据库中所有表的所有必要步骤:
#!/bin/bash mysqlcheck --all-databases mysqlcheck --all-databases -o mysqlcheck --all-databases --auto-repair mysqlcheck --all-databases --analyze
对于所有数据库:
mysqlcheck -Aos -uuser -p
对于一个数据库优化:
mysqlcheck -os -uroot -p dbtest3
你可以使用mysql客户端优化/检查和修复数据库的所有表。
首先,你应该得到所有的表格列表,用','分隔:
mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|perl -pe 's/ /,/g'
现在,当你有所有的表优化:
mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]
从命令行:
mysqlcheck -o <db_name> -u<username> -p
然后input密码
MySQL Administrator
(MySQLgraphics用户界面工具的一部分)可以在数据库级别为您完成。
只需select您的模式,然后按下右下angular的Maintenance
button。
由于GUI工具已达到生命周期结束状态,因此很难在mysql页面上find它们。 通过Googlefind它们: http : //dev.mysql.com/downloads/gui-tools/5.0.html
我不知道新的MySQL Workbench是否也可以这样做。
你也可以使用mysqlcheck
命令行工具,它也应该能够做到这一点。
从phpMyAdmin和其他来源可以使用:
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>'
然后,您可以复制并粘贴结果到一个新的查询或从您自己的来源执行它。
如果您想要分析,修复和优化MySQL服务器中所有数据库中的所有表,可以从命令行一次性完成。 你将需要root来做到这一点。
mysqlcheck -u root -p --auto-repair --optimize --all-databases
一旦你运行了,你将被提示input你的MySQL根密码。 之后,它将开始,你会看到结果发生。
示例输出:
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
如果您不知道root密码并正在使用WHM,则可以从WHM内部进行更改,方法是: 首页> SQL服务> MySQL根密码
这个bash脚本将接受根密码作为选项,并逐一优化它,状态输出:
#!/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
一个初学者bash脚本来列出并运行一个针对数据库的工具…
#!/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
我的2cents:从最高碎片的表开始
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