ITPub博客

首页 > 数据库 > Oracle > Oracle数据库逻辑结构II

Oracle数据库逻辑结构II

原创 Oracle 作者:糖糖TJ 时间:2015-07-22 20:51:18 0 删除 编辑

<!--[if !supportLists]-->一、<!--[endif]-->表空间和数据文件

Oracle数据库(tablespace)是由若干个表空间构成的。

任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。

<!--[if !supportLists]-->(一)、<!--[endif]-->常用表空间

在Oracle 11g中有以下几种比较特殊的表空间:

<!--[if !supportLists]-->1. <!--[endif]-->系统表空间

系统表空间(system tablespace)是每个Oracle数据库都必须具备的。

SYSTEM 表空间是Oracle 数据库最重要的一个表空间,存放了一些DDL 语言产生的

信息以及PL/SQL 包、视图、函数、过程等,称之为数据字典。

<!--[if !supportLists]-->1) <!--[endif]-->系统表空间的特性

<!--[if !supportLists]-->l <!--[endif]-->不能脱机offline

 

SQL> alter tablespace system offline;

alter tablespace system offline

*

ERROR at line 1:

ORA-01541: system tablespace cannot be brought offline; shut down if necessary

 

<!--[if !supportLists]-->l <!--[endif]-->不能置为只读read only

 

SQL> alter tablespace system read only;

alter tablespace system read only

*

ERROR at line 1:

ORA-01643: system tablespace can not be made read only

 

<!--[if !supportLists]-->l <!--[endif]-->不能重命名

 

SQL> alter tablespace system rename to system2;

alter tablespace system rename to system2

*

ERROR at line 1:

ORA-00712: cannot rename system tablespace

 

 

<!--[if !supportLists]-->l <!--[endif]-->不能删除

 

SQL> drop tablespace system including contents and datafiles;

drop tablespace system including contents and datafiles

*

ERROR at line 1:

ORA-01550: cannot drop system tablespace

 

总结:普通表空间所具有的更名、删除、只读、脱机不为system表空间所拥有。

 

<!--[if !supportLists]-->2) <!--[endif]-->系统表空间的管理

<!--[if !supportLists]-->l <!--[endif]-->使用下面的视图来获取表空间的相关状态,使用空间等等

<!--[if !supportLists]-->u <!--[endif]-->dba_data_files

<!--[if !supportLists]-->u <!--[endif]-->dba_tablespaces

<!--[if !supportLists]-->u <!--[endif]-->dba_free_space

<!--[if !supportLists]-->u <!--[endif]-->v$datafiles

<!--[if !supportLists]-->u <!--[endif]-->v$tablespace

<!--[if !supportLists]-->l <!--[endif]-->保证空间可用,一般存放单个数据文件。设置为自动扩展

<!--[if !supportLists]-->l <!--[endif]-->如果SYSTEM表空间数据文件很大,可以考虑使用bigfile

<!--[if !supportLists]-->l <!--[endif]-->为防止由于用户错误引起的SYSTEM表空间不可用,为系统设置默认表空间

 

//为数据库设定默认表空间

SQL>ALTER DATABASE DEFAULT TABLESPACE tablespace_name;

//修改property_value参数格式长度为30        

SQL> col property_value format a30       

//查询系统默认表空间   

SQL> SELECT property_name,property_value 

   2  FROM database_properties

   3  WHERE property_name like 'DEFAULT%';

 

   PROPERTY_NAME                  PROPERTY_VALUE

   ----------------------------------------------------  ------------------------------

   DEFAULT_TEMP_TABLESPACE          TEMP

   DEFAULT_PERMANENT_TABLESPACE   USERS //应为非SYSTEM表空间

   DEFAULT_TBS_TYPE                   SMALLFILE

//查询某用户默认表空间  

SQL> SELECT username,default_tablespace

   2  FROM dba_users WHERE username='SCOTT';

   USERNAME                       DEFAULT_TABLESPACE

   ------------------------------------------------  ------------------------------

   SCOTT                            USERS

 

 

 

<!--[if !supportLists]-->2. <!--[endif]-->SYSAUX表空间

SYSAUX表空间是随着数据库的创建而创建的,由Oracle10g引入,充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。

以前一些使用独立表空间或系统表空间的数据库组件现在在SYSAUX 表空间中创建,通过分离这些组件和功能,SYSTEM 表空间的负荷得以减轻.反复创建一些相关对象及组件

