MySQL独立表空间管理

智数映星客
• 阅读 457
MySQL的Innodb存储引擎包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间,每个表都有自已独立的表空间,每个表的数据和索引都会存在自已的表空间中,可以实现单表在不同的数据库中移动。

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

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

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

普通建表语句

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> create table table1(a int);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table table1;
+--------+-------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                              |
+--------+-------------------------------------------------------------------------------------------+
| table1 | CREATE TABLE `table1` (
  `a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查看数据目录内容

  • auto.cnf文件是MySQL第一次启动时生成的uuid值
  • ib_buffer_pool文件是MySQL启动时加载缓存数据到内存区域
  • ibdata1文件时存放系统表空间数据,在5.7版本及之前undo log也存放与该文件
  • ib_logfile0 ib_logfile1文件是MySQL的重做日志存放文件,默认两个,循环使用
  • ibtmp1是存放临时表数据的,比如join操作结束后就会删除临时表
  • mysql为MySQL用户信息与权限信息等、performance_schema为MySQL性能库 、sys为MySQL系统信息库
  • test库为用户自行创建的库
[root@db03 ~]# ls  /usr/local/mysql/data
auto.cnf  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  mysql_upgrade_info  performance_schema  sys  test

指定表空间创建表

mysql> create tablespace general add datafile 'general.ibd';
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| table1         |
+----------------+
1 row in set (0.00 sec)

mysql> create table table2(b int) tablespace=general;
Query OK, 0 rows affected (0.01 sec)

mysql> show create table table2;
+--------+----------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                               |
+--------+----------------------------------------------------------------------------------------------------------------------------+
| table2 | CREATE TABLE `table2` (
  `b` int(11) DEFAULT NULL
) /*!50100 TABLESPACE `general` */ ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

查看数据目录内容

  • InnoDB存储引擎:frm文件是表结构元数据文件
  • InnoDB存储引擎:ibd文件是存储数据的文件(独立表空间模式),如果是共享表空间模式将存储在ibdata文件
[root@db03 ~]# ls /usr/local/mysql/data
auto.cnf  general.ibd  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  mysql_upgrade_info  performance_schema  sys  test

[root@db03 ~]# ls /usr/local/mysql/data/test/
db.opt  table1.frm  table1.ibd  table2.frm

指定外部表空间创建表

[root@db03 ~]# mkdir /tablespace
[root@db03 ~]# chown -R mysql.mysql /tablespace
mysql> create tablespace external add datafile '/tablespace/external.ibd';
Query OK, 0 rows affected (0.01 sec)

mysql> create table table3(c int) tablespace=external;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table table3;
+--------+-----------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                |
+--------+-----------------------------------------------------------------------------------------------------------------------------+
| table3 | CREATE TABLE `table3` (
  `c` int(11) DEFAULT NULL
) /*!50100 TABLESPACE `external` */ ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查看数据目录内容

  • isl文件是一个链接文件,里面记录表空间ibd文件存放的路径
[root@db03 ~]# ls /usr/local/mysql/data
auto.cnf  external.isl  general.ibd  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  mysql_upgrade_info  performance_schema  sys  test

[root@db03 ~]# ls /usr/local/mysql/data/test/
db.opt  table1.frm  table1.ibd  table2.frm  table3.frm

[root@db03 ~]# ls /tablespace/
external.ibd

[root@db03 ~]# cat /usr/local/mysql/data/external.isl
/tablespace/external.ibd

指定表空间目录创建表

mysql> create table table4(d int) data directory='/tablespace';
Query OK, 0 rows affected (0.01 sec)

mysql> show create table table4;
+--------+-------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                            |
+--------+-------------------------------------------------------------------------------------------------------------------------+
| table4 | CREATE TABLE `table4` (
  `d` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='/tablespace/' |
+--------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查看数据目录内容

[root@db03 ~]# ls /usr/local/mysql/data/test/
db.opt  table1.frm  table1.ibd  table2.frm  table3.frm  table4.frm  table4.isl

[root@db03 ~]# ls /tablespace/test/
table4.ibd

[root@db03 ~]# cat /usr/local/mysql/data/test/table4.isl
/tablespace/test/table4.ibd

使用系统表空间创建一张表

mysql> create table table5(e int) tablespace=innodb_system;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table table5;
+--------+----------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                     |
+--------+----------------------------------------------------------------------------------------------------------------------------------+
| table5 | CREATE TABLE `table5` (
  `e` int(11) DEFAULT NULL
) /*!50100 TABLESPACE `innodb_system` */ ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查看数据目录内容

[root@db03 ~]# ls /usr/local/mysql/data/test
db.opt  table1.frm  table1.ibd  table2.frm  table3.frm  table4.frm  table4.isl  table5.frm

[root@db03 ~]# ls /tablespace/test
table4.ibd

分别删除库和表空间并且查看原始数据

  • 最终效果:表空间存放路径可以自由设置,某一张大数据量的表也可以指定存放某个表空间或者某一个挂载到系统目录中的大磁盘存储。
mysql> drop database test;
Query OK, 5 rows affected (0.01 sec)
[root@db03 ~]# ls /usr/local/mysql/data
auto.cnf  external.isl  general.ibd  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  mysql_upgrade_info  performance_schema  sys

[root@db03 ~]# ls /tablespace/test/

[root@db03 ~]# ls /tablespace
external.ibd  test
mysql> drop tablespace general;
Query OK, 0 rows affected (0.00 sec)

mysql> drop tablespace external;
Query OK, 0 rows affected (0.00 sec)
[root@db03 ~]# ls /tablespace
test

[root@db03 ~]# ls /usr/local/mysql/data
auto.cnf  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  mysql_upgrade_info  performance_schema  sys
[root@db03 ~]# rm -rf /tablespace
※更多文章和资料|点击后方文字直达 ↓↓↓
100GPython自学资料包
阿里云K8s实战手册
[阿里云CDN排坑指南]CDN
ECS运维指南
DevOps实践手册
Hadoop大数据实战手册
Knative云原生应用开发指南
OSS 运维实战手册
云原生架构白皮书
Zabbix企业级分布式监控系统源码文档
Linux&Python自学资料包
10G面试题戳领
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL innodb表使用表空间ibd文件复制或迁移表
MySQLInnoDB引擎的表通过拷贝物理文件来进行单表或指定表的复制,可以想到多种方式,今天测试其中2种:将innodb引擎的表修改为Myisam引擎,然后拷贝物理文件直接拷贝innodb的表空间文件(前提是独立表空间(默认,通过showvariableslike'innodb\_file\_per\_table
Wesley13 Wesley13
3年前
018:InnoDB 存储引擎、表空间
\TOC\一.InnoDB存储引擎1\.InnoDB的历史年份事件备注1995由HeikkiTuuri创建InnobaseOy公司,并开发InnoDB存储引擎Innobase开始做的是数据库,希望卖掉该公司1996MySQL1.0发布
Wesley13 Wesley13
3年前
MySQL表介绍
MySQLInnoDB表介绍一、索引组织表在InnoDB引擎中,表都是根据主键顺序存放的。这种存储方式称为索引组织表,在InnoDB引擎中,每张表都有逐渐。如果没有显示定义主键,则引擎会按照以下方式选择或创建主键。(1)、判断表是否有非空唯一索引,如果有,则该字段为主键。如果有多个非空唯一索引,则选择第一个定义的非空索引字段作为
Wesley13 Wesley13
3年前
MySQL索引的索引长度问题
MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索引的长度的计算是根据表字段设定的长度来标量的,例如:createtabletest(idint,name1varchar(300),name2varchar(300),nam
Wesley13 Wesley13
3年前
MySQL如何判别InnoDB表是独立表空间还是共享表空间
InnoDB采用按表空间(tablespace)的方式进行存储数据,默认配置情况下会有一个初始大小为10MB,名字为ibdata1的文件,该文件就是默认的表空间文件(tablespcefile),用户可以通过参数innodb\_data\_file\_path对其进行设置,可以有多个数据文件,如果没有设置innodb\_file\_per\_tab
good123 good123
3年前
Oracle创建表空间和用户
1.如果在PL/SQL等工具里打开的话,直接修改下面的代码中斜体加粗部分执行2.确保路径存在,比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路径存在/分为四步//第1步:创建临时表空间/createtemporarytablespaceusertemptempfile'D:\oracle\orada
Wesley13 Wesley13
3年前
oracle创建表空间、用户
SYS用户在CMD下以DBA身份登陆:在CMD中打sqlplus/nolog然后再conn/assysdba注意点:1.如果在PL/SQL等工具里打开的话,直接修改下面的代码中\斜体加粗部分\执行2.确保路径存在,比如【D:\\oracle\\oradata\\Oracle9i\\】也就是你要保存文件的路径存在/
Wesley13 Wesley13
3年前
oracle:ORA
报ORA25153,这一定是临时表空间逻辑名还在,但是找不到临时文件的原因。解决方法:1、查询临时表空间状态状态selecttablespace\_name,statusfromdba\_tablespaces;TABLESPACE\_NAMESTATUS\SYSTEMONL
Wesley13 Wesley13
3年前
MYSQL数据库引擎 MYISAM和 INNODB区别
1、存储结构MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD(MYData)。索引文件的扩展名是.MYI(MYIndex)。InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB
Wesley13 Wesley13
3年前
oracle 删除表空间及数据文件方法
oracle11g版本,创建数据库表空间,默认单个数据文件最大为32G,如果数据文件大于32G,可以增加数据文件。\删除空的表空间,但是不包含物理文件droptablespacetablespace\_name;\删除非空表空间,但是不包含物理文件droptablespacetablespace\_namein
Stella981 Stella981
3年前
Hbase基础篇
hbase存储:HBase存储数据其底层使用的是HDFS来作为存储介质,HBase的每一张表对应的HDFS目录上的一个文件夹,文件夹名以HBase表进行命名(如果没有使用命名空间,则默认在default目录下),在表文件夹下存放在若干个Region命名的文件夹,Region文件夹中的每个列簇也是用文件夹进行存储的,每个列簇中存储就是实际的数据,以HF