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错误了。