引起SYSTEM 表空间的碎片问题得以避免。

如果SYSAUX 表空间不可用,数据库核心功能将保持有效;使用SYSAUX 表空间的特点将会失败或功能受限。

<!--[if !supportLists]-->l <!--[endif]-->不能删除

<!--[if !supportLists]-->l <!--[endif]-->不能重命名

<!--[if !supportLists]-->l <!--[endif]-->不能置为read only

结论:

这是一个管理及规划上的改进,进一步独立SYSTEM 表空间,保证其存储及性能。

我们在做数据库规划时大可借鉴Oracle 这个改进,分离重要数据及次要数据,分离稳定结构及频繁变化结构,尽量减少对重要数据及结构的影响。

 

<!--[if !supportLists]-->3. <!--[endif]-->临时表空间

<!--[if !supportLists]-->1) <!--[endif]-->临时表空间的作用

相对于其他表空间而言,临时表空间(temp tablespace)主要用于存储Oracle数据库运行期间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。

Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。

在Oracle数据库中进行排序、分组汇总、索引等到作时,会产生很多的临时数据。

通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA((程序全局区)内。在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序操作而产生的临时数据。但是这个分区的容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间中。

看起来好像这个临时表空间是个临时工,但其实临时表空间对数据库的影响非常大。在用户进行数据库操作时,排序、分组汇总、索引这些作业是少不了,其会产生大量的临时数据。为此基本上每个数据库都需要用到临时表空间。而如果这个临时表空间设置不当的话,则会给数据库性能带来很大的负面影响。为此管理员在维护这个临时表空间的时候,不能够掉以轻心。要避免因为临时表空间设置不当影响数据库的性能。

 

 

 

<!--[if !supportLists]-->2) <!--[endif]-->临时表空间的维护和管理

<!--[if !supportLists]-->l <!--[endif]-->为用户创建默认临时表空间

可以利用temporary table space子句为用户指定默认临时表空间。

9i之前,如果没有为用户创建默认的临时表空间,数据库系统就会“自作聪明”的利用系统表空间SYSTEM来创建临时段。由于临时表空间中的数据是临时的,为此数据库系统需要频繁地分配和释放临时段。这些频繁的操作会在系统表空间中产生大量的存储碎片。当这些存储碎片比较多时,就会影响系统读取硬盘的效率,从而占用系统表空间的空间和影响其性能。

9i和以后的版本,可以使用'alter database default temporary tablespace'为数据库指定默认临时表空间。如果没有为用户指定默认临时表空间,则会使用数据库的默认临时表空间。但如果曾经为用户指定默认临时表空间,而该表空间被删除又未重新指定,当该用户需要用到临时表空间时,会报错ORA-00959。

<!--[if !supportLists]-->l <!--[endif]-->合理设置PGA,减少临时表空间使用的几率

临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理。当oracle里需要用到sort的时候,PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间,正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段的。注意这里的释放,仅仅是将这些空间标记为空闲,并可重用,真正占用的磁盘空间并没有释放。所以Temp表空间可能会越来越大。排序是很耗资源的,Temp表空间满了,关键是优化你的语句,尽量使排序减少才是上策。

当排序操作产生临时数据时,数据库并不是马上将其存储在临时表空间中。通常情况下,会先将这些临时数据存储在内存的PGA程序全局区内。只有当这个程序全局区无法容纳全部数据时,数据库系统才会启用临时表空间中的临时段来保存这些数据。

众所周知,操作系统从内存中读取数据要比从硬盘中读取数据块几千倍。为此比较理想的情况是,这个程序全局区足够的大,可以容纳所有的临时数据。此时数据库系统就永远用不到临时表空间了。从而可以提高数据库的性能。

但是这毕竟只是一个理想。由于内存大小等多方面的限制,这个PGA程序区的大小往往是有限制的。所以在进行一些大型的排序操作时,这个临时表空间仍然少不了。 数据库管理员可以通过合理设置这个PGA程序全局区的大小,尽量减少临时表空间使用的几率。如在实际工作中,数据库管理员可以根据需要来设置初始化参数SORT_AREA_SIZE参数。这个参数主要控制这个PGA程序全局区内排序区的大小。通常情况下,如果这个数据库系统主要用来查询并且需要大量的排序、分组汇总、索引等操作时,那么可以适当调整这个参数,来扩大PGA分区的大小。相反,如果这个系统主要用于更新操作,或者在这个数据库服务器上还部署由其他的应用程序,那么这个PGA分区就不能够占用太多的内存,以防止对其他应用程序产生不利的影响。

         

