如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。 在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。 OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。 对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。 注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。 OPTIMIZE TABLE语句被写入到二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。已经这么做了,因此,用于MySQL服务器的OPTIMIZE TABLE命令的作用相当于一个复制主服务器,在默认情况下,这些命令将被复制到复制从属服务器中。 废话少说,脚本如下: #!/bin/bash #this program is used to optimize of innodb # History: # 2007/11/28 chentao 1.1 #--------------------------------------------------------------- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH time_log=/usr/local/crontab/optimize_time sum=$# if [ "$sum" -eq 0 ] then echo "Error: no parameter chosed" exit 1 fi for i in $*;do echo "optimize database $i starting ..." tables=$(/usr/local/mysql/bin/mysql $i -uroot -p123456 -e "show tables" | grep -v "Tables" > /usr/local/crontab/$i) tablelist=$(cat /usr/local/crontab/$i) echo "optimize database $i starting ................" >> $time_log echo "$i start at $(date +[%Y/%m/%d/%H:%M:%S])" >> $time_log for list in $tablelist do echo $list /usr/local/mysql/bin/mysql $i -uroot -p123456 -e "optimize table $list" done echo "$i end at $(date +[%Y/%m/%d/%H:%M:%S])" >> $time_log echo >> $time_log done |
|