oracle 表空间tablespace

时间:2022-04-24
本文章向大家介绍oracle 表空间tablespace,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、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、上面介绍的是常用的表空间介绍,下图中的就是特殊的表空间