表空间:

MySQL没有真正意义上的表空间管理。

MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间。

一般来说,当数据量很小的时候建议使用共享表空间的管理方式。数据量很大的时候建议使用独立表空间的管理方式。

查看表空间模式:

mysql> show variables like '%innodb_file_per_table%' ;

| innodb_file_per_table | ON    |

表示当前是独立表空间。

若为OFF,则表示为共享表空间。

同样:1表示ON、0表示OFF

查看表空间信息:

select *

from information_schema.global_variables

where variable_name in ("datadir",

"innodb_data_file_path",

"innodb_data_home_dir",

"innodb_file_per_table",

"innodb_open_files");

datadir表示数据文件的基本路径。

innodb_data_file_path表示共享文件的名称。

innodb_file_per_table表示表空间的类型。

innodb_open_files最多可打开的文件个数。

innodb_data_file_path文件格式:

file_name:file_size:auto_extend:max_size

file_name表示数据文件名称、file_size表示数据文件大小、auto_extend表示自动扩展、max_size表示最大大小。

innodb_data_file_path=ibdata1:10M:autoextend:max:500M

ibdata1初始大小为10M、自动扩展且最大为500M。

多个标示符之间使用分号隔开,另外,只有最后一个文件能够使用autoextend属性。


共享表空间:

Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。

共享表空间的优点:

表空间可以分成多个文件存放到各个磁盘,所以表也就可以分成多个文件存放在磁盘上,表的大小不受磁盘大小的限制。

数据和文件放在一起方便管理。

共享表空间的缺点:

1、所有的数据和索引存放到一个文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,当数据量非常大的时候,表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,对于经常删除操作的这类应用最不适合用共享表空间。

2、共享表空间分配后不能回缩:当出现临时建索引或是创建一个临时表的操作表空间扩大后,就是删除相关的表也没办法回缩那部分空间了,进行数据库的冷备很慢;

设置数据文件:

有两种方式设置数据文件,一种是所有的数据文件均在一个目录下,称为同目录数据文件。另一种是所有的数据文件在不同的目录下,称为异目录数据文件。

同目录数据文件、异目录数据文件。

共享表空间数据存储规则:

表结构定义文件:$datadir/$dbname/$tabname.frm

数据文件:共享表空间。

设置同目录数据文件:

[mysqld]

innodb_file_per_table=0

innodb_data_home_dir=/msdata/datas

innodb_data_file_path=ibdata1:50M;ibdata2:20M;ibdata3:50M:autoextend

通过innodb_data_home_dir设置一个共同的数据文件目录。

设置异目录数据文件:

[mysqld]

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=/msdata/datas/ibdata1:76M;/msdata/datas/ibdata2:10M;/msdata/datas/ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

注意,“innodb_data_home_dir=”参数必须存在。同时,autoextend属性只能用于最后一个文件。

也可以使用相对目录,如:

[mysqld]

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

好此,innodb_data_home_dir为空值,则默认取值为:datadir参数的目录。


独立表空间:

独立表空间是每个表都有独立的多个数据文件,而且做到了索引和数据的分离

独立表空间的优点:

每个表都有自已独立的表空间,每个表的数据和索引都会存在自已的表空间中,可以实现单表在不同的数据库中移动。

空间可以回收(除drop table操作处,表空不能自已回收),Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。

对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。

独立表空间的缺点:

1、当数据库中的表数量达到一定级别时,每次操作所涉及的文件过多,如果按照默认Centos的ulimit -n = 1024的话,仅仅只能保证同时打开256个表以内,这在习惯上“拆库拆表”的MySQL数据结构上很难达到要求。

2、另外这种数据文件的利用率不算很高,当大量“不高”的文件集中起来,浪费的空间也很惊人,更何况最后可能出现的状况不是“一堆K级别的小文件”而是“一堆G级别的大文件”,有点适得其反的意思。

独立表空间数据存储规则:

表结构定义文件:$datadir/$dbname/$tabname.frm

数据文件:$datadir/$dbname/$tabname.ibd

独立表空间空间爆满的问题:

