MySQL有一个OPTIMIZE TABLE命令,可用于回收MySQL安装中未使用的空间。有没有办法(内置命令或公共存储过程)为数据库和/或服务器安装中的每个表运行此优化,或者这是你必须自己编写脚本的东西?
答案 0 :(得分:379)
您可以使用mysqlcheck
在命令行执行此操作。
一个数据库:
mysqlcheck -o <db_schema_name>
所有数据库:
mysqlcheck -o --all-databases
答案 1 :(得分:21)
我制作了这个'简单'的脚本:
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
中设置不同的值来控制要优化的表格。
答案 2 :(得分:18)
以下示例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());
}
}
?>
答案 3 :(得分:11)
使用简单的shell脚本完成修复所有数据库中所有表的所有必要过程:
#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
答案 4 :(得分:10)
适用于所有数据库:
mysqlcheck -Aos -uuser -p
对于一个数据库优化:
mysqlcheck -os -uroot -p dbtest3
答案 5 :(得分:5)
从命令行:
mysqlcheck -o <db_name> -u<username> -p
然后输入密码
答案 6 :(得分:5)
从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>'
答案 7 :(得分:4)
您可以使用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]
答案 8 :(得分:3)
MySQL Administrator
(MySQL GUI工具的一部分)可以在数据库级别为您完成。
只需选择您的架构,然后按右下角的Maintenance
按钮。
由于GUI工具已达到寿命终止状态,因此很难在mysql页面上找到它们。通过Google找到它们:http://dev.mysql.com/downloads/gui-tools/5.0.html
我不知道新的MySQL Workbench是否也能做到这一点。
你可以使用mysqlcheck
命令行工具,它也应该能够做到这一点。
答案 9 :(得分:2)
如果要分析,修复和优化MySQL服务器中所有数据库中的所有表,可以从命令行一次性完成。你需要root才能做到这一点。
mysqlcheck -u root -p --auto-repair --optimize --all-databases
运行后,系统将提示您输入MySQL root密码。在那之后,它将开始,你将看到它正在发生的结果。
示例输出:
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中更改它: 主页&gt; SQL服务&gt; MySQL Root密码
答案 10 :(得分:1)
我的 1 美分,添加了 and TABLE_TYPE='BASE TABLE'
以便我们可以跳过“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
答案 11 :(得分:0)
此bash脚本将接受root密码作为选项并逐个优化,状态输出为:
package test;
import java.awt.Graphics;
import javax.swing.JApplet;
public class Test extends JApplet {
@Override
public void paint(Graphics g) {
g.drawString("Hello World!", 0, 0);
}
@Override
public void init() {
repaint();
}
}
答案 12 :(得分:0)
一个入门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
答案 13 :(得分:0)
如果您直接访问数据库,则可以编写以下查询:
OPTIMIZE TABLE table1,table2,table3,table4......;
答案 14 :(得分:-1)
我的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