oracle server+oracle instance+oracle database

来源:互联网 发布:qq无限加人软件 编辑:程序博客网 时间:2024/05/19 13:09


oracle server 

一个Oracle Server由一个Oracle实例和一个Oracle数据库组成。

oracle server(数据库服务器)=oracle instance(实例)+oracle database(数据库)

oracle instance

Oracle实例包括了内存结构(SGA)和一系列后台进程(Background Process),两者合起来称为一个Oracle实例。

oracle instance=SGA+Background Process

oracle instance=memory+Background Process

SGA(system/shared global area)

SGA= buffer cache(数据缓冲区)+redo log buffer(重做日志缓冲区)+ shared pool(共享池)+ Large Pool(大池)+Java Pool(Java 池)+ Streams Pool(流池)

buffer cache:保存了最近使用过的数据块。这些数据块可能是修改过但尚未写回磁盘的数据(脏数据块)、未修改过的数据、修改后已经写回的数据块(干净数据块)。因为buffer cache在保存数据块时使用了最近最多使用(most-recently-used)算法,因此最活跃的数据块可以驻留在内存中,从而减少I/O,提高性能。

redo log buffer:保存着数据库的redo entry(重做条目)或修改日志。redo log buffer的内容总是会尽快地写入redo.log(重做日志,用于系统故障时恢复实例)。

shared pool:SGA中存储共享内存结构的区域,如library cache中的SQL区以及数据字典中的内部信息等。shared pool由library cache(库缓存)和数据字典缓存组成。

library cache(库缓存):存储共享的SQL语句,其中包括缓存的解析数(parse tree)和不同SQL语句的执行计划。

数据字典缓存:数据字典包含一组表和视图,oracle将它们作为数据库的引用,在其中存储了与数据库的逻辑和物理结构有关的信息。数据字典包括如下信息:用户信息(如用户权限等)、为数据库表定义的完整性约束、数据库表中所有列的名称及数据类型、为模式对象分配空间及其使用情况的信息。

large pool:一种可选的存储区,能够代替shared pool的某些功能。large pool可用于I/O操作、备份与还原、共享服务器进程、XA接口使用的内存,以及并发查询中的并发消息队列使用的内存。

java pool:一块可选内存区,存储所有会话中特定java代码和JVM中数据。

streams pool:增加对流的支持,是一块可选内存区。

Shared Pool和Buffer Cache是否越大越好?  

Shared pool并非越大越好,太大的Shared pool,oracle为了维护共享结构,将付出更大的管理开销,反而对数据库系统的性能维护不利。

在SGA和物理RAM保持合适比例的情况下,通常buffer_cache设置的越大越好。推荐配置:DB_CACHE_SIZE= SGA_MAX_SIZE/2~SGA_MAX_SIZE*2/3

#buffer cache的大小就等于db_block_buffers * db_block_size(默认8K)。在9i以后,Oracle引入了一个新参数:db_cache_size。这个参数可以直接指定BufferCache的大小,而不需要通过上面的方式计算出。注意:db_cache_size和db_block_buffers是不能同时设置的,否则实例启动时会报错。

后台进程(background process)

DBWR:将脏数据从database block buffer(数据库块缓存)写入磁盘。DBWR采取有效率的写回方式,不用在事务完成之后立即写回,通常它会定时写回数据。

LGWR:负责将redo log buffer(日志缓冲区)中的数据写入重做日志。

PMON:负责监视数据库的处理情况,并负责清楚死掉的进程(PMON清除该进程的缓存,并释放分配给该进程的资源)。PMON还负责重启失败的调度进程(dispatcher process)。

SMON:负责在实例启动时恢复实例,包括清除临时段以及恢复因系统崩溃而中断的事务。SMON还可以通过合并空闲区间的方式清除数据库中的碎片。

CKPT:负责性DBWR发送信号,要求执行一次检查点,并更新数据库的所有数据和控制文件。所谓检查点,是由DBWR进程将所有修改过的数据缓冲区写回数据文件。CKPT是可选的,如果没有该进程,可以有LGWR代行这些职责。

用户执行了一条update操作后commit。简述此过程中,oracle后台进程(包括DBWR、LGWR、CKPT等)。

1.执行update操作:首先serverprocess把这个update记录到redo log buffer,然后把表需要的数据读入到buffer cache并进行修改。

2.执行commit:

为事务生成一个SCN。

LGWR将所有余下的缓存重做日志条目写到磁盘,并把SCN记录到在线重做日志文件中。(LGWR进程看到commit,就把redo log buffer里面的信息写入到磁盘的redo log。注意现在的状态是redo的数据已经写入磁盘,但是Dirty data block还在buffer cache里。)

DBWn进程在适当的时机将修改过的数据块写入磁盘。

Oracle释放加于表或数据行上的锁(lock)。

Oracle将事务标记为完成。

oracle database

oracle database有物理结构和逻辑结构。

Oracle database的物理结构可以分为datafile,OS块。

Oracle database的逻辑结构可以分为Tablespace>Segment>Extent>block。



数据文件:

一个数据文件只能属于一个表空间。数据文件创建大小后可以改变大小。创建新的表空间需要创建新的数据文件。数据文件一旦加入到表空间,就不能从表空间移走,也不能和其他表空间发生联系。

表空间(tablespace):

表空间是数据库中的基本逻辑结构,一系列数据文件的集合。一个表空间可以包含多个数据文件,但是一个数据文件只能属于一个表空间。数据文件大小决定了表空间的大小。

段(Segment):

段是对象在数据库中占用的空间,虽然段和数据库对象是一一对应的,但段是从数据库存储的角度来看的。一个段只能属于一个表空间,当然一个表空间可以有多个段。

表空间和数据文件是物理存储上的一对多的关系,表空间和段是逻辑存储上的一对多的关系,段不直接和数据文件发生关系。

区间(Extent):

在一个段中可以存在多个区间,区间是为数据一次性预留的一个较大的存储空间,直到那个区间被用满,数据库会继续申请一个新的预留存储空间,即新的区间,一直到段的最大区间数(Max Extent)或没有可用的磁盘空间可以申请。

Oracle数据块(Block):

ORACLE最基本的存储单位,他是OS数据块的整数倍。ORACLE的操作都是以块为基本单位,一个区间可以包含多个块(如果区间大小不是块大小的整数倍,ORACLE实际也扩展到块的整数倍)。