当独立表空间的所处空间爆满的时候,只能采用数据迁移的方式,将表空间移走。

具体办法是,将独立表空间更改为共享表空间。

旧配置为:

[mysqld]

innodb_file_per_table=1

新配置为:

[mysqld]

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

重启数据库以后:

对于已经存在的表,数据仍然会存储在原来的独立表空间相关文件中。

对于新增加的表,数据则会存在于新增加共享表空间中。

旧表数据可以通过迁移的方式插入到新表中去。


独立表空间转共享表空间:

旧配置为:

[mysqld]

innodb_file_per_table=1

新配置为:

[mysqld]

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

转换后,重启数据库。

对于已经存在的表,数据仍然会存储在原来的独立表空间相关文件中。

对于新增加的表,数据则会存在于新增加共享表空间中。

共享表空间转独立表空间:

旧配置:

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

新配置:

innodb_file_per_table=1

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

转换后,重启数据库。

对于已经存在的表,数据仍然会存储在原来的共享表空间相关文件中。

对于新增加的表,数据则会存在于独立表空间中。

转换已存在共享表为独立表:

如果tshare1表之前为共享表,在更改数据模式为独立表之间,可使用命令将该表转换为独立表,具体的命令为:

mysql> alter table tshare1 engine=innodb;

但对于独立转共享模式,上式方法将失效。


同目录下添加数据文件:

[mysql@jmdev2 datas]$ ls -ltr

drwxrwxr-x 2 mysql root     4096 2015-10-31 performance_schema

...

-rwxrwxr-x 1 mysql root 79691776 07-26 14:05 ibdata1

-rw-r----- 1 mysql root    26533 07-26 14:09 jmdev2.err

能够看到,当前ibdata1文件已经有76M,此时重新设置my.cnf参数文件

[mysqld]

innodb_data_home_dir=/msdata/datas

innodb_data_file_path=ibdata1:50M;ibdata2:20M;ibdata3:50M:autoextend

启动数据库,会报错:

2016-07-26 14:09:28 1079 [ERROR] InnoDB: Data file /msdata/datas/ibdata1 is of a different size 4864 pages (rounded down to MB) than specified in the .cnf file 3200 pages!

2016-07-26 14:09:28 1079 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data!

由于默认每个page大小为16K,它表示创建该表空间时失败,理由是新建的3200页比已经存在的4864页要小。

[mysqld]

innodb_data_home_dir=/msdata/datas

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M:autoextend

启动数据库,数据库已经自动在/msdata/datas目录下创建ibdata2、ibdata3两个文件。


释放表空间:

MySQL的表空间在删除数据以后,并不会自动收缩表空间,需要进行相关的操作。

删除共享空间表:

删除前大小:

-rw-rw---- 1 mysql root  9437184 07-26 17:32 tshare1.ibd

删除表数据:

mysql> truncate table tshare1;

删除后大小:

-rw-rw---- 1 mysql root    98304 07-26 17:47 tshare1.ibd

可以看到,空间已经释放很多。

剩余空间,如果想删除,则只能使用重建(recreate + analyze)的方式进行。

删除独立空间表:

删除前大小:

-rw-rw---- 1 mysql root 41943040 07-26 17:10 t1.ibd

删除表数据:

mysql> truncate table t1;

删除后大小:

-rw-rw---- 1 mysql root    98304 07-26 17:53 t1.ibd

可以看到,空间已经释放很多。

剩余空间,如果想删除,则只能使用重建(recreate + analyze)的方式进行。

关于optimize操作:

该操作可以使表空间得到充分释放,但该表在操作过程中需要对表添加锁,因为需要在业务压力不大的时候操作。

[mysqld]

skip-new

然后重启数据库。

mysql> optimize table t1;

如果没有“skip-new”选项,就会报错:Table does not support optimize, doing recreate + analyze instead

转载于:https://www.cnblogs.com/liang545621/p/9399766.html

MySQL的表空间管理相关推荐

  1. Oracle undo 表空间管理

    Oracle 的Undo有两种方式: 一是使用undo 表空间,二是使用回滚段. 我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要 ...

  2. ORACLE表空间管理维护

    1:表空间概念 在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成. 如下图所示, ...

  3. 本地区间管理 oracle,Oracle:本地表空间管理,字典表空间管理

    本地管理表空间 一.概述 1.理解本地管理表空间的由来 2.理解什么是字典管理表空间及工作原理 3.理解本地管理表空间的优势(为什么要使用本地管理表空间) 4.理解本地管理表空间的内部结构 5.理解字 ...

  4. mysql申请 表空间_MySQL 系统表空间扩容方法

    MySQL 系统表空间扩容方法 一, 系统表空间扩容方法 方法 1: 在 innodb_data_file_path 参数后面加上 autoextend 参数 innodb_data_file_pat ...

  5. UNDO 表空间管理

    UNDO 表空间管理 一.管理UNDO数据的两种方式 自动(9i新特性)和手动(在9i之前唯一的管理方式). 二.Undo段 在一个进程修改数据库过程中存放旧的数据,包括数据没有修改之前的位置和值.U ...

  6. db2 修改表空间自增长_什么是表?什么是表空间?什么是MySQL的表空间?

    今天我要跟你分享的话题是:"大家常说的表空间到底是什么?究竟什么又是数据表?" 这其实是一个概念性的知识点,当作拓展知识.涉及到的概念大家了解一下就好,涉及的参数,留个印象就好. ...

  7. oracle表空间管理图形界面,Oracle表空间管理和优化

    Oracle 表空间管理和优化 1. TOM大神的表查询和授权语句create or replace procedure SHOW_SPACE(P_SEGNAME IN VARCHAR2, Oracl ...

  8. SYSTEM 表空间管理及备份恢复

    标签: systemoraclesqldatabasefile数据库 2010-11-28 18:14 12689人阅读 评论(0) 收藏 举报 分类: -----Oracle备份恢复(16) 版权声 ...

  9. oracle 10g 扩表空间,Oracle 10g 表空间管理(一)

    一.表空间说明 Oracle 10g表空间包括系统表空间和非系统表空间: 1.系统表空间------>一般存储的是数据字典的相关信息 SYSTEM:是数据字典存放的表空间 SYSAUX:辅助的系 ...

最新文章

  1. pdf2htmlex linux 编译,如何安装编译pdf2htmlex实现pdf到html的格式转换功能
  2. QT cannot open output file debug\OpencvTest.exe: Permission denied
  3. 1.虚拟化的历史和定义
  4. 客户跟进节奏(转至索菲外贸日记)
  5. 阿里云OSS增量上传脚本
  6. Linux shell编程学习笔记-----第十六章
  7. spring boot要如何学习?
  8. 经商失败的人,最可怕的不是失去金钱,而是失去信心
  9. 一条空间不足报警的分析
  10. Citrix 修复严重漏洞,可导致 XenMobile Server 遭接管
  11. HDU2149 Public Sale【巴什博弈】
  12. js调用html文件上传,JavaScript里的文件上传API
  13. 华硕笔记本禁用触控板方法
  14. 脑机直播 x 赛博驱魔!瑞云专访揭秘胶囊计划国风科幻神作《终极体验》制作幕后...
  15. 重复组合公式及其证明方法
  16. SparkStreaming概述
  17. 操作员或系统管理员_什么是系统管理员?
  18. Chrome 出现内存 不足
  19. input onfocus onblur
  20. PTA 用java编写 7-4 房产税费计算2022

热门文章

  1. Function类型
  2. ckeditor4.4.6添加代码高亮
  3. 自定义input type=file 样式的方法
  4. SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因...
  5. Squid代理服务器基本配置(三)
  6. 怎么把位域合成一个字节_C语言中字节对齐和位域
  7. 网上的python教程值不值得买_Python新人入手线程技术教程,值得收藏
  8. 美国本科计算机专业,美国本科计算机专业的最新排名介绍
  9. 计算机科学与技术类高水平国际学术刊物,莘莘学子 | 计算机科学与技术学院本科生薛传雨在国际期刊上发表高水平学术论文...
  10. python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解