一、Oracle 表空间的组成
Everoone knows Oracle数据库真正存放数据的是数据文件,Oracle表空间是逻辑上的概念,他在物理上是并不存在的,把多个DataFile合并到一起就是一个表空间。
左图是Oracle中DataBase和tablepspace和DataFile的关系
如果不理解上图,可以看下图:
表空间就好像是背景,而其中的土地就相当于是数据文件,北京就是由一块块土地构成。
大致的关系是:
1、一个DataBase实例包含多个tablespace,一个tablespace只能属于一个DataBase
2、一个tablespace包含多个DataFile,一个DataFile只能术语一个tablespace
注:上面的代码都不是最小的单位,只是大致上的关系,比如tablespace还可以进行划分,它不仅仅包含DataFile,还包含索引等,下图Oracle存储结构会做稍详细的介绍
Oracle数据库的存储结构
如果不理解上图,可以看下图:
一个tablespace由多个数据文件组成
下面通过文字分析上图的结构关系:
1、DataBase和Schema的关系:因为一个数据库可以创建多个用户来进行管理,而每创建一个用户对应的都会创建一个Schema,所以一个数据库可以对应多个Schema,Schema的具体创建过程和作用请参考Oracle Schema
2、DataBase与tablespace的关系,一个DataBase包含多个tablespace(表空间),表空间的作用是:
用于从逻辑上组织数据库的数据,数据库逻辑上是由一个或者多个表空间组成(至少是一个),通过表空间可以达到一下作用:
a、控制数据库占用的磁盘空间(如果没有表空间,数据文件东方一点西方一点,管理起来很麻烦)
b、dba可以将不同的数据类型部署到不同的位置(比如将索引放到一个表空间下,将触发器放到一个表空间下),这样有利于提高i/o的性能,同时有利于备份和恢复等操作。
3、一个tablespace(表空间)包含多个Segment(段).注:一个数据表占一个段,一个索引也要占一个段。如果不理解段,下文会有解释!
4、一个Segment(段)由多个连续的Extent(区间)组成
5、一个Extent(区间)又由连续的Data Block(数据块组成),这些数据块在逻辑上是连续的,但在物理磁盘上可能是分散的;
Segment(段):
段是指占有数据文件空间的通称,或者是数据库对象(Not 数据库)使用空间的集合,段可以分为以下几种:
1、表段
2、索引段
3、回滚段
4、临时段
5、高速缓存段
Extent (区间):分配给对象(如表)的任何连续块叫区间;区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象.
二、表空间的使用
1、表空间的创建与删除
1.1、表空间的创建
使用sysdba登录,执行以下口令
口令:
create tablespace 表空间名 datafile '表空间所在的磁盘路径' size 表空间的大小 uniform size 按区的大小按多大来分配
或者使用sqlplus创建
然后打开pl/sql developer
表空间创建成功
d盘下存在该记录
ok,证明我们的操作成功
1.2、表空间的删除
删除表空间需要sysdba或者drop tablespace的权限,删除的代码如下:
drop tablespace 表空间名 including contents and datafiles
说明:including contents表示删除表空间的同时,删除表空间的所有数据库对象,and datafiles表示同时也删除数据文件
打开pl/sql developer执行如下语句:
ok,TEST表空间消失,删除成功!!!
2、向新建的表空间中添加表对象
口令:
create table test1(id number(2),name varchar2(10)) tablespace 表空间的名字
在pl/sql developer中执行:
create table test1(id number(2),name varchar2(10)) tablespace TEST
ok,表成功创建到了TEST表空间下
3、改变表空间的访问状态
当建立表空间时,表空间处于连机的状态,此时该表空间是可以访问的,而且该表空间是可以读写的,可以对表空间下的对象进行DML操作,但是,当系统进行维护或者升级的时候,可能不能让外界访问到表空间的对象,所以就需要改变表空间的状态。下面就是几种关于表空间的操作,注:下面的操作必须具有sysdba或者alter tablespace的权限,才能进行
3.1、使表空间脱机
alter tablespace 表空间名 offline;
打开pl/sql developer,执行:
alter tablespace TEST offline;
执行成功,进行如下测试:注:必须重新登录,或新建一个会话进行测试
create table test2(id number(2),name varchar2(10)) tablespace TEST;
3.2、使表空间联机
3.1介绍了如何使表空间脱机,防止在维护时,外部的操作导致数据库发生意外,现在我们对数据库的维护已经完成了,现在需要让表空间重新上线,口令如下:
alter tablespace 表空间名 online;
打开pl/sql developer,执行:
alter tablespace TEST online;
执行成功后,再次进行以下操作:
create table test2(id number(2),name varchar2(10)) tablespace TEST;
ok,成功!!!
3.3、设置表空间为只读表空间
当建立表空间时,表空间可以读写,如果不希望在表空间中进行update、insert、delete等操作,可以通过设置表空间为只读表空间,代码如下:
alter tablespace 表空间名 read only;
打开pl/sql developer 执行如下语句:
alter tablespace TEST read only;
ok,执行成功,重新登录或者新建会话,执行以下语句:
insert into scott.test1 values(1,1)
但是执行查询是可以的:
select * from scott.test1
测试,没填数据
3.4、设置表空间为读写表空间
当希望一个表空间不再是只读表空间的时候,可以通过设置表空间为读写表空间改变其原来的只读状态,代码如下:
alter tablespace 表空间名 read write;
打开pl/sql developer 执行如下语句,设置3.3设置的只读表空间变为可读写的表空间:
alter tablespace TEST read write;
执行成功,在执行如下insert 语句:
insert into scott.test1 values(1,1)
ok,插入成功。
4、查看表空间下的所有表
通过all_tables系统基表和tablespace_name查询表空间下的所有表对象,代码如下,注意大小写:
select * from all_tables where tablespace_name='TESTTABLESPACE'
5、查看当前表属于哪个表空间
通过系统基表user_tables和table_name查询当前表属于哪个表空间,代码如下:注意大小写
select tablespace_name,table_name from all_tables where table_name='EMP';
ok,查出表EMP是USERS表空间下的
6、扩展表空间
表空间是由数据文件组成,表空间的大小实际就是数据文件的大小相加后的大小,那么可以想象,当我们向表空间下面加一张表(初始表的大小就占用了2m),假设我们设置了当前表空间的大小为20M,那么当我们向表中不断的添加数据,那么这张表迟早会被添满,这样就会显示空间不足的消息!这个时候我们就需要扩展表空间,使数据能够正常的添加。
我向表空间名为test的tablespace下新建了一张表,然后向这张表疯狂的添加数据,然后
工具提示Test表空间需要扩展,因为由于表数据的增加,Test空间的大小不够了。现在我们就需要扩展表空间,一共有三种方法:
6.1、增加数据文件
Everyone knows表空间consists of(由什么组成)数据文件,所以可以通过给表空间增加新的数据文件,来达到扩展表空间的作用,口令如下,确保使用sysdba身份登录:
ok,数据文件添加成功,说明表空间扩展成功,说明又可以开始添加数据了
ok,添加成功,说明表空间扩展成功。
6.2、增加数据文件的大小
通过修改数据文件的大小来扩展表空间的大小,代码如下:
alter database datafile '表空间数据文件所在的磁盘路径' resize 100m;
ok,此时表空间下面的TEST.DBF文件大小重置成功,变成100m,下面来进行测试:
ok,数据插入成功,说明表空间扩建成功.
6.3、设置文件的自动增长
通过设置当文件到达我们设定的大小,那么就按照我们指定的增量,进行扩展,直到达到了文件的最大值,就报错!
ok,下面表空间的大小又不够了,那么通过设置文件的自动增长来解决这个问题,代码如下:
alter database datafile '表空间数据文件所在的磁盘路径' AUTOEXTEND ON NEXT 10M maxsize unlimited;
ok,插入成功,说明表空间的扩展又成功了!
7、故障处理
有些时候,如果你的数据文件所在的磁盘损坏时,而你的数据文件没有损坏,但是此时数据文件无法正常使用,为了保证正常的使用,你需要将他的副本移动到其他的盘符进行恢复使用;
8、上面介绍的是常用的表空间介绍,下图中的就是特殊的表空间