当innodb_file_per_table设置为OFF,那么所有数据将被存储在ibdata文件。如果删除一些数据和删除一些表则没有回收未使用的磁盘空间,除了导出表然后再导入的方法来回收表空间大小,除此之外没有任何其他的方法。
当innodb_file_per_table设置为ON时,每个表中存储的数据和索引在它自己的表空间文件。但是,共享表空间的ibdata1仍然在增长,为什么呢?因为ibdata1中依然有:

(1)data dictionary aka metadata of InnoDB tables

(2)change buffer

(3)doublewrite buffer

(4)undo logs

更为详细的介绍请各位童鞋阅读此文章
http://www.mysqlperformanceblog.com/2013/08/20/why-is-the-ibdata1-file-continuously-growing-in-mysql/

当你删除表中一些记录时,他们只是在磁盘上标记为删除,但空间会由以后可以重复使用,当插入/更新多个行,但它永远不会被回收。
但是,如果设置innodb_file_per_table为ON,即使用独立表空间,那么可以通过在该表运行OPTIMIZE TABLE回收空间。 OPTIMIZE TABLE将创建一个新的相同的空表。然后,它会通过行数据复制一行从旧表到新的表。在这个过程中一个新的。 ibd表空间将被创建和空间将被回收。

具体的我们来看一个例子:

mysql> select count(*) from salaries;
+----------+
| count(*) |
+----------+
| 2844047 |
+----------+
1 row in set (0.00 sec) mysql>
[root@localhost ~]# ls -lh /data/mysql/employees/salaries.ibd
-rw-rw---- mysql mysql 140M Mar : /data/mysql/employees/salaries.ibd
[root@localhost ~]#
mysql> delete from salaries limit 2000000;
Query OK, 2000000 rows affected (37.50 sec) mysql> select count(*) from salaries;
+----------+
| count(*) |
+----------+
| 844047 |
+----------+
1 row in set (0.13 sec) mysql>
[root@localhost ~]# ls -lh /data/mysql/employees/salaries.ibd
-rw-rw---- mysql mysql 140M Mar : /data/mysql/employees/salaries.ibd
[root@localhost ~]#

可以看见虽然删除200w记录后,但是ibd文件并没有减小,还是140M。

mysql> optimize table salaries;
+--------------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+----------+----------+-------------------------------------------------------------------+
| employees.salaries | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| employees.salaries | optimize | status | OK |
+--------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (7.89 sec) mysql>
[root@localhost ~]# ls -lh /data/mysql/employees/salaries.ibd
-rw-rw---- mysql mysql 48M Mar : /data/mysql/employees/salaries.ibd
[root@localhost ~]#

在OPTIMIZE 优化表后,可以回收空间。正如你看到的,salaries.ibd文件的大小减小从140M减小到48M。
我想在这里提一提,在这个过程中该表将被锁定(Table locked for just Writes),当操作比较大的表时,这会影响性能,数据无法写入。所以,如果不想要锁定表,我们可以使用Percona的pt-online-schema-change。它可以改变表的存储引擎并且不会锁表。可以使用ALTER TABLE ENGINE=INNODB,这将重新创建表并回收空间。

mysql> select count(*) from  salaries;
+----------+
| count(*) |
+----------+
| 2844047 |
+----------+
1 row in set (0.00 sec) mysql> delete from salaries limit 2000000;
Query OK, 2000000 rows affected (21.88 sec) mysql> \! ls -lh /data/mysql/employees/salaries.ibd
-rw-rw---- 1 mysql mysql 140M Mar 27 00:21 /data/mysql/employees/salaries.ibd

接下来使用pt-online-schema-change回收空间:

[root@localhost ~]# pt-online-schema-change --alter "ENGINE=InnoDB" D=employees,t=salaries --execute
Operation, tries, wait:
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `employees`.`salaries`...
Creating new table...
Created new table employees._salaries_new OK.
Altering new table...
Altered `employees`.`_salaries_new` OK.
--27T00:: Creating triggers...
--27T00:: Created triggers OK.
--27T00:: Copying approximately rows...
--27T00:: Copied rows OK.
--27T00:: Swapping tables...
--27T00:: Swapped original and new tables OK.
--27T00:: Dropping old table...
--27T00:: Dropped old table `employees`.`_salaries_old` OK.
--27T00:: Dropping triggers...
--27T00:: Dropped triggers OK.
Successfully altered `employees`.`salaries`.
[root@localhost ~]# ls -lh /data/mysql/employees/salaries.ibd
-rw-rw---- mysql mysql 48M Mar : /data/mysql/employees/salaries.ibd
[root@localhost ~]#

可以看见已经成功释放空间。从140M缩小到48M

使用该工具需要注意:

请确保有足够的空间运行pt-online-schema-change,因为它会创建一个包含原始表的大小大致相同的临时表。在主的操作会应用到从服务器!(假如你是主从环境)

参考资料:

http://www.mysqlperformanceblog.com/2013/09/25/how-to-reclaim-space-in-innodb-when-innodb_file_per_table-is-on/

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

InnoDB表回收空间的更多相关文章

  1. 使用参数innodb_file_per_table支持MySQL InnoDB表数据共享空间自动收缩

    http://heylinux.com/archives/2367.html http://blog.csdn.net/ywh147/article/details/8996022 使用过MySQL的 ...

  2. MySQL innodb表使用表空间物理文件复制或迁移表

    MySQL InnoDB引擎的表通过拷贝物理文件来进行单表或指定表的复制,可以想到多种方式,今天测试其中2种: 将innodb引擎的表修改为Myisam引擎,然后拷贝物理文件 直接拷贝innodb的表 ...

  3. 4. InnoDB表单独表空间

    4. InnoDB表单独表空间 从历史上看,所有InnoDB表和索引都存储在系统表空间中.这种单片方法的目标是完全专用于数据库处理的机器,精心规划的数据增长,其中任何分配给MySQL的磁盘存储都不会用 ...

  4. Innodb 表空间传输迁移数据

    在mysql5.5之前,mysql实例中innodb引擎表的迁移是个头疼的问题,要么使用mysqldump导出,要么使用物理备份的方法,但是在mysql5.6之后的版本中,可以使用一个新特性,方便地迁 ...

  5. Innodb 表空间卸载、迁移、装载

    从MySQL的Innodb特性中我们知道,Inndob的表空间有共享和独享的特点,如果是共享的.则默认会把表空间存放在一个文件中(ibdata1),当开启独享表空间参数Innodb_file_per_ ...

  6. MySQL Innodb表空间不足的处理方法

    官方给出的解决方案: 添加和删除 InnoDB 数据和日志文件 这一节描述在InnoDB表空间耗尽空间之时,或者你想要改变日志文件大小之时,你可以做的一些事情. 最简单的,增加InnoDB表空间大小的 ...

  7. 10. InnoDB表空间加密

    10. InnoDB表空间加密 InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密. 详细信息见官方文档

  8. ibd2sdi — InnoDB表空间SDI提取实用程序

    参考mysql8.0官方文档 https://dev.mysql.com/doc/refman/8.0/en/ibd2sdi.html ibd2sdi是一个实用程序,用于从表空间文件中提取 序列化的字 ...

  9. MySQL InnoDB表空间加密

    从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加 ...

随机推荐

  1. circRNA 在人和小鼠脑组织中的表达

    circRNA 是一类动物体内的内源性的RNA,尽管circRNA的种类丰富,但是其在神经系统中的 功能,并不清楚.科学家通过对人和小鼠的不同脑部组织的RNA 测序,发现了上千种circRNA,经过分 ...

  2. [Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建

    谷歌提供的 Android SDK 支持 Ant 自动构建[1],你可以使用调试和发行两种模式进行构建,两种模式不同之处在于调试模式 Ant 会调用内置的调试密钥,而发行模式调用你提供的私钥. 首先安 ...

  3. 在最新的Power BI Desktop中使用报表主题功能

    报表主题的工作原理 Power BI Desktop中,增加了万众期待的报表主题色功能(预览),如下图: 要使用这个功能,请先在官网下载并安装最新版的Power BI Desktop.安装成功后在&q ...

  4. Linux CentOS中防火墙的关闭及开启端口

    注:CentOS7之前用来管理防火墙的工具是iptable,7之后使用的是Firewall 样例:在CentOS7上安装tomcat后,在linux本机上可以访问tomcat主页,http://ip: ...

  5. postgresql----条件表达式

    postgresql支持CASE,COALESCE,NULLIF,GREATEST,LEAST条件表达式,使用它们有时候可以简化许多功能实现. 测试表 test),sex )); CREATE TAB ...

  6. AJAX返回总是ERROR或是没有数据的问题

    如果总是到ERROR,是因为async没有定义为false,设置为同步,数据类型要设置为text,不要用json. 示例: if (IDcard != "") { $.ajax({ ...

  7. GIAC2018全球互联网架构大会深圳站盛况回顾,定格精彩瞬间!

    6月1日至2日,由知名软件培训公司msup和高可用架构联合推出的GIAC全球互联网架构大会在深圳华侨城洲际大酒店盛大召开.来自国内外顶级互联网公司.诸多著名科技图书作者在内的71名海内外著名专家与现场 ...

  8. CH 2101 - 可达性统计 - [BFS拓扑排序+bitset状压]

    题目链接:传送门 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条 ...

  9. Vue 数据响应式原理

    Vue 数据响应式原理 Vue.js 的核心包括一套“响应式系统”.“响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码.例如,视图渲染中使用了数据,数据改变后,视图也会自动更新. 举个简单 ...

  10. Hive中的窗口函数

    简介 本文主要介绍hive中的窗口函数.hive中的窗口函数和sql中的窗口函数相类似,都是用来做一些数据分析类的工作,一般用于olap分析 概念 我们都知道在sql中有一类函数叫做聚合函数,例如su ...