首页 > 代码库 > 读书笔记

读书笔记



逻辑结构
oracle的逻辑结构包括表空间(tablespace)、数据段(segment)、分区(extents)、数据块(block)

磁盘最小存储单位是sector,每个sector是512字节。

oracle数据库的最基本存储单位是数据块,每个数据块是由磁盘上连续的sector组成的。

数据块的大小是由初始化参数db_block_size指定的,通常为8k

数据块结构:每个数据块从前向后可以分成4个部分:数据块头 row directory、free space和used space。

oracle为了避免可能出现的“数据块分裂”问题,oracle会在使用联机备份时改变记录日志的方法。也就是在修改数据块内容之前,会先把整个数据块的内容作为前镜像记录到联机日志中,而不再是标准的只记录被改变记录的内容的方法。因此在使用“联机热备”时,会产生更多的日志内容,而rman备份因为是oracle自己的工具,它就可以解决数据块分裂问题


分区是oracle逻辑结构中的第二个层次,连续的数据块组成了一个分区,这个结构仅是用于为便于空间管理,包括空间的分配和释放。


当用户创建表、索引等需要占用磁盘空间的对象时,oracle要为这个对象分配一块磁盘空间作为存储空间,这块空间叫做段,而段的空间不是以数据块为单位分配的,是以分区为单位分配的。


oracle建议一个段里分区的数量不要超过1024.


分区的意义是简化空间管理的复杂性,但是分区带来的负面作用是带来空间碎片。


采用本地管理的表空间对连续的空间碎片有自动合并处理的能力,但是对不连续的空间碎片却无能为力。




oracle的每个表或索引都会对应着一个段。如果使用的是分区表或者分区索引,每个分区都对应着一个段。


每个表空间由若干个物理文件组成。oracle数据库由若干个表空间组成。


            oracle10g表空间
表空间名称        数据类型        段管理方式
system            永久            手动
sysaux            永久            自动
temp            临时            手动
undotbs1        永久            手动
users            永久            自动

可以认为有三种表空间,分别是永久表空间、临时表空间和undo表空间。



永久表空间:所有需要永久保存的数据都应该放在永久表空间。最典型的永久表空间是system sysaux user表空间
system sysaux表空间是在创建数据库时创建的,所有的数据字典对象都被存储在system表空间中,数据库的pl/sql程序单元也同样存储在system表空间。sysaux是从oracle 10g开始出现的表空间。


oracle早期主要集中精力于数据库的核心功能,比如事务、查询优化器等,而非数据库的功能比较少且简单。因此早期的system表空间还主要是用于核心功能的空间支持,比如存放数据字典,从oracle 8开始,oracle开始把精力转到增值功能,这些非核心功能越来越多。虽然这些新功能大多数都属于辅助功能,对于数据库的核心能力(事务 并发)关系不是很大,但是这些功能本身也需要存储空间,而且功能越多,消耗的系统空间越大。如果把所有非核心功能的数据都塞到system表空间,五一增加了系统表空间的压力,一旦某个功能(比如OEM)耗尽了system的所有空间,数据库稳定性就会受到损害。为了减轻system表空间的压力,oracle 10g中提供了一个新的系统辅助表空间sysaux,这个表空间就用于存放这些非核心功能的数据。


system sysaux两个表空间在使用上有一些限制条件:
不能被删除
表空间不能被重命名
不能像普通数据表空间一样被传输








临时表空间:临时表空间主要用途是在为数据库的排序运算、创建索引等操作提供临时的运算空间,运算完成之后系统会自动清理这些临时空间。

每个数据库都需要至少一个临时表空间,为每个用户也要指定一个临时表空间。temp表空间是创建数据库时自动建立的临时表空间。如果创建用户时没有为他指定默认临时表空间,就会把temp表空间作为其默认临时表空间使用。建议每个用户都应有自己的默认临时表空间。




用户的很多操作都要用到临时表空间,比如排序、并行、创建索引等,oracle又规定每个用户只能使用一个临时表空间。为了避免一个表空间的容量限制,oracle 10g提供了新的临时表空间组的功能,允许将多个临时表空间打包成一个组,然后指定用户的默认临时表空间组的功能,从而达到一个用户可以使用多个临时表空间的目的。


临时表空间组特点:
一个临时表空间组至少包含一个临时表空间;
DBA无法通过命令创建临时表空间组,只有当把一个临时表空间分配给该组时,临时表空间组才会自动创建,当组内所有临时表空间被移除时自动删除。


临时表空间组支持的操作:
可以将临时表空间从一个组移动到另一个组(如果组不存在,则自动创建);
可以将组中的临时表空间从组中移除(随着最后一个成员的移除,临时表空间组也自动消失);
可以将目前不属于任何组的临时表空间加入一个组。


