
Oracle表空间
SQL Server资料库与Oracle资料库之间最大的区别要属表空间设计。Oracle资料库开创性地提出了表空间的设计理念,这为Oracle资料库的高性能做出了不可磨灭的贡献。可以这幺说,Oracle中很多最佳化都是基于表空间的设计理念而实现的。
基本介绍
- 中文名:Oracle表空间
- 外文名:tablespaces
- 性质:资料库
- 创新之处:表空间的设计理念
- 载体:数据档案
基本概述
Oracle表空间之基本概念
ORACLE资料库被划分成称作为表空间的逻辑区域——形成ORACLE资料库的逻辑结构。一个ORACLE资料库能够有一个或多个表空间,而一个表空间则对应着一个或多个物理的资料库档案。表空间是ORACLE资料库恢复的最小单位,容纳着许多资料库实体,如表、视图、索引、聚簇、回退段和临时段等。
每个ORACLE资料库均有SYSTEM表空间,这是资料库创建时自动创建的。SYSTEM表空间必须总要保持在线上,因为其包含着资料库运行所要求的基本信息(关于整个资料库的数据字典、在线上求助机制、所有回退段、临时段和自举段、所有的用户资料库实体、其它ORACLE软体产品要求的表)。
一个小型套用的ORACLE资料库通常仅包括SYSTEM表空间,然而一个稍大型套用的ORACLE资料库採用多个表空间会对资料库的使用带来更大的方便。
例如:便于理解,把oracle资料库看作一个实在房间,表空间可以看作这个房间的空间,是可以自由分配,在这空间里面可以堆放多个箱子(箱子可以看作资料库档案),箱子里面再装物件(物件看作表)。用户指定表空间也就是你希望把属于这个用户的表放在那个房间(表空间)里面。
表空间是一个虚拟的概念可以无限大,但是需要由数据档案作为载体。
表空间是一个虚拟的概念可以无限大,但是需要由数据档案作为载体。
Segment(段)
段是指占用数据档案空间的通称,或资料库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速快取段等。
Extent(区间)
分配给对象(如表)的任何连续块叫区间;区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象.
查看錶空间:
SQL> select * from v$tablespace;
TS# NAME INCLUD BIGFIL FLASHB ENCRYP
------------------------------------------------------------------------------
SYSTEM YES NO YES
UNDOTBS1 YES NO YES
SYSAUX YES NO YES
USERS YES NO YES
TEMP NO NO YES
查看每个表空间有哪些数据档案:
SQL> desc dba_data_files;
Name Null? Type
-----------------------------------------------------------------------------
FILE_NAME VARCHAR2(513)
FILE_ID NUMBER
TABLESPACE_NAME VARCHAR2(30)
BYTES NUMBER
BLOCKS NUMBER
STATUS VARCHAR2(9)
RELATIVE_FNO NUMBER
AUTOEXTENSIBLE VARCHAR2(3)
MAXBYTES NUMBER
MAXBLOCKS NUMBER
INCREMENT_BY NUMBER
USER_BYTES NUMBER
USER_BLOCKS NUMBER
ONLINE_STATUS VARCHAR2(7)
查看详细数据档案:
SQL> select file_name,tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
----------------------------------------------------------------------------------------------------------------
/ora10/product/oradata/ora10/users01.dbf USERS
/ora10/product/oradata/ora10/sysaux01.dbf SYSAUX
/ora10/product/oradata/ora10/undotbs01.dbf UNDOTBS1
/ora10/product/oradata/ora10/system01.dbf SYSTEM
创建一个表空间:
SQL> create tablespace paul datafile '/ora10/product/oradata/ora10/paul01.dbf' size
20m;
Tablespace created.
查看我们创建的表空间:
[ora10@localhost ora10]$ pwd
/ora10/product/oradata/ora10
[ora10@localhost ora10]$ ls
control01.ctl control03.ctl redo01.log redo03.log system01.dbf undotbs01.dbf
control02.ctl paul01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf

