翻出之前的架构图

这次来详细说说中间黄色的方形 -- Instance(实例)。
Instance是访问Database的方式,由内存和后台进程组成。
我们平时所说的数据库启动,数据库down了,实际说的就是Instance。
关于内存部分,Instance中有三个必要的内存结构:DataBuffer、RedoBuffer、SharePool(图中粉色的方形)。三个必要的内存结构在Instance启动后不能失效,否则Instance就down了。除了这三个必要的内存结构,还有JavaPool、LargePool等。
我们把Instance中的内存部分统称为SGA(System Global Area)。
关于后台进程部分,Instance中有五个必要的后台进程:dbwr、lgwr、ckpt、smon、pmon(图中红色的椭圆)。同样五个后台进行在Instance启动后不能停止,否则Instance也将down掉。除了这五个必要的后台进程,还有归档进程等。
眼见为实,说了半天都是概念,能在数据库中看到才算数。
先说SGA,既然是一组内存结构,对我们来说无非就是都有哪些内存结构、以及内存的大小

show sga命令可以简单直观的看到sga的信息:
Total System Global Area:SGA总共有280M
Fixed Size:固定占用2M
Database Buffers:DataBuffer有134M
Redo Buffers:RedoBuffer有6M
Variable Size:除了Fixed、DataBuffer、RedoBuffer以外的内存结构一共138M
sga没有对Variable中的内存结构进行详细说明,如果想看,使用以下语句:

这次能清楚的看到Variable中包含:Shared Pool、Large Pool、Java Pool、Streams Pool等,以及它们对应内存大小。
DataBuffer:数据缓存,用户获取的数据都是从这里读取的。数据从Datafile中读入DataBuffer,如果对DataBuffer中的数据进行了修改(如执行update),则我们将被修改的数据称为“脏块”。
RedoBuffer:Redo缓存,用户的操作都会在这里进行记录,然后通过后台进行写入RedoFile。
SharePool:主要用于存放SQL解析的相关内容,如执行计划等。这也是Oracle最最核心及复杂的地方了。
接着再来看后台进程:

注意到查询语句中:where paddr <> '00','00'代表未启动的进程。
所以查出的结果为当前系统正在运行中的进程。
DBW0、LGWR、CKPT、SMON、PMON为五个必要进程。
对它们的作用进行一下简单说明。
DBW0:作用是不定期将DataBuffer中的脏块写入DataFile。
“不定期”是为了提高读写效率。Oracle会通过其他功能保证数据的一致性。
为什么不叫“DBWR”,而叫“DBW0”
看下面的查询,可以看出DBWR最多可以配置20个,可配置的数量与主机的CPU相关。

LGWR:将RedoBuffer中的缓存写入RedoFile,触发写的条件有很多:每3秒、RedoBuffer缓存达到1/3、有commit操作等等。
一个数据操作执行后,一定会先写Redo。
CKPT:因为Redofile中的数据要快于Datafile中的数据,CKPT触发后,会让DBWR进程将未写入的Datafile的脏块写入Datafile,以保持Datafile与Redofile一致。如果DBWR写入成功(DBWR为不定期写,所以不一定能写成功),则CKPT把Datafile最终写入的时间更新为当前时间。当异常恢复时,系统将从Datafile最终的写入时间开始恢复。
SMON:回收对象释放的相关资源
PMON:回收进程释放的相关资源
以上就是Instance的主要内容了!
说的都是道听来的,眼见的才算数。
翻翻历史,温故知新
开始聊聊恶心的“锁”-- 3.Oracle DML表级锁概念
开始聊聊恶心的“锁”-- 2.Oracle DML行级锁概念
开始聊聊恶心的“锁”-- 1.一个故事了解Oracle有哪些锁




