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

 

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