日期:2014-05-16  浏览次数:20442 次

存储结构之数据文件和表空间

  oracle存储结构,可分物理结构和逻辑结构。后者是为方便管理前者而生。oracle把数据逻辑地存放在表空间里,物理地存放在数据文件里。
 
  有两个视图,我们可能会常用到:
  dba_data_files:描述数据文件的信息
  dba_tablespaces:描述表空间的信息

  这里先谈三个问题。

  表空间的类型?
  1)永久性表空间,如:system,sysaux,user等
    sysaux用于存放非核心功能的数据,如OEM
    查看存放了哪些非核心功能的数据:
    select occupant_name,occupant_desc,schema_name
    from v$sysaux_occupants;
  2)临时表空间
    用于排序,创建索引
    oracle建议,为每个用户创建一个临时表空间;
    10g引入临时表空间组
  3)undo表空间
    虽有多个undo表空间,但任一时点,只有一个undo表空间被激活。

  不同类型的表空间会产生不同的写入方式和时机点
  永久性表空间
  DBWn写入有两种方式多个时机点
  方式一:
  LRU机制:
    LRU list:保存最近被存取的数据块;
    Dirty list:被修改但尚未写入数据文件的数据块;
  时机点:
  1)Dirty buffer达到阀值时
  2)没有free buffer时(server process在LRU list里找不到足够多的free buffer)
  3)每3秒,DBWn会去检查dirty list,如果dirty list未到域值,就去读LRU list,将dirty buffer移到dirty list;如果dirty list已满,则写入数据文件。
  方式二:
  检查点事件:
  时机点:
  1)log switch时,要求做检查点,即:把dirty buffer flush到数据文件。也即:DBWn将dirty buffer从LRU list中移到dirty list,然后把dirty list中的dirty block flush到数据文件。
  2)表空间下线或热备时,
  3)drop一个对象时,
  4)关闭数据库时

  表空间组成?
  段:占用存储空间的数据库对象,如:emp表又叫emp段。可跨越数据文件,但不能跨越表空间。
  区:连续分配的空间。不能跨越数据文件。注意:这里的连续可能会带来空间碎片
  块:
  1)一个数据库中允许不同块大小,主要用于可传输表空间
  2)通常,数据库中5种不同块大小:默认和非默认。在特殊情况,还存有非标准(不是2的幂)。注意:system表空间总是使用默认块大小,一个表空间中所有块的大小都相同。
  3)块组成:
 块开销:块头,表目录,行目录(指针表:指向每条记录)
 空闲空间
 数据空间
  4)块头:数据块地址,数据块类型,事务表(ITL)
     ITL:行级锁和读一致性的实现基础,每条记录含:UBA(undo block address),事务号,SCN号
     一致性读:oracle对每次用户查询都要记录查询开始的SCN号,用于和数据块中的SCN号比较,如果数据块中的SCN号大于查询SCN,oracle就会利用UBA信息构造CR块,然后再比较CR块中的SCN号和查询SCN,如果仍然大于查询SCN,则还需要继续构造,直到CR块中的SCN小于或等于查询SCN,若还是找不到,就会报ora-01555错误了。