使用临时表空间组好处:
防止一个临时表空间出现空间不足的问题;
同一个用户同时连接多个session时,可以使用不同的临时表空间;
在并行操作中可以并行使用多个临时表空间。



检查sysaux表空间保存了哪些非核心功能的数据
SQL> select occupant_name,occupant_desc,schema_name from v$sysaux_occupants;

创建临时表空间组:
create temporary tablespace temp2 tempfile ‘/oracle/testdb/temp2.dbf‘ size 10m tablespace group tmpgroup1;
查看系统中目前存在的临时表空间组的信息
select * from dba_tablespace_groups;


移动临时表空间到新的临时表空间组:
alter tablespace temp tablespace group tmpgroup1;

将临时表空间从临时表空间组中移出:
alter tablespace temp2 tablespace group ‘‘;



临时表空间组的名字不能和表空间的名字冲突。

删除组中所有的临时表空间后,组会自动删除;

可以将数据库或者用户的默认临时表空间指定为临时表空间组:
select username,temporary_tablespace from dba_users;查看用户的临时表空间是哪个




undo表空间
undo表空间用于提供事务回滚和一致性支持,一个数据库中可存在多个undo表空间,但任一时间只能有一个undo表空间被激活。


oracle最多可以管理64000个数据文件。


BFT(big file tablespace),使用这种技术的一个数据文件最大可以达到128T。
SMT(small file tablespace),在oracle 10g中创建表空间就需要指定表空间的类型,如果没有指定,那么oracle 10g会使用缺省的表空间类型SFT,

在一个数据库中可以同时使用BFT和SFT两种表空间

设置数据库缺省表空间类型:
alter database set default bigfile tablespace;
alter database set default smallfile tablespace;


查看缺省表空间类型:
select * from database_properties;

理论上来说,按照选择数据块的大小,数据文件能达到的最大值不同。当然了,只是理论值,真正能够达到的大小还取决与操作系统的支持
数据块大小    数据文件大小
2k        8t
4k        16t
8k        32t
16k        64t
32k        128t







创建bft语句很简单,只是多了一个bigfile关键字
create bigfile tablespace testb datafile ‘/oracle/testdb/testb.dbf‘ size 1m;


oracle对逻辑结构管理使用的两种技术:针对段的ASSM和针对分区的DMT
段空间管理
手动空间管理:最大问题是因为对free  list的竞争使用带来的性能问题。
9i开始引入了自动空间管理方式:



pctfree所定义的空间是用于更新操作时的记录扩展,而不是用于数据插入。


extent空间管理
oracle对extent使用的管理有两种方式:字典管理(directory managed tablespace,DMT)和本地管理(local managed tablespace,LMT),区别在于oracle是如何记录extents的使用信息的。
字典管理很容易导致大量的递归sql调用及出现竞争问题,性能变差。
本地管理的表空间,是通过在数据文件头中的一个位图来记录本文件中数据块的使用情况,位图中的每个bit代表着一组数据块,当一个extents被分配使用或者释放时,oracle通过改变bit值来反映这些变化,这种变化并没有更改任何数据记录,所以不属于DML操作,不会产生任何undo记录。本地管理基于位图的方法,可以自动跟踪连续的空闲空间,就不再需要进行字典管理中的合并操作了。



本地管理比字典管理有4个优势:
1 不再需要在UET$ FET$两个数据字典上的递归sql调用
2 减少了数据字典的竞争
3 改变位图不会产生undo记录
4 不再需要周期性的合并操作

创建本地管理的表空间,需要使用local关键字,
create tablespace mytbs1 datafile ‘/u01/oracle/data/mytbs01.dbf‘ size 500M extent management local segment space management auto;

10g中,推荐使用ASSM和LMT




参与数据库活动的进程可以分成两大类:用户进程和oracle进程。
oracle进程可以分为:服务进程(也叫做影子进程)和后台进程

用户进程,rman sql*plus exp imp等。这些程序的特点是为用户提供了输入接口,用户可以通过这些程序向oracle数据库发送指令。
用户进程不能直接操作数据库文件、不能访问oracle实例的SGA内存空间。

服务进程,用户进程因为种种原因不能直接操作数据库文件或者SGA内存。因此用户进程必须借助于oracle本地进程完成操作。这类进程的作用就是用户进程的代理,就像是用户进程的影子一样,所以也叫做影子进程。 这类进程和后台进程可以操作数据文件、共享oracle实例的SGA内存空间。




服务进程可以直接操作数据库文件和SGA进程,因此服务进程可以执行以下几种操作。
逻辑读  物理读 直接读 直接写


后台进程
后台进程是伴随着实例的启动而启动的,这些进程的功能是维护数据库系统的稳定运行,并不直接对用户提供服务。
每个后台进程都有一个专门的名称,提供专门的功能。有些后台进程是所有数据库都需要的关键进程,而有些进程是根据数据库使用的功能不同才激活的可选进程。


