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