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的Maintenancebutton。

由于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