Mysql数据库碎片清理

目录

 

1.查看数据库的数据存放目录

2.进入目录查看数据文件  

3.清理myisam的磁盘碎片

4.innodb引擎碎片清理


 

1.查看数据库的数据存放目录

show variables like '%dir%';

 

 

2.进入目录查看数据文件  

innodb引擎

myisam引擎

查看ibdata

 

 

查询数据库中大于磁盘碎片大于0的表 

SELECT TABLE_SCHEMA DB, TABLE_NAME,DATA_FREE,ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA','MYSQL') AND DATA_FREE>0;

 

 

data_free 磁盘碎片占用的空间   

 

 

3.清理myisam的磁盘碎片

OPTIMIZE TABLE data.emp;

select TABLE_NAME,ENGINE,data_length,data_free FROM TABLES WHERE TABLE_NAME='emp';

 

 

data_free已经为0   再查看磁盘上的文件

 

先前是156250  碎片已经被整理。

 

 

4.innodb引擎碎片清理

 

 

SELECT count(1) from logs;

delete FROM logs LIMIT 50000;

 

查看logs表的碎片;

 

尝试使用optimize table table_name 据说6.xmysql版本支持这样清理 来看看 

 

OPTIMIZE TABLE `logs`;

报错了 再看看碎片 

好像是减小了   貌似可以 再看看 磁盘物理文件

 

也减小了 

再看看 外面的ibd文件

 

还是这么多     

可以清理部分磁盘文件 

 

查看相关文档 在共享表空间下,对表做OPTIMIZE TABLE能够使之前因delete浪费的空间回收来重用,但是ibdata并不会收缩。

默认情况下innodb_file_per_table=0  是共享表空间,如果是这种共享表空间物理磁盘释放不了,但是碎片整理后空间可以重复利用,如果不能共享表空间 即innodb_file_per_table=1   每个表都有独立的表空间,碎片清理后可以减少物理磁盘的占用。

数据库碎片清理脚本

#!/bin/bash
###对mysql碎片进行整理5.6版本以后
mysql_user=root
mysql_pass=root
time_log=/clean/time.log
databases=/clean/databases.txt
#MyDb_home=/usr/bin
if [ ! -f /clean ];then
    mkdir /clean
fi


if [ ! -f $time_log ];then
touch $time_log
fi
if [ ! -f $databases ];then
touch $databases
fi






/usr/bin/mysql -u$mysql_user -p$mysql_pass -e "show databases" | grep -v Database > $databases
sed -i "s/information_schema//" $databases  
sed -i "s/mysql//" $databases
#sed -i "s/test//" $databases  
sed -i "s/sys//" $databases  
cle_DB=$(cat $databases)






for i in $cle_DB
do
echo "clean $i starting----"
tables=$(/usr/bin/mysql -u$mysql_user -p$mysql_pass -e "use $i;show tables" | grep -v Tables > /clean/$i)
##cat /opt/$i
table_list=$(cat /clean/$i)
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" >> $time_log
echo "clean $i starting---- at $(date +[%Y-%m-%d/%H:%M:%S])" >>$time_log
    for Tb in $table_list
    do
    echo "$Tb starting optimize ~~~~~~"
    echo "$Tb starting optimize ~~~~~~ at $(date +[%Y-%m-%d/%H:%M:%S])" >>$time_log
    /usr/bin/mysql -u$mysql_user -p$mysql_pass -e "use $i;optimize table $Tb"
    echo "$Tb end at $(date +[%Y-%m-%d/%H:%M:%S])" >>$time_log
    done
done

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章