MySQL有一个OPTIMIZE TABLE命令,该命令可用于回收MySQL安装中未使用的空间。是否有一种方法(内置命令或通用存储过程)为数据库和/或服务器安装中的每个表运行此优化,还是您必须自己编写脚本?
OPTIMIZE TABLE
对MyISAM有用。既然该引擎即将消失,那么对它的需求OPTIMIZE TABLE
就消失了,特别是需要定期优化所有表。
MySQL有一个OPTIMIZE TABLE命令,该命令可用于回收MySQL安装中未使用的空间。是否有一种方法(内置命令或通用存储过程)为数据库和/或服务器安装中的每个表运行此优化,还是您必须自己编写脚本?
OPTIMIZE TABLE
对MyISAM有用。既然该引擎即将消失,那么对它的需求OPTIMIZE TABLE
就消失了,特别是需要定期优化所有表。
Answers:
mysqlcheck -u [username] -p[password] -o [database name]
OPTIMIZE TABLE
命令在MySQL客户端中优化表:dev.mysql.com/doc/refman/5.5/en/optimize-table.html。例如,优化一个这样的表:OPTIMIZE TABLE <your_schema>.<your_table>;
,优化给定架构中的所有表,例如:select concat('OPTIMIZE NO_WRITE_TO_BINLOG TABLE ',table_schema,'.',table_name,';') into outfile '/tmp/optimize_all_tables.sql' from information_schema.tables where table_schema = 'pabeta' and table_type = 'base table'; source /tmp/optimize_all_tables.sql;
我做了这个“简单”脚本:
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;
要运行它,只需将其粘贴到连接到数据库的任何SQL IDE中。
注意:此代码不适用于phpmyadmin。
它运行一条show tables
语句并将其存储在准备好的语句中。然后optimize table
在选定集中运行一个。
您可以通过在var中设置其他值来控制要优化的表@tables_like
(例如:)set @tables_like = '%test%';
。
bd
使用@b进行准备,错误代码:1064。检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的'NULL'附近使用
以下示例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
从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
运行该命令后,将提示您输入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 Services> MySQL Root Password
您可以使用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]
的 MySQL Administrator
(MySQL的GUI工具的一部分),可以为你做的数据库级别。
只需选择您的架构,然后按 Maintenance
右下角按钮即可。
由于GUI工具已达到寿命终止状态,因此很难在mysql页面上找到它们。通过Google找到了它们: http //dev.mysql.com/downloads/gui-tools/5.0.html
我不知道新的MySQL Workbench是否也可以做到这一点。
您也可以使用mysqlcheck
命令行工具来执行此操作。
此bash脚本将接受root密码作为选项,并一步一步对其进行优化,并显示状态输出:
#!/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
我的2美分:从碎片最多的表格开始
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