一、mariadb磁盘空间问题
在使用mariadb 5.5版本的时候发现有个数据表,在多次重复写入数据后,硬盘空间使用非常大,没法回收表空间,而且云服务器的硬盘空间比较小,就想要想办法把多余的表空间释放掉。
OPTIMIZE TABLE bookchapter;
尝试使用命令尝试使用这个命令去释放,发现没用,mariadb不会因为这样释放掉空间。
1.最简单的回收空间的方法
将数据都dump下来,然后将数据库中的数据删除,再restore复原。但是这样的话会造成服务暂时不可用。
二、表空间
Innodb存储引擎可将所有数据存放于ibdata1的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间。
mariadb的数据存储路径为:/var/lib/mysql/
1.共享表空间
数据库的所有表数据,索引文件全部放在同一个文件中, 默认的文件名为ibdata1。
1.1优点
文件数比较少。数据和文件放在一起方便管理。
1.2缺点
多个表及索引在表空间中混合存储,当对表做了大量删除操作后表空间中将会有大量的空隙,特别是对于日志数据(会经常清除数据),最不适合用共享表空间。
2.独立表空间
每一个表都会以独立的文件来存储,每一个表都有一个.frm表描述文件,一个.ibd文件(这个文件包含表的数据和索引)。
2.1优点
- 可以实现单表在不同的数据库中移动(拷贝)
- 针对单个表,空间可以回收
- drop table操作自动回收表空间
- 对于删除大量数据的表,可以通过:alter table tableName engine=innodb;回收不用的空间
- 对于使innodb-plugin的Innodb使用truncate table也会使空间收缩
2.2缺点
- 单表数据量过大,会使单文件过大
- 表数目多的话,文件的数量也会很多,数据库使用的文件描述符也会多
3.查看表空间设置
MariaDB [(none)]> show variables like "%innodb_file_per_table%";
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
ON 为使用独立表空间。
3.1设置独立表空间
在my.cnf中mysqld添加配置
[mysqld]
innodb_file_per_table = 1
三、mariadb 10.1版本新特性
新的碎片整理算法
从MariaDB 10.1开始,MariaDB把Facebook的碎片整理代码合并进来了,并且把所有代码都调整到InnoDB/XtraDB层去实现,因而只需要使用现成的 OPTIMIZE TABLE 命令就行。开启新的整理算法需要把下面的配置加到 my.cnf 配置文件中:
[mysqld]
innodb-defragment=1
这样配置以后新的碎片整理功能就会替代原有的 OPTIMIZE TABLE 算法,不会有新的表生成,也不需要把旧表的数据拷贝到新表。新的算法会载入 n 个页面尝试把上面的记录紧凑的合并到一起,从而让页面存满记录,然后释放掉完全空了的页面。
英文文档:https://mariadb.com/kb/en/defragmenting-innodb-tablespaces/
中文文档:http://mysql.taobao.org/monthly/2015/08/05/
四、升级到10.1版本
1.先备份
mysqldump -u root -p passwd --all-databases > all-database.sql
2.停止
service mariadb stop
3.先更新
yum update
4.添加mariadb源
vim /etc/yum.repos.d/mariadb10.repo
# 写入以下内容,使用aliyun的源
[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.1/centos7-amd64
gpgkey = https://mirrors.aliyun.com/mariadb/yum//RPM-GPG-KEY-MariaDB
gpgcheck = 1
5.删除旧版mariadb
yum remove mariadb-server mariadb mariadb-libs
yum clean all
6.安装
yum -y install MariaDB-server MariaDB-client
# 启动
systemctl start mariadb
# 开机启动
systemctl enable mariadb
# 升级命令(表示从低版本升级到高版本,会创建版本差异的表和数据)
mysql_upgrade
7.完成
# 查看版本
mysql -V
mysql Ver 15.1 Distrib 10.1.44-MariaDB, for Linux (x86_64) using readline 5.1
五、问题
发现升级之后,使用OPTIMIZE TABLE 命令还是不能回收空间。
没办法了,只能用mysqldump备份数据下来,然后清除表数据,把mariadb设置为独立的表空间,然后再把备份数据写进去。希望升级到10.1之后,自动回收磁盘空间的功能没有问题(暂时还没验证)。