1.1 Oracle结构概述

Oracle体系包括:

1)实例instance( SGA系统全局区 + N多后台进程)

2)数据库(Datafile,  control file, redo log file)

3)用户进程(每个用户连接Oracle数据库,都会启动一个用户进程)

4)系统进程

5)其他文件(参数文件parameter file,  密码文件passwordfile,  归档日志文件Archived log file等)

 

SGA本质,就是一大块内存,根据作用细分为多个PoolCache。被Instance中的多个后台进程共享使用;

用户对database的数据写入和其他操作,都是通过Instance完成

 

参数文件,会保存oracle数据库的一些参数:SGA大小,数据库实例名,支持的最大用户进程数等

密码文件,保存Orace数据库用户的密码信息

Oracle体系概述_其他

 

 

1.2  实例Instance

 

Instance在启动Oracle数据库的时候就会启动,本质上就是   后台进程 +共享内存区(SGA)

 

后台进程中的 SMONPMONCKPTDBWRLGWR必须启动,而ARCH(归档进程)以及其他后台进程可以根据实际情况停止

 

数据库和实例间的对应关系:1个实例,只能对应1个数据库;1个数据库,可以对应多个实例(oracle RAC,主备)

Oracle体系概述_Oracle_02

 

 

1.3  数据库Database(的物理文件构成)

Oracle数据库,也就是我们常说的Database,本质上是由3类物理文件组成

*数据文件data file:      数据的最终存储位置

*控制文件controlfile:    含有维护数据库和验证数据库完整性的信息,二进制文件(10字符串)

*重做日志 redofile:        记录了数据库发生的变更,用于数据库恢复(可以理解成对数据库的操作记录),oracle会先将数据库变更记录redo log buffer cache,  再满足一定条件后(checkpoint产生),将cache中的变更记录写入redofile

 

在启动并打开数据库的过程中,实例会先根据参数文件,找到该数据库的控制文件,然后通过控制文件打开数据文件

意味着:如果数据库的控制文件出现问题,会导致数据库无法打开

 

 

1.4  参数文件和密码文件

 

参数文件和密码文件,虽然不属于Database的组成(不是Database文件),但却是两个必不可少的文件

 

*参数文件:定义了数据库实例Instance的特性。含有SGA内存结构的大小参数,Instance名称等;参数文件是一个文本文件,可以通过文本编辑器进行查看

 

*密码文件:用于授权用户启动、连接、读写数据库。在安装Oracle数据库软件的过程中,会创建SYS等默认用户,这些用户的密码也记录在这里,Orace根据这个文件来判定用户是否有相应的操作权限

 

*归档日志文件:redo log file的脱机备份。数据恢复时,如果数据库启用了归档,就可以使用归档文件来进行数据库恢复

 

 

1.5  数据库连接connection和会话session

 

数据库连接connection, 指的是用户和数据库服务器间的通信;1个连接,可以有多个会话;oracle提供了3种连接方式

1)基于主机的连接(host-based):用户(客户端)和oracle服务端位于同一主机

2Client-Server方式:用户(客户端)和oracle服务端,位于不同主机;客户通过网络连接oracle服务端

3client-应用服务器-数据库服务器:  用户访问应用服务器,由应用服务器来连接oracle服务端。很多应用系统都是这种架构(客户端使用浏览器,后台连接数据库

 

会话Session

会话,指一个明确的数据库连接;一旦用户使用3种连接方式中的一种,和oracle服务端建立好了连接,我们就将这个连接成为一个会话

 

1.6 Oracle数据库内存结构(先有大概概念)

 

共享池

是将解析后的SQL代码结果存放在这里,PL/SQL代码不仅是存放,还能够共享

共享池由两部分组成:库高速缓存 +数据字典高速缓存

 

*库高速缓存:存储了最近使用过的SQLPL/SQL语句,能存放的数量当然是有限的;Oracle通过一种LRUleast recently used)算法

来管理库高速缓存(缓存哪些语句)

 

*数据字典高速缓存:和数据字典相关的一个缓冲区。存储了数据文件datafile、表table、索引index、列colume、用户user、权限信息等。在SQL语句的解析阶段,oracle需要这些信息来进行用户名、用户访问权限的解析。当这些信息被缓存,就能够提高速度

 

重做日志缓冲区

