目录
一、Oracle DB 服务器体系结构(实例 + 数据库)
1.2.数据库实例
1.2.1.Oracle数据库的内存结构
程序全局区(PGA)
系统全局区(SGA)
1.2.2.Oracle数据库的进程结构
1)进程监视器(PMON)
2)系统监视器(SMON)
3)锁进程(LCKn)
4)恢复进程(RECO)
5)数据库写入进程(DBWR)
6)检查点进程(CKPT)
7)日志写入进程(LGWR)
8)归档进程(ARCH)
二、为什么Oracle中不直接舍去实例这个结构,而直接操作数据库?
2.1.多对一关系(关键原因)
2.2.生命周期
2.3.资源隔离
一、Oracle DB 服务器体系结构(实例 + 数据库)
数据库是被视为单元的数据集合,用于存储和检索相关信息。
Oracle数据库服务器体系结构概览图:
基本的 Oracle DB 系统由实例(逻辑)和数据库(物理)组成。其中包含以下三种主要结构:内存结构、进程结构和存储结构。
数据库包括物理结构和逻辑结构。由于物理结构和逻辑结构是分开的,因此管理数据的物理存储时不会影响对逻辑存储结构的访问。
1.2.数据库实例
实例:实例是基于数据库物理层之上的又一个逻辑结构,由与该实例关联的内存结构和后台进程构成。
实例由与该实例关联的内存结构和后台进程构成。每当启动一个实例时,都会分配一个称为系统全局区(SGA)的共享内存区,并启动后台进程。进程是在计算机的内存中运行的作业。进程被定义为操作系统中可运行一系列步骤的“控制线程”或机制。
1、启动数据库实例后(nomount过程);
2、Oracle 软件将该实例与特定数据库相关联。该操作称为“装载数据库”(mount过程);
3、打开数据库,授权用户可以对其进行访问(open过程)。
注意:Oracle 自动存储管理(ASM)在管理内存和进程组件时使用实例概念,不与特定数据库关联。
每个数据库实例都与一个且只与一个数据库关联。如果同一服务器上有多个数据库,那么每个数据库会有一个单独的数据库实例。数据库实例不能共享。Oracle Real Applications Cluster (RAC)数据库通常在几个独立服务器上运行共享同一数据库的多个实例(1对n)。在此模式下,每个 RAC实例都与同一数据库相关联(1对1),从而满足了最多只能有一个数据库与一个实例关联的要求。
1.2.1.Oracle数据库的内存结构
Oracle DB 创建并使用内存结构来满足多种需要。例如,使用内存来存储正在运行的程序代码、在各用户之间共享的数据以及所连接的每个用户的专用数据区域。一个实例有两个关联的基本内存结构:
程序全局区(PGA)
PGA(Progress Global Area)
1)包含某个服务器进程或后台进程的数据及控制信息的内存区域。PGA 是 Oracle DB 在服务器进程或后台进程启动时创建的非共享内存。服务器进程对PGA的访问是独占式的。每个服务器进程和后台进程都具有自己的PGA。
2)PGA不是共享内存,是私有不共享的,S可以理解为共享(share)的首字母。用户对数据库的发起的无论是查询,还是更新这类的任何操作,都需要先在PGA进行预处理,然后才能进入实例区域,再由SGA和后台进程共同完成剩余步骤。
PGA的具体作用:
1)保存用户的连接信息,如会话属性、绑定变量等;
2)保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存再这个会话区内;
3)当发起的指令需要排序的时候,PGA正是这个排序区,如果在内存区内完车呢个,如果放不下,超出的部分就在临时表空间中完成排序,也就是在磁盘中完成排序。
系统全局区(SGA)
SGA(System Global Area):
1)是一组共享的内存结构(称为SGA组件),其中包含一个OracleDB 实例的数据和控制信息。SGA面向所有服务器进程和后台进程共享。SGA中存储的数据有高速缓存的数据块和共享 SOL 区域等。
2)其中SGA主要被划分为共享池、数据缓存区(db(shared pool )cache)和日志缓存区(log buffer)三类。
1.2.2.Oracle数据库的进程结构
后台8大劳模进程包括PMON、SMON、DBWR、LGWR、CKPT、ARCH、LCKn、RECO等系列进程。
1)进程监视器(PMON)
PMON(Process Monitor):
如果你在执行某些更新语句,未提交时进程崩溃了,这时候PMON会自动回滚该操作,无需人工去执行ROLLBACK命令。除此之外它还可以干预后台进程,比如RECO出现异常失败时,此时PMON会重启RECO进程,如果遇到LGWR进程失败这样严重问题,PMON会做出中止实例这个激烈的动作,用于防止数据错乱。
2)系统监视器(SMON)
SMON(System Monitor):
与PMON不同的是,SMON关注的是系统级的操作而非单个进程,工作重点是在于实例恢复,除此之外还有清理临时表空间、清理回滚段表空间、合并空闲空间等功能。
3)锁进程(LCKn)
LCKn(LOCK number):
仅用于RAC数据库,最多可有10个进程(LCK0,LCK1,.....LCK9),用于实例间的封锁。
4)恢复进程(RECO)
RECO(Distributed Database Recovery):
用于分布式数据库的恢复,适用于两阶段提供的应用场景。比如:我们面临将索格数据库A、B、C,某个应用跨越三个数据库,在发起的过程中需要A、B、C库都提供成功,事务才会成功,只要有一个失败,就必须全部回滚。
5)数据库写入进程(DBWR)
DBWR(Database Writer):
完成将更新的数据从内存中刷入磁盘。是Oracle中最核心的进程之一,负责把数据从数据缓存区写入到磁盘里,该进程和CKPT相辅相成,因为CKPT促成DBWR去写的,不过DBWR也和LGWR密切相关,因为DBWR想将数据缓存区中的数据写入到磁盘的时候,必须通知LGWR先完成日志缓存区写到磁盘的动作后,方可开工
6)检查点进程(CKPT)
CKPT(Check Point):
该进程是用来判断什么时候将数据缓存区中的数据写到磁盘,当满足CKPT的触发条件后,CKPT会触发DBWR进程将数据缓存区所修改的内容落盘。
7)日志写入进程(LGWR)
LGWR(Log Writer):为保证顺序,只能单进程,评为最佳劳模
日志缓存区保存了数据库相关操作的日志,记录了这个动作,然后由LGWR后台进程将其从日志缓存区这个内存区写进磁盘的日志文件(REDO)里。它的目的很简单,即便于将来出现异常情况时,可以根据日志文件中记录的动作,再继续执行一便,从而保护数据的安全。
执行触发条件:
一、每隔三秒,LGWR运行一次。
二、任何COMMIT触发LGWR运行一次。
三、DBWR要把数据从数据缓存写到磁盘,触发LGWR运行一次。
四、日志缓存区满三分之一或记录满1MB,触发LGWR运行一次。
五、联机日志文件切换也将触发LGWR.
8)归档进程(ARCH)
ARCH(Archive):
该程序用做当日志文件被重写前,需将即将被重写的日志文件备份转移到新的存储介质中的程序。
二、为什么Oracle中不直接舍去实例这个结构,而直接操作数据库?
Oracle中的实例(Instance)和数据库(Database)分离是其架构的核心设计特色(解耦合)。
数据库(database):
数据库是物理存在的
物理文件 = 数据文件 + 控制文件 + 重做日志文件
↓
永久存储
实例(Instance)
实例是运行时的
实例 = 内存结构(SGA) + 后台进程
↓
临时存在(可启动/关闭)
在了解了两者之间的区别后,就能看出有了实例具有以下优势:
2.1.多对一关系(关键原因)
一个数据库可以被多个实例访问(RAC环境-Cache Fusion(缓存融合)技术解决读写、写写之间的冲突)
数据库(共享存储)
↑
实例1 实例2 实例3 ← 不同服务器上的实例
(节点A)(节点B)(节点C)
2.2.生命周期
数据库:永久存在(除非删除文件)
物理文件 → 持续存在
# 实例:临时存在
SQL> STARTUP # 创建实例
SQL> SHUTDOWN # 销毁实例
# 实例可以频繁启停,数据库保持不变
2.3.资源隔离
不同实例可以配置不同的内存参数
实例A:SGA_SIZE=8G, PGA_AGGREGATE_TARGET=2G
实例B:SGA_SIZE=16G, PGA_AGGREGATE_TARGET=4G
但访问同一个数据库的数据文件
两者都访问:/oradata/orcl/users01.dbf