<!--[if !supportLists]-->l <!--[endif]-->为临时表空间预留足够的硬盘空间

其他表空间对应的数据文件,在其创建时就会被完全分配和初始化,即在其创建时就会被分配存储空间。但是临时表空间对应的临时文件则不同。如在Linux操作系统中,临时表空间创建时系统是不会分配和初始化临时文件的。也就是说,不会为临时文件分配存储空间。只有临时数据出现需要用到临时文件的时候,系统才会在硬盘上分配一块地方用来保存临时文件。此时就可能会产生一个问题,即当需要用到临时文件系统为其分配空间的时候,才会先系统分区中没有足够的存储空间了。此时就会产生一些难以预料的后果。

为此对于这些临时文件,数据库管理员最好能够预先为其保留足够的空间。

如在Linux操作系统中,可以将其放置在一个独立的分区内,不允许其他应用程序使用。如此的话,就不用担心临时文件没有地方存储了。

另外,由于临时表空间主要用来存放一些排序用的临时文件。为此如果能够将这个临时表空间存放在性能比较好的分区中,还可以提高数据库系统读取临时表空间中数据的速度。

再者,由于系统需要频繁分配临时表空间中的数据,为此临时表空间所在的分区会出现比较多的碎片。此时如果将临时表空间存放在一个独立的分区内,那么数据库管理员就可以单独对这个分区进行碎片整理,从而提高这个分区的性能。

所以无论出于什么原因,将临时表空间放置在一个独立的分区内,是一个不错的想法。不仅可以保证临时文件有存储的空间,而且还可以提高数据库的性能。

对于临时表空间最后需要说明的是,默认情况下这个临时表空间对各个用户都是共享的。也就是说每个连接到数据库的用户都可以使用默认的临时表空间。数据库管理员可以为其指定其他的临时表空间。一般来说,只需要一个临时表空间即可。

<!--[if !supportLists]-->3) <!--[endif]-->临时表空间组

从 oracle 10g 开始,可以创建多个临时表空间,并把它们组成一个临时表空间组,这样应用数据用于排序时可以使用组里的多个临时表空间,一个临时表空间组至少有一个临时表空间,其最大个数没有限制,组的名字不能和其中某个表空间的名字相同。临时表空间组是在创建临时表空间时通过指定group字句创建的,如果删除组中的全部临时表空间,那么这个组也将消失。 

<!--[if !supportLists]-->l <!--[endif]-->数据库层面可以同时指定多个临时表空间,避免当临时表空间不足时所引起的磁盘排序问题;    

<!--[if !supportLists]-->l <!--[endif]-->当一个用户同时有多个会话时,可以使得它们使用不同的临时表空间;

<!--[if !supportLists]-->l <!--[endif]-->并行操作中,不同的从属进程可以使用不同的临时表空间

 

 

 

创建临时表空间组: 

 

SQL> create temporary tablespace tempts1 tempfile

          2  '/home/oracle/temp1_02.dbf' size 2M tablespace group group1;       

SQL> create temporary tablespace tempts2 tempfile

          2  '/home/oracle/temp2_02.dbf' size 2M tablespace group group2;

       

查询临时表空间组 

 

SQL> select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

GROUP1                         TEMPTS1

GROUP2                         TEMPTS2 

 

将表空间从一个临时表空间组移动到另外一个临时表空间组:  

 

SQL> alter tablespace tempts1 tablespace group GROUP2 ;

Tablespace altered

SQL> select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

GROUP2                         TEMPTS1

GROUP2                         TEMPTS2 

 

把临时表空间组指定给用户 

SQL>  alter user scott temporary tablespace GROUP2;

在数据库级设置临时表空间 

SQL>  alter database <db_name> default temporary tablespace GROUP2;  

删除临时表空间组 (删除组成临时表空间组的所有临时表空间) 

 

SQL> drop tablespace tempts1 including contents and datafiles;

Tablespace dropped

SQL>  select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

GROUP2                         TEMPTS2

SQL> drop tablespace tempts2 including contents and datafiles;

Tablespace dropped

