表空间是数据库的逻辑组成部分,从物理上来讲,数据库的数据存放在数据文件中;从逻辑上讲,数据库是存放在表空间中,表空间是由一个或是多个数据文件组成。
从物理角度看表里面所有的数据都是放在数据文件里面,在数据库里面所有的东西都是以文件的方式存放的,但是在管理的时候却是以表空间的形式进行管理。
从图上可以看出,从物理的角度来看表是存放在数据文件里面的,即表里面的数据都是放在数据文件里面的。但是在研究这个问题的时候,往往是说这个表在哪个表空间里面,而这个表空间又是由多个数据文件组成的。在研究问题的时候都喜欢说表在表空间里面。
表是在表空间里面。而表空间又是由多个数据文件构成的。在实际的过程中说某张表在表空间里面。表空间可以自己创建也可以使用默认的表空间system。
Oracle中逻辑结构包括表空间,段,区,块。
数据库是由表空间构成,而表空间又是由段组成,而段又是由区构成,而区又是由Oracle块构成的这样的一种结构,可以提高数据库效率。
表空间逻辑结构:表空间由段组成。段里面又分成了许多区。区里又分成了许多块。
一个数据库可以包括多个表空间,这个是没有限制的。多个表空间构成了一个数据库,表空间由多个文件构成。表空间包含多个物理文件这个是可以变化的,当表空间不够用可以增加文件个数,大小。
表空间用于从逻辑上组织数据库的数据,数据库从逻辑上是由一个或者多个表空间组成。通过表空间可以达到以下作用。
(1)控制数据库占用的磁盘空间
(2)DBA可以将不同数据类型部署到不同位置,这样有利于提高i/o性能,同时利于备份和恢复管理等操作。
如果没有表空间这个概念,文件到处存储,这样不便于管理。将索引放在一个表空间将数据放在另外一个表空间。
建立表空间
建立表空间是create tablespace命令来完成,需要注意的是,一般情况下,建立表空间是特权用户或者DBA来执行的,如果用其他用户来创建表空间,则用户必须要有create tablespace系统权限。
建立数据表空间
在建立数据库后,为了便于管理表,最好建立自己的表空间
Create tablespace data01 datafile ‘d:\datda01.dbf’ size 20m uniform size 128k;
执行完这个命令会建立名称为data01的表空间,并为该表空间建立名称为data01.dbf的数据文件,区大小128k
使用表空间
Create table mypart (deptno number(4),dbname varchar(14)) tablespace data01;
表空间的名字叫做data01,将data01.dbf文件放在data01表空间里面。相当于文件放到表空间里面。大小为20m,区的大小为128k。
为表空间文件分配的大小有上限,不能超过500M,如果表空间大于500M,可以再为表空间分配新的文件。
上面创建了一个表空间,名字为spacetest,并且为该表空间分配了一个文件,位置在d盘下面,名字为spacetest.dbf,文件大小为10m,区大小为128k。
切换到d盘,可以看到在d盘下面有这个文件,大小为10m。
创建了表空间之后就要使用表空间了。
如果创建表没有指定表空间就默认放在system表空间里面。
创建一个新表,将这个表放在spacetest表空间里面。
可以看到在spacetest下面有新创建的mypart这张表。即这张表是放在这个表空间里面的。
可以看到在spacetest下面有新创建的mypart这张表。即这张表是放在这个表空间里面的。
改变表空间状态
当建立表空间时,表空间处于联机(online)状态,此时该表空间是可以访问的,并且表空间是可以读写的,即可以查询表开年的数据,而且可以在表空间执行各种语句。但是在进行系统维护或者数据维护时候,可能需要维护表空间状态。一般情况下,由特权用户或者dba来操作。
(1)使用表空间脱机alter tablespace 表空间名 offline;
(2)使用表空间联机 alter tablespace 表空间名 online;
(3)只读表空间:当建立表空间时,表空间可以读写,如果不希望在该表空间上执行update,delete,insert操作,那么可以将表空间修改为只读 alter tablespace 表空间名 read only。
可以看到修改表空间为只读,在向表空间插入数据会出现错误。同时也可以证明数据是放在表空间的数据文件D:\SPACETEST.DBF当中的。
将表空间改为read,write,那么表空间就是可读可写的。
知道表空间,显示该表空间包括的所有的表
Select * from all_tables where tablespace_name=’表空间名’
知道表名,查看该表属于哪个表空间
Select tablespace_name,table_name from user_tables where table_name=’emp’;注意在将system设置为只读是不会成功的,因为system是系统表空间,普通表空间是可以设置为只读的。
删除表空间
一般情况下,由特权用户或者是dba来操作,如果是其他用户操作,那么要求用户具有drop tablespace系统权限。
Drop tablespace ‘表空间’ including contents and datafiles;
Including contents表示删除表空间时删除表空间所有数据库对象,而datafiles表示将数据文件也删除。
扩展表空间
表空间是由数据文件组成,表空间大小实际上就是数据文件相加后的大小。那么可以想象,假定向mypart表里面一直写数据,因为表空间初始大小只有20M,那么当数据量大于20M表空间不够了怎么处理呢,这个时候就需要扩展表空间了。
可以看到数据量达到表空间指定的大小就无法向表空间里面插入数据了。
扩展表空间是为了增加更多的存储空间,有三种方法。
(1)增加数据文件
Alter tablespace 表空间名字 add datafile 路径 size
此时可以往表里面插入数据了,可以看到增加数据文件可以增加表空间大小。即在表空间里面增加文件。
(1)增加数据文件大小
alter tablespace 表空间名 路径 resize
resize是将原来文件变大
(2)设置文件的自动增长
alter tablespace 表空间名 路径 autoextend on next 10m maxsize 500m;
当空间不够了就自动扩展,每次扩展10M,但是文件最大500M,所以还是得使用增加文件来解决