用户进程  服务进程 后台今晨g
根据服务进程的分配方式,oracle提供了两种方案:专有模式(dedicated mode)和共享模式(shared mode)。
专有模式下,用户进程和服务进程之间是1:1关系
共享模式下,用户的请求通过转发器进程转给一个服务进程,多个用户共享使用预先创建的几个服务进程。


后台进程:
后台进程负责保证数据库的稳定工作,每当数据库启动时,这些后台进程会自动启动,并且持续整个实例的生命周期,每个进程负责一个独特的任务。

DBWR:负责把脏数据写回磁盘
LGWR:负责把日志数据写到联机日志文件
CKPT:负责检查点的操作
PMON:负责维护用户进程
SMON:负责实例恢复
ARCH:负责归档操作,生成归档日志
MMON MMNL:和AWR有关


DBWn进程的显式作用是负责把SGA中被修改的数据同步到磁盘文件中。
每当SGA缓存中的空闲空间变得过小时,DBWR进程就通过把脏数据写到磁盘来释放空间。DBWR进程使用的是LRU(least recently used)算法工作的,也就是根据数据从最后一次被使用以来的时间决定释放哪些数据,越久没有用到的数据越先被清除。
因此DBWn的隐式作用是保证buffer cache中空闲数据块的数量,避免server process从磁盘把数据读入内存时没有空间可用。

DBWn的写时机包括:
检查点,即数据库的检查点操作会触发DBWn进程工作。
如果一个server process在寻找可用空闲数据块时,超过了一定阀值仍然没能找到空闲块,就会触发DBWn进程工作;
每3秒自动唤醒一次。




数据库中最多可以使用20个DBWn进程。数据库初始化参数DB_WRITER_PROCESSES就是用来定义DBWn进程数量。
如果没有定义这个参数,oracle缺省时按照cpu的数量来决定需要的进程个数。每8个cpu分配一个进程。


oracle推荐在增加dbwn进程数量之前,要先考虑使用异步io,有可能异步io就能够解决问题,不需要增加进程数量。


触发LGWR写操作的原因:
用户提交,即用户发出commit指令时会触发LGWR写操作;
每3s定时唤醒;
如果使用的log buffer超过了配置的1/3时触发LGWR的写操作;
log buffer中的日志数量超过1M时,触发LGWR的写操作;
由DBWR进程触发


提前写和快速提交是oracle两个很重要的运行机制,这两个机制保证了事务提交不必等待数据写到磁盘,而之所以采用这种机制,也是平衡性能和可用性的结果。


对于一个繁忙的OLTP系统来说,同时会有大量的事务发生,因此同时会有大量的commit请求,这是LGWR进程就可以把许多的commit请求批量的写入日志文件,而不是针对每个commit请求立即处理,这种机制叫做group commit


检查点进程是数据库检查点机制的一个组成部件。
所谓检查点,代表着数据库的一致性状态。在检查点时刻,数据文件的内容和SGA中的内容完全一致,也就是说在SGA中进行的所有数据修改都被写回到数据文件上,而数据库的一致性状态也正是从这个角度来描述的。


CKPT进程只负责更新控制文件中的检查点记录。


PMON用来监控用户进程的。用户进程可能由各种原因导致异常终止,比如网络故障、用户机器断电等。这时用户进程对应着的服务进程可能还占用着系统资源,如果这些资源不及时释放,就会影响正常用户的工作
pmon进程就负责在发现用户进程异常中止后的清理工作,以确保释放占用的资源。

pmon进程定期被唤醒,其他进程也会在需要时主动唤醒pmon进程。
pmon进程还会负责动态注册功能。pmon进程除了回向监听器注册实例信息,在rac环境中,pmon进程还会向监听器注册负载信息,对于负载均衡非常重要。


实例恢复分成3个阶段:
前滚
打开数据库
回滚




归档模式就是确保数据库所有操作日志都被保留下来,这样能够最大程度的保证数据库的可恢复性。


ARCn进程最多可以有10个。
数据库的初始化参数log_archive_max_processes就是定义数据库启动时运行的arcn的个数。


ASM主要的舞台是在rac环境下,在单实例环境中意义不是很明显。



内存结构
oracle是一个内存消耗大户,它消耗的内存可以分成两部分-进程共享部分和进程专有部分。也就是SGA和PGA


对于不同类型的应用系统,这两个部分的意义也不同。对于OLTP系统,启特征大量的小事务,SGA要比PGA更为重要。
OLAP系统,其特征是大数据量的关联,因此PGA要比SGA对系统的影响更大。因为pga直接决定了大的排序、哈希操作效率



读书笔记