SimpleDao
升级centos7的mariadb 5.5版本到10.1
2020-03-22, 访问数: 2279

一、mariadb磁盘空间问题

在使用mariadb 5.5版本的时候发现有个数据表,在多次重复写入数据后,硬盘空间使用非常大,没法回收表空间,而且云服务器的硬盘空间比较小,就想要想办法把多余的表空间释放掉。

  1. 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.查看表空间设置

  1. MariaDB [(none)]> show variables like "%innodb_file_per_table%";
  2. +-----------------------+-------+
  3. | Variable_name | Value |
  4. +-----------------------+-------+
  5. | innodb_file_per_table | ON |
  6. +-----------------------+-------+

ON 为使用独立表空间。

3.1设置独立表空间

在my.cnf中mysqld添加配置

  1. [mysqld]
  2. innodb_file_per_table = 1

三、mariadb 10.1版本新特性

  1. 新的碎片整理算法
  2. MariaDB 10.1开始,MariaDBFacebook的碎片整理代码合并进来了,并且把所有代码都调整到InnoDB/XtraDB层去实现,因而只需要使用现成的 OPTIMIZE TABLE 命令就行。开启新的整理算法需要把下面的配置加到 my.cnf 配置文件中:
  3. [mysqld]
  4. innodb-defragment=1
  5. 这样配置以后新的碎片整理功能就会替代原有的 OPTIMIZE TABLE 算法,不会有新的表生成,也不需要把旧表的数据拷贝到新表。新的算法会载入 n 个页面尝试把上面的记录紧凑的合并到一起,从而让页面存满记录,然后释放掉完全空了的页面。

英文文档:https://mariadb.com/kb/en/defragmenting-innodb-tablespaces/
中文文档:http://mysql.taobao.org/monthly/2015/08/05/

四、升级到10.1版本

1.先备份

  1. mysqldump -u root -p passwd --all-databases > all-database.sql

2.停止

  1. service mariadb stop

3.先更新

  1. yum update

4.添加mariadb源

  1. vim /etc/yum.repos.d/mariadb10.repo
  2. # 写入以下内容,使用aliyun的源
  3. [mariadb]
  4. name = MariaDB
  5. baseurl = https://mirrors.aliyun.com/mariadb/yum/10.1/centos7-amd64
  6. gpgkey = https://mirrors.aliyun.com/mariadb/yum//RPM-GPG-KEY-MariaDB
  7. gpgcheck = 1

5.删除旧版mariadb

  1. yum remove mariadb-server mariadb mariadb-libs
  2. yum clean all

6.安装

  1. yum -y install MariaDB-server MariaDB-client
  2. # 启动
  3. systemctl start mariadb
  4. # 开机启动
  5. systemctl enable mariadb
  6. # 升级命令(表示从低版本升级到高版本,会创建版本差异的表和数据)
  7. mysql_upgrade

7.完成

  1. # 查看版本
  2. 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之后,自动回收磁盘空间的功能没有问题(暂时还没验证)。