Oracle 表空间

表空间。逻辑上,数据库由一个或者多个表空间构成,表空间由“段”构成, “段”由“区”构成,“区”由“块”构成。 表空间的作用是控制存储空间。 适当安排表空间的用途,可能提高系统的 IO 性能。有经验的 DBA 可能会单独建立一个表空间由于存放索引或者触发器等等。 建立表空间,需要特权用户,如果是普通用户,就需要 create tableplace 权限,例如:

    create tablespace helloworl001 datafile 'd:\helloworld.dbf' size 200M uniform size 128K;

这个例子中 uniform size 128K 表示系统 extent 分配策略是每次固定增长 128K(kilobytes)

对表空间的操作

1.表空间脱机

alter tablespace 表空间名 offline

2. 表空间联机

alter tablespace 表空间名 online

3. 设置表空间读写属性

alter tablespace 表空间名 read only
alter tablespace helloworl001 read only   
alter tablespace helloworl001 read write 

4. 查询某表空间下的所有表(即:知道表空间名,显示这个表空间下所有的表 )

select * from all_tables where tablespace_name='HELLOWORL001'

5. 查询某个表所在的表空间

select tablespace_name, table_name from user_tables
where table_name in ('HELLOWORLD001','EMP')

6. 删除表空间

drop tablespace 名称 including contents and datafiles

实例

1. 表空间的扩展

创建一个容量比较小的表空间:

create tablespace hello002 datafile 'D:\helloworld002.dbf' size 20M uniform 128K

创建一张表

select * from helloworld
create table helloworld002(userid varchar2(20), username varchar2(20), memo varchar2(40)) tablespace hello002;

不断插入数据,从20万到40万时候,出问题了,抛错: ORA-01653,此时就需要扩展表空间了。

表空间扩展的方法:

1. 增减数据文件

alter tablespace hello002 add datafile 'd:\helloworld003.dbf' size 50M

2. 增加数据文件的大小

alter database datafile 'd:\helloworld002.dbf' resize 50M

3. 设置文件自动增长

alter database datafile 'd:\helloworld002.dbf' autoextend on next 10M maxsize 500M

对3,需要说明的是,即使表空间的文件大小设置为自动增长,但也是有上限的,按这里(https://forums.oracle.com/forums/thread.jspa?threadID=1083307)的讨论,这个上限取决于 Oracle 所在的 OS 环境。

做了一个实验,用自动增长方式的文件设置最大尺寸是200M,然后插入大量数据,文件开始增长,增长到200M撑不住, 报错,事务失败,当时数据文件的体积仍然在200M,并没有回收失败导致的空间。 继续向该表空间操作:新建一张表,系统报错:ORA-01658,说空间不足。

2. 移动表到不同的表空间

确定数据文件所在的表空间:

select file_name, tablespace_name from dba_data_files where file_name like '%HELLO%'

使表空间脱机

alter tablespace hello002 offline;

使用命令移动数据文件到指定位置:TODO(此实验需要重做)