Tablespace

Table of Contents

1 概念

表空间,是Oralce 数据库中的一个逻辑概念。我们可以理解表空间是存储表、索引的逻辑空间。 虽然表空间是逻辑概念,但是实际上也是有其对应的物理存储的。 表空间是由一个或者多个数据文件组成。大文件表空间只有一个数据文件。小文件表空间中最多可以添加多少个数据文件是由rowid的 计算方式决定的。关于相关信息请参见ORACLE_ROWID

2 相关参数

2.1 db_block_size

此参数是数据块大小。

2.2 db_files

此参数限制了数据库中数据文件个数总和的最大值.当然这个值也不是无限设置的,最大值也受到ROWID影响。原因请参见: ORACLE_ROWID

3 相关视图

3.1 DBA_DATA_FILES

3.2 DBA_FREE_SPACE

3.3 V$DATAFILES

3.4 dba_hist_tbspc_space_usage

3.5 dba_free_space

4 分类

表空间的分类,根据不同的标准会有不同的类别.

  • 根据数据会话结束后数据仍保留,分为永久表空间与临时表空间
  • 根据数据段类型,分为:数据(数据段与索引段,大对象等)表空间,临时表空间,UNDO表空间
  • 根据表空间由多少个文件组成,分为:大文件表空间(只有一个文件),小文件表空间(多个文件组成一个表空间,单个表空间最多1023个数据文件)
  • 根据管理方式分为: 字典管理和本地管理。

4.1 永久表空间

4.1.1 小文件表空间

4.1.2 大文件表空间

4.1.3 resumalbe

当我们在建立一个大表,或往表里面插入大量数据时,如果中途因为表空间剩余空间不足并且没有开启自动扩展的话, 会话中中止并退出操作,如果操作了很长时间,要从头再来,是非常痛苦的。 这种情况往往出现在我们还无法预估将要插入的数据量时,除了个一个极大的表空间或自动扩展来解决之外。 Oracle还为我们提供了一个很好的功能:resumable

在 resumable开启的情况下,如果Oracle执行某一个SQL申请不到空间了,会话会暂停,开始等待有空间可用,(等待 时间可以由TIMEOUT来控制),等你把空间的问题解决了,Oracle会继续刚才的操作。

想要使用这个功能,需要拥有resumable权限。

具体的语法:ALTER SESSION{ ENABLE RESUMABLE [ TIMEOUT integer ] [ NAME string ]| DISABLE RESUMABLE}

相关数据字典:USER_RESUMABLE and DBA_RESUMABLE

如果在SQL中不指定NAME,Oracle自动生成的NAME= ‘Userusername(userid), Session sessionid, Instance instanceid’.

    1. 权限设置 首先一个用户要设置resumable session,必须具有resumable的权限。

      grant resumable to study;
      

      resumable权限也被包含在其他role里面,比如dba,当一个用户拥有dba role时,就自动拥有了resumable privilege.

    2. 开启与关闭

      -- ENALBE resumable session
      
      alter session enable resumable;      --开启
      alter session disable resumable;     --关闭
      
    3. 超时设置 resumable session的默认超时时间为7200秒,也就是2小时。我们可以通过如下的来调整timeout的时间,比如

      alter session enable resumable timeout 1800;
      
    4. 监控 我们可以通过dba_resumable和alert日志来监控resumable session的状态。

      alter session enable resumable timeout 10;
      select user_id,SESSION_ID, STATUS, START_TIME, SUSPEND_TIME,SQL_TEXT, ERROR_NUMBER,ERROR_MSG from dba_resumable;
      
    5. dbms_reumable包 Oracle也提供了一个dbms_resumable package来设置获取或异常终止一个resumable session的操作。

      SQL> alter session enable resumable;
      
      -- 设置其他会话resumable_time
      exec dbms_resumable.set_session_timeout(49,1800);
      
      -- 查看指定会话的resumable_time
      select dbms_resumable.get_session_timeout(49) from dual;
      
      -- 终止指定会话中已经挂起的会话
      exec dbms_resumable.abort(49);
      
      

      执行此命令,被挂起的会话会出现错误: ORA-01013: 用户请求取消当前的操作

  • 在10g中,Oracle一样支持9i的上述方法,同时做了增强。

    1. 增加了一个resumable_timeout的参数

      该参数可以在system和session level级均可以修改.对 db,每个instance可以单独设置.而9i中只能在session一级中设置。比如:

      SQL> show parameter resumable_timeout;
      
      NAME                TYPE           VALUE
      ------------------- -------------- -------
      resumable_timeout   integer        0
      
      SQL> alter system set resumable_timeout=60;
      
      
    2. 对分布式事务的支持 在9i中,resumable特性不支持分布式事务。 10g中,这一限制已经去除。但是在一个分布式事务中,用户开启或者关闭resumable 特性或者变更resumable_timeout参数, 只对当前实例有影响;如果resumable 特性在远端的实例上开启,那么远端的会话会被暂停。
    3. 增加了一个监控的视图

      在10g中,我们也可以通过DBA_OUTSTANDING_ALERTS 来查看当前正牌挂起状态的session.比如:

      select object_name,object_type,reason,message_type,message_level from dba_outstanding_alerts where message_group='Space';
      
  • 在exp/imp,expdp/impdp,sql*loader工具,同样也支持resumable操作,10G 之后是默认开启的. 具体可查看相关命令的帮助文档。

  • 相关文章: