Oracle Instance
Database
Oracle的体系结构大体上分为两部分:Instance(实例)和Database(数据库)。
我们平时说的Oracle Server(Oracle服务器)就是由 Oracle Instance 和 Oracle Database 组成的,如图2:
Oracle Instance |
SGA包含6 个基本组件:Shared Pool(Library Cache,Data Dictionary Cache)、Database Buffer Cache、Redo Log Buffer、Java Pool、Large Pool、stream pool。
下面将分别介绍这6个基本组件的功能。
1) shared pool(共享池)
共享池是对 SQL、PL/SQL 程序进行语法分析、编译、执行的内存区域。
共享池由 Library Cache(库缓存)、Data Dictionary Cache(数据字典缓存)和 Server Result Cache(结果缓存)等组成。
共享池的大小直接影响数据库的性能。
Shared Pool 的各组成部分有哪些作用呢?
Library Cache: SQL 和 PL/SQL 的解析场所,存放着经过编译解析后的 SQL 和 PL/SQL 语句的内容,以备所有用户共享。
* 下次再执行同样的 SQL 语句的时候,就不需要解析了,立即从 Library Cache 获取执行。
* Library Cache的 SIZE 会决定着编译解析 SQL 语句的频度,从而决定了性能。
* Library Cache中又包含两部分内容:Shared SQL Area 和 Shared PL/SQL Area。
Data Dictionary Cache: 存放重要的数据字典信息,以备数据库使用。
* Data Dictionary 是使用最频繁的,几乎所有的操作都需要到数据字典去查询。为了提高访问 Data Dictionary 的速度,此时需要一个 Cache,需要的时候访问内存即可。
* Data Dictionary Cache 里面的信息包含了 Database Files、Tables、Indexes、Columns、Users、Privileges 和其他的数据库对象。
Server Result Cache: 存放服务器端的 SQL 结果集及 PL/SQL 函数返回值。
看了上面的讲解,或许会觉得有些抽象,下面将通过一个例子进行讲解。
假设在客户端提交一个命令,如下:
SELECT ename,sal FROM emp WHERE empno=7788;
如果数据库是第一次被提交这条语句,则需要进行解析,解析过程分为硬解析和软解析。
Library Cache会把这条 sql 语句和执行计划装入其中。
装入这些东西有什么作用呢?
下次再敲一模一样(标点符号、大小写、空格完全一致)的语句时,就不需要硬解析了。
小问答:
如果此时客户端再提交一条命令:
select ename,sal from emp where empno=7788;
猜测一下,这条语句需要被解析吗?
答案:需要。
小说明:注意哦,语句必须完全一样才不需要解析哦。标点符号、大小写、空格等都要完全一致哦!平时规范书写的好处在这里就体现啦。
前面有说到,若是 select 语句,执行完后还会返回结果集。那结果集存放在哪里呢?
select ename,sal from emp where empno=7788;
该语句执行返回的结果集将存放在 Server Result Cache 中。
2) Database Buffer Cache (数据缓冲区)更多内容
小说明:逻辑读(从内存读)的速度是物理读(从磁盘读)的1万倍呦,所以还是想办法尽量多从内存读哦。
例如用户访问一张表里面的记录时,数据库接收到这个请求后,首先会在 Database Buffer Cache 中查找是否存在该数据库表的记录,如果有所需的记录就直接从内存中读取该记录返回给用户(有效提升了访问的速度),否则只能去磁盘上去读取。
继续看上面的例子:
select ename,sal from emp where empno=7788;
该条语句以及它的执行计划被放在 Library Cache 里,但语句涉及到的数据,会放在 Database Buffer Cache 里。
小问答:
Database Buffer Cache是怎么工作的呢?
这就要说一说 Database Buffer Cache 的设计思想了。
磁盘上存储的是块(block),文件都有文件号,块也有块号。
若要访问磁盘上的块,并不是 CPU 拿到指令后直接访问磁盘,而是先把块读到内存中的 Database Buffer cache 里,生成副本,查询或增删改都是对内存中的副本进行操作。如图 3 所示。
另外,如果是增删改操作,操作后会形成脏块,脏块会在恰当时机再写回磁盘原位置,注意哦,可不是立刻写回呦。
也许你会问,为什么不立刻写回呢?
因为:
(1)减少物理 IO ;
(2)可共享,若后面又有对该块的访问,可直接在内存中进行逻辑读。
小问答:
为什么要通过内存访问数据块,而不是 CPU 直接访问磁盘呢?
答:因为相较于 CPU,IO 的速度实在是太慢了,CPU 的速度是 IO 的100万倍呢?如果 CPU 直接访问磁盘的话,会造成大量的 IO 等待,CPU 的利用率会很低。所以,利用速度相当的内存(CPU 速度约为内存的100倍)做中间缓存,可以有效减少物理 IO,提高 CPU 利用率。
但是,这里会有一个问题。前面说到查询或增删改都是对内存中的副本进行操作,当增删改操作产生脏块时不会立刻写回磁盘。
小问答:
我们设想一下,如果在 Database Buffer Cache 中存放大量未来得及写回磁盘的脏块时,突然出现系统故障(比如断电),导致内存中的数据丢失。而此时磁盘中的块存放的依然是修改前的旧数据,这样岂不是导致前面的修改无效?
要怎样保持事务的一致性呢?
答:如果我们能够保存住提交的记录,在 Database Buffer Cache 中一旦有数据更改,马上写入一个地方记录下来,不就可以保证事务一致性了嘛。
小说明:Instance 在断电时会消失,Instance 在内存中存放的数据将丢失。这就需要 Redo Log Buffer 发挥它的作用啦。
3)Redo Log Buffer (重做日志缓冲区)
5)Java Pool (Java 池)(可选)
6)Stream Pool (流池)(可选)
在正式介绍 Background Process 之前,先简单介绍 Oracle 的 Process 类型。
Oracle Process 有三种类型:
User Process
* 属于客户端的 Process,客户端要与服务器连接,在客户端启动起来的进程就是 User Process ;
* 一般分为三种形式(sql*plus, 应用程序,web 方式(OEM));
* User Process 不能直接访问Oracle 。
Server Process
* 属于服务器端 Process,用于接应User Process 发出的请求;
* 给用户分配 PGA(程序全局区)。
background process
Oracle Instance的重要组成部分。下文会对其做详细讲解。
【User Process 不能直接访问 Oracle,必须通过相应的 Server Process 访问实例,进而访问数据库。】
小补充:
Connection & Session
Connection是指一个Oracle的客户端和后台的进程(Server Process)建立的TCP连接。如图 5 所示:
Connection 建立过程可简单描述如下:
1.首先建立 TCP 连接,Oracle 对用户的身份进行认证、进行安全审计等等;
2.当这些都通过后, Oracle 的 Server Process 才会允许客户端使用Oracle提供的服务;
3.当 Oracle 的连接建立起来以后,就意味着开始了一个 Session (会话),当连接断开的时候这个会话就消失了。
【用户登录到 Oracle Server 就是 User Process 和 Server Process 建立Connection。】
Session 是和 Connection 相辅相成的。Session信息会存储在 Oracle 的 Data Dictionary 中。
可通过图 6 直观看出 Connection 和 Session 的区别。
Background Process(后台进程)主要包括:PMON(进程监控器进程)、SMON(系统监控器进程 )、DBWR( 数据库写入程序进程)、LGWR(日志写入程序进程)、CKPT(检查点进程)。
1)PMON(Process Monitor)
PMON的主要作用如下:
2)SMON(System Monitor)
SMON的主要作用如下:
3)DBWR(Database Writer)
DBWn是Oracle中工作最繁重的进程。主要作用如下:
小说明:
如果数据库的负荷比较大,来自于客户端的请求比较多,存在大量的IO操作,需要频繁的将缓冲区的内容写到磁盘文件上,那么这时就可以配置多个DBWn(Oracle一共支持20个DBWn,DBW0-DBW9,DBWa-DBWg)。通常一个中小型的Oracle只需要一个DBW0 Process就可以了。
注意:以下几种情况发生时,都会触发DBWR Process将 Database Buffer Cache 的内容写到Data Files :
小补充:
服务器进程对数据文件执行读操作,而 DBWR 负责对数据文件执行写操作。
小问答:
Commit 时 DBWR 有何动作?
答:什么也不做!
4)LGWR(LOG Writer)
Oracle Instance中只有一个LGWR Process,这个Process的工作和DBWR Process类似。主要作用如下:
注意:以下几种情况发生时,都会触发LGWR Process将 Redo Log Buffer 中的内容写到 Redo Log Files :
怎么保证提交的事务永久保留呢?
答:以执行update操作为例 。
1. 当执行提交语句的时候,修改已经写到 Redo Log Buffer 里了;
2. 当看到返回提交成功时,说明修改已经写到磁盘 Redo Logfile 里了;
3. 所以提交成功后,改动已经同步到磁盘了,不会丢了。
5)CKPT(Checkpoint)
CKPT的主要作用如下:
6)ARCn(Archiver)
ARCn的主要作用如下:
当Oracle运行在归档模式时
通过上面的学习,现把图 1 更新如下:
Database |
Database 其实就是由一堆物理文件组成的,主要是用于存储数据,Database 中主要包含三种类型的文件:Data Files、Control Files、Redo Log Files。
另外还有Parameter File、Password File、Achieved Log Files等。
1)Data Files(数据文件)
2)Control Files(控制文件)
3)Redo Log Files(重做日志文件)
4)Parameter File(参数文件)更多内容
5)Archived Log Files(归档日志文件)
6)Password File(密码文件)
小问答:
Instance 和 Database 的对应关系是怎样的呢?
答:Instance :Database = n :1
1个 Instance 只能属于1个数据库,可以多个 Instance 同时访问1个数据库。
小补充:
Oracle 的内存结构(Memory Structure)
Oracle 的 Memory Structure 实际上包含两部分内容:SGA和PGA
SGA(System Global Area系统全局区)
PGA(Program Global Area程序全局区)
用户与 Oracle 服务器的连接方式
专用连接模式(Dedicated Server Process)
共享连接模式(shared server process)
驻留连接池模式(Database Resident Connection Pooling,简称 DRCP)