SQL>  select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME

 

 

<!--[if !supportLists]-->4) <!--[endif]-->临时表空间的特性

<!--[if !supportLists]-->l <!--[endif]-->诸如“表”等的永久对象不能存放在临时文件中

<!--[if !supportLists]-->l <!--[endif]-->临时表空间通常被设置为NOLOGGING模式,这意味着他们不产生redo,临时文件不能做介质恢复

<!--[if !supportLists]-->l <!--[endif]-->临时文件不能够只读

<!--[if !supportLists]-->l <!--[endif]-->不能使用ALTER DATABASE语句创建临时文件

<!--[if !supportLists]-->l <!--[endif]-->当你创建或修改临时文件时,不能保证磁盘一定能分配给它指定的空间。在Linux等Unix系统中,磁盘空间不会在文件创建时被分配,而是文件第一次被访问是分配,临时文件分配到的可能不是连续的磁盘空间。

<!--[if !supportLists]-->l <!--[endif]-->相关视图dba_temp_files、V$TEMPFILE、DBA_DATA_FILES。

<!--[if !supportLists]-->5) <!--[endif]-->释放临时表空间

<!--[if !supportLists]-->l <!--[endif]-->重启数据库,这时smon进程会完成临时段的释放清理temp表空间的操作。

<!--[if !supportLists]-->l <!--[endif]-->可以修改一下temp表空间的storage参数,让smon进程关注一下临时段,从而达到清理表空间的目的。 

 

alter tablespace temp increase 1; 

alter tablespace temp increase 0; 

 

<!--[if !supportLists]-->l <!--[endif]-->用语句查询谁在使用临时段 

 

SELECT se.username,sid,serial#,sql_address,machine,program,tablespace,segtype,contents FROM v$session se, v$sort_usage su 

WHERE se.saddr = su.session_addr;

 

杀掉正在使用临时段的进程 

Alter system kill session 'sid,serial#'; 

把temp表空间回缩一下 

alter tablespace temp coalesce; 

<!--[if !supportLists]-->l <!--[endif]-->使用诊断事件的一种方法:

首先,确定temp表空间的ts#  

select ts#,name from sys.ts#; 

注:temp表空间的ts#是3,所以 ts#+1=4 

执行清理操作: 

alter session set events 'immediate trace name DROP_SEGMENTS level 4'; 

 

 

 

<!--[if !supportLists]-->4. <!--[endif]-->撤销表空间

用于保存Oracle数据库撤销信息,即保存用户回滚段的表空间称之为回滚表空间(或简称为撤销表空间(undo tablespace))。在Oracle8i中是rollback tablespace,从Oracle9i开始改为undo tablespace。在Oracle 10g中初始创建的只有6个表空间sysaux、system、temp、undotbs1、example和users。其中temp是临时表空间,undotbs1是undo撤销表空间。

使用多个表空间有以下好处:

<!--[if !supportLists]-->? <!--[endif]-->不同类型的数据存入到不同的表空间中,可以更灵活地管理数据库。

<!--[if !supportLists]-->? <!--[endif]-->将还原段、临时段、应用程序数据段和应用程序索引段分开存储到不同表空间中。

<!--[if !supportLists]-->? <!--[endif]-->根据备份要求将数据分开存储。

<!--[if !supportLists]-->? <!--[endif]-->将动态数据和静态数据分别存储在不同的表空间中,以利于备份和恢复。

<!--[if !supportLists]-->? <!--[endif]-->通过分配给用户表空间上的配额,避免分某个用户占用表空间太多的存储空间。

数据库至少包含以下几个表空间:SYSTEM表空间,临时表空间(TEMPORARY)用于存放临时数据,UNDO表空间用于存入数据修改后的旧值。

查询数据库包含的表空间信息:

1)以管理员身份登录

SQL> CONN / AS SYSDBA

2)查询表空间

 

SQL> SELECT name FROM V$TABLESPACE;

NAME

------------------------------

CWMLITE

DRSYS

EXAMPLE

INDX

ODM

SYSTEM

TOOLS

UNDOTBS1

USERS

XDB

TEMP

已选择11行。

 

 

其中SYSTEM是系统表空间、UNDOTBS1是UNDO表空间、TEMP是临时表空间。

<!--EndFragment-->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29781254/viewspace-1744975/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-08-01

  • 博文量
    27
  • 访问量
    46686