目錄
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