当用户执行了insert,delete, update等操作,导致实际数据发生变化时,变化后的数据在写入数据库高速缓存之前,会先写入到redo log buffer cache, 同时变化前的数据也会写入redo log buffer cache. 这样oracle就知道变化前和变化后的数据,从而得知哪些数据发生了变更,应该如何恢复数据

 

大池(large pool)java池(Java pool)

大池是SGA的一个可选内存区,在共享服务器环境下才会考虑分配大池,用户进程区PGA将会在大池中分配;

在大规模输入输出、备份过程中,也需要大池作为缓存空间

 

java池,也是一个SGA的一个可选内存区;当安装了Java或者使用了java程序,就需要配置java池,用于编译java语言编写的指令

 

流池StreamPool

oracle stream专用的内存缓冲区,streamoralce数据库中的一个数据共享,大小可以通过stream_pool_size来调整

 

进程全局区PGA

服务器进程或者后台进程的专有内存区域,随着进程的启动而进行内存分配,非共享;(每个服务器进程、后台进程会有一段自己专门的内存区,

 


 

1.7 Oracle数据库的后台进程

Oracle体系概述_Oracle_02

 

*SMONSystem Monitor 系统监控进程,主要作用是:数据库实例Instance恢复

OS故障,突然断电,数据库系统重新启动时SMON会尝试恢复Instance(之前在pool中的数据因为没有写入磁盘,都丢失了),有3z主要步骤:

1)将所有写入redo log, 而没有写入datafile的数据(已经提交的操作),写入到datafile

2)打开数据库,方便用户登录查询;此时1)的操作可能还没有完成

3)回滚没有提交的事务(写入了redo log,但没有提交的操作)

 

*PMONProcess Monitor 进程监控,主要作用是:服务器进程的监控和维护(连接异常或进程失败时,进行清理工作)

 

清理工作包括:

1)回滚没有提交的事务

2)释放进程所持有的表或行锁

3)释放进程占用的SGA资源

4)监视其他oracle后台进程,必要的时候进行进程重启

5)向oracle监听器(OracleTNS)注册刚启动的实例。如果TNS已经启动,则传递相应参数;如果TNS没有启动,则定期尝试连接TNS来注册实例

 

*DBWR:数据库写进程

脏数据:用户更改了,但没有提交的数据(数据库高速缓存的数据是已经更改的数据,数据文件中的是原始数据,两者不一致)

脏数据必须在一定的条件下,写入到datafile,这就是DBWR的作用

 

为什么数据要先写入数据库高速缓存,再通过DBWR写入datafile?

主要目的是减少磁盘IO的次数,异步写入,提高写入效率;每次磁盘写入--异步的批量磁盘写入

 

什么时候,DBWR会将脏数据写入到datafile

  1. 发生检查点事件

  2. 脏数据库量,到达门限

  3. 数据库缓冲区没有足够的空间

  4. 表空间处于热备份状态

  5. 表空间被置为离线状态

  6. 表空间被置为只读状态

  7. 删除表或者截断表

  8. 超时

 

 

归档日志进程ARCH

Oracle体系概述_Oracle_04

 

首先,归档日志进程ARCH是一个可选的后台进程,并不是随着Instance的启动而自动启动

其次,ARCH的作用是将数据库文件中的redo log file (写满的),写到归档日志

再次,归档日志用于数据库恢复

 

 

检查点进程 CKPT

 

首先,什么叫检查点CheckPoint

CheckPointOralce数据库的一个内部事件(需要进行数据写入datafile的操作)。当checkpoint出现时,CKPT进程就被唤醒,它来通知DBWR进程将脏数据写入数据文件(这里的脏数据包括提交的和未提交的,有办法可以区分出来),写入完成后,CKPT将此次checkpoint已经完成的信息写入到Controlfile,同时写入到数据文件的文件头head

 

也就是说,controlfile中会记录各个checkpoint的信息,当CKPT被激活时,会先从controlfile中读取上一次的检查点,然后告诉DBWR,将本次checkpoint和上一次checkpoint之间的脏数据全部写入datafile.

 

简单来说,checkpoint可以理解为一个“写入时间点”,controlfile会记录每个“写入时间点”, DBWR负责将本次写入时间点和上一次写入时间点之间的脏数据,写入到datafile