Oracle表空间之作用
表空间的作用能帮助DBA用户完成以下工作:
1.决定资料库实体的空间分配;
2.设定资料库用户的空间份额;
3.控制资料库部分数据的可用性;
4.分布数据于不同的设备之间以改善性能;
5.备份和恢複数据。
用户创建其资料库实体时,必须给予表空间中具有相应的权力,所以对一个用户来说,其要操纵一个ORACLE资料库中的数据,应该:
1.被授予关于一个或多个表空间中的RESOURCE特权;
2.被指定预设表空间;
3.被分配指定表空间的存储空间使用份额;
4.被指定预设临时段表空间,建立不同的表空间,设定最大的存储容量。
控制空间
在一些大型的资料库套用中,我们需要控制某个用户或者某一组用户其所占用的磁碟空间。这就好像在档案伺服器中,需要为每个用户设定磁碟配额一样,以防止硬碟空间耗竭。所以,在资料库中,我们也需要限制用户所可以使用的磁碟空间大小。为了达到这个目的,我们就可以通过表空间来实现。
我们可以在Oracle资料库中,建立不同的表空间,为其设定最大的存储容量,然后把用户归属于这个表空间。如此的话,这个用户的存储容量,就受到这个表空间大小的限制。当然,表空间的优势还不仅仅这些,企业对于资料库的性能要求越高,或者资料库容量越大,则表空间的优势就会越大。
下面,我们就具体来看看Oracle资料库中表空间的处理方式,看其在性能与安全性方面是否有足够的优势与SQL Server资料库抗衡。
Oracle空间
在资料库设计的时候,我们建议资料库管理员按如下顺序设定表空间。
第一步:建立Oracle用户表空间。
在设计资料库的时候,首先需要设计表空间。我们需要考虑,是只建立一个表空间呢,还是需要建立多个表空间,以及各个表空间的存放位置、磁碟限额等等。
到底设计多少个表空间合理,没有统一的说法,这主要根据企业的实际需求去判断。如企业需要对用户进行磁碟限额控制的,则就需要根据用户的数量来设定表空间。当企业的数据容量比较大,而且又对资料库的性能有比较高的要求时,就需要根据不同类型的数据,设定不同的表空间,以提高其输入输出性能。
第二步:建立Oracle用户,并指定用户的默认表空间。
在建立用户的时候,我们建议资料库管理员要指定用户的默认表空间。因为我们在利用CREATE语句创建资料库对象,如资料库表的时候,其默认是存储在资料库的当前默认空间。若不指定用户默认表空间的话,则用户每次创建资料库对象的时候,都会存储在资料库默认表空间中,如果想存储在自己建的表空间中,最好自己指定自己建的表空间为默认表空间。
另外要注意,不同的表空间有不同的许可权控制。用户对于表空间A具有完全控制许可权,可能对于表空间B就只有查询许可权,甚至连连线的许可权的都没有。所以,合理为用户配置表空间的访问许可权,也是提高资料库安全性的一个方法。
空间恢複方案
用户表空间
ORACLE表空间错误现象:
在启动资料库时出现ORA-01157,ORA-01110或作业系统级错
误例如ORA-07360,在关闭资料库(使用shutdown normal或shutdown immediate) 时将导致错误ORA-01116,ORA-01110以及作业系统级错误ORA-07368
解决:
以下有两种解决方案:
方案一、用户的表空间可以被轻易地重建
导出的对象是可用的或表空间中的对象可以被轻易地重建等。在这种情况下,最简单的方法是offline并删除该数据档案,删除表空间并重建表空间以及所有的对象。
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空间及所有对象。
方案二、用户的表空间不能够被轻易地重建
在大多数情况下,重建表空间是不可能及太辛苦的工作.方法是倒备份及做介质恢复.如果您的系统运行在NOARCHIVELOG模式下,则只有丢失的数据,在online redo log中方可被恢复。
步骤如下:
1)Restore the lost datafile from a backup
2)svrmgrl> startup mount
3)svrmgrl> select v1.group#,member,sequence#,first_change# from v$log v1,v$logfile v2 where v1.group#=v2.group#;
4)如果资料库运行在NOARCHIVELOG模式下则:svrmgrl> select file#,change# from v$recover_file;
如果 CHANGE# 大于最小的FIRST_CHANGE#则数据档案可以被恢复。
如果 CHANGE# 小于最小的FIRST_CHANGE#则数据档案不可恢复。恢复最近一次的全备份或採用方案一。
5)svrmgrl> recover datafile filename;
6)确认恢复成功
7)svrmgrl> alter database open resetlogs;
唯读表空间无需做介质恢复,只要将备份恢复即可。唯一的例外是:
表空间在最后一次备份后被改为read-write 模式
表空间在最后一次备份后被改为read-only 模式
在这种情况下,均需进行介质恢复。
临时表空间
临时表空间并不包含真正的数据,恢复的方法是删除临时表空间并重建即可。
系统表空间
如果备份不可用,则只能採用重建资料库的方法
回滚表空间
有三种种情况:
1、资料库已经完全关闭(使用shutdown immediate或shutdown命令)
1) 确认资料库完全关闭
2) 修改init.ora档案,注释"rollback-segment"
3) svrmgrl> startup restrict mount
4) svrmgrl> alter database datafile filename offline drop;
5) svrmgrl> alter database open;
基于出现的结果:"statement PRocessed" 转(7);"ORA-00604,ORA-00376,ORA-01110"转(6)
6) svrmgrl> shutdown immediate
修改init.ora档案,增加如下一行:_corrupted_rollback_segments = (<roll1>,...<rolln>)
svrmgrl> startup restrict
7) svrmgrl> drop tablespace tablespace_name including contents;
8) 重建表空间及回滚段
9) svrmgrl> alter system disable restricted session;
10) 修改init.ora档案
2、资料库未完全关闭(资料库崩溃或使用shutdown abort命令关闭资料库)
1) 恢复备份
2) svrmgrl> startup mount
3) svrmgrl> select file#,name,status from v$datafile;
svrmgrl> alter database datafile filename online;
4) svrmgrl> select v1.group#,member,sequence#,first_change# from v$log v1,v$logfile v2 where v1.group#=v2.group#;
5) svrmgrl> select file#,change# from v$recover_file; #参见方案2-4
6) svrmgrl> recover datafile filename;
7) svrmgrl> alter database open;
3、资料库处于打开状态
1) 删除回滚段和表空间
2) 重建表空间和回滚段