|
一、
|
Oracle服务器的构成
Oracle
服务器是一个具有高性能和高可靠性面向对象关系型数据库管理系统,也是一 个高效的 SQL 语句执行环境。
Oracle
服务器具备以下的特点:
●
能够可靠的进行多用户环境下大量数据的处理,允许多用户同时访问相同的数据。
● 保证数据访问的高性能。
● 有效防止对数据的非法访问。
●
对于故障恢复提供高效的解决方案。
|
|
(一)、
|
Oracle服务器的总体结构
Oracle
服务器同运行在操作系统下的很多程序一样,通过在后台运行一组可执行程序、 在内存中开辟程序运行的存储区域并在磁盘上存储数据来进行运作。
如图 1
所示,在结构上,Oracle 服务器(Oracle Server)由实例(Instance)和数
据库(Database)两大部分构成。实例是一组内存结构和 Oracle 后台进程的集合;数据库 在物理上由多个操作系统文件组成, 其中主要包括数据文件、控制文件和重做日志文件。
Oracle 服务器=实例+数据库。
|
|
(二)、
|
Oracle实例
如下图 所示,Oracle
实例由内存结构(SGA)和 Oracle 后台进程组成的。 当用户启动(start)实例时,Oracle 将自动地为 SGA
分配内存并启动后台进程,实例运行后,用户可以访问实例,由实例来访问数据库。实例相当于用户和数据库的中间层。 当用户关闭(shut
down)实例时,由操作系统负责回收内存。每个实例都有自己的 SGA,并且,每个实例同时只能访问一个数据库。
Oracle 数据库实例(Instance) = 内存结构(SGA)
+ 后台进程(Background Process)。
内存结构描述的是 Oracle
数据库对内存的使用构成。Oracle 内存结构被总称为 SGA (System GlobalArea),主要包括数据库高速缓冲区(Database Buffer Cache)、重做日
志缓冲区(Redo Log Buffer)和共享池(Shared Pool)三个部分。
Oracle 后台进程主要包括 DBWn、CKPT、LGWR、SMON、PMON、ARCn 和
RECO。
|
|
(三)、
|
Oracle数据库
如下图 所示,Oracle 数据库包含了用于存放数据的数据文件(DataFiles),用于保护 数据不丢失的联机重做日志文件(Online Redolog
Files)和用于连接 Oracle 实例和数据库 所需要的控制文件(Control
Files)。
Oracle 数据库 = 数据文件 + 控制文件 +
联机重做日志文件。
除了以上三种文件之外,Oracle
还包含了参数文件(Parameter File)、口令文件 (Password File)、归档日志文件(Archived log
Files)、以及跟踪文件(Trace File)和警 告文件(Alert Log File)等非数据库文件。
控制文件:记录了数据库的各项信息,是连接
Oracle 实例和 Oracle 数据库的桥梁。 每个 Oracle 数据库包含 1-8 个控制文件。
联机重做日志文件:记录了用户对数据的各项操作,用于保护数据不丢失。
以日志组的形式存在。每个 Oracle 数据库至少包含两个日志组。
数据文件:用于存放数据。
参数文件:记录了 Oracle 实例的各项信息。分为动态和静态初始化参数文件。
口令文件:存放特定用户的口令。
归档日志文件:相当于联机重做日志文件的备份,用于保护数据不丢失。
追踪文件:存放后台进程和服务器进程的跟踪信息。
警告文件:警告文件由连续的消息和错误组成。
可以查看到 Oracle 内部错误、块损坏错误以及非默认的初始化参数值等。
|
|
二、
|
Oracle内存结构
Oracle
的内存由系统全局区(System Global Area,简称 SGA)和程序全局区 (Program GlobalArea,简称 PGA)组成。
|
|
(一)、
|
系统全局区SGA
系统全局区(system global area,SGA)是一组包含了 Oracle 数据库数据及实例控制信息的共享的内存结构。
当多个用户并发地连接到同一个实例后,这些用户将共享此实例
SGA 中的数据。因此 SGA 也被称为共享全局区(shared global area)。
SGA 越大系统的性能越好,但
SGA 过大也会起到反作用。
1.SGA 的构成 如下图 所示,SGA
包括三个子缓冲区:保留缓冲区、循环缓冲区和非标准大小块缓 冲区。
SGA 包括以下结构:
● 数据高速缓冲区(Data
Buffer Cache)
● 重做日志缓冲区(Redo
Log Buffer)
● 共享池(Shared
Pool)
● Java 池(Java
Pool)
● 大池(Large Pool)
● 流池(Stream
Pool)
|
|
1
|
数据库高速缓冲区(DatabaseBuffer Cache)
在 Oracle
中无论是读取还是修改数据,都是由服务器进程在数据库高速缓冲区中完成的。数据库高速缓冲区的作用就是用来缓存最近从数据库中读出的数据块,并可供其他客户进程共享。用户进程查看数据时,首先检查需要的信息是否在缓冲区内,如果在缓冲区中,就可以直接访问,否则访问物理文件并读取数据块到数据库缓冲区。
1) 数据库高速缓冲区的子缓冲区
根据缓冲数据块的状态,Oracle
将数据高速缓冲区可划分成:
● 脏缓冲区(Dirty Buffer):
当数据库发生 DML(Insert、Update、Delete)操作时,会对缓冲区内容进行修改,这样缓冲区的内容就会和相对应的数据文件不一致,这时,缓冲区标识为“脏缓冲区”。
● 自由缓冲区(Free Buffer):
当“脏缓冲区”的内容被写入数据文件后,因为该缓冲区与相应数据文件部分内容一致,所以将这些缓冲区称为“自由缓冲区”。
当执行 SELECT
语句时,会将对应数据文件部分数据读取到数据高速缓存的相应缓冲区,因为缓冲区与数据块内容完全一致,所以这些缓冲区也被称为“自由缓冲区”。
● 忙缓冲区(Pinned Buffer):
“忙缓冲区”是指服务器进程正在访问的缓冲区。每个数据库的数据库高速缓冲区大小有限,所以一般不会把磁盘上的所有数据都可以存放在缓冲区中。
为了防止数据库高速缓冲区空间不够用,Oracle 会将脏缓冲区中的数据写入对应的数据文件中,以腾出空间给新的数据。
如果缓冲区不脏,即为“自由缓冲区”,它可以直接被读入新的数据块。)随后访问被写入磁盘导致额外的高速缓存未命中的数据。
“脏列表”的作用就是记录脏缓冲区的情况。如果某些缓冲区中的数据块被修改,就会加入该列表,只有脏列表中的缓冲区数据块需要写回数据库文件,一旦写回数据库文件,缓冲区就会从脏列表中清除。
|
|
2
|
重做日志缓冲区(Redo Log Buffer)
当运行 Oracle
服务器的时候,如果突然断电或系统瘫痪,会不会造成数据的丢失? Oracle 提供了一套复杂的机制来维护数据完整性,并最终确保数据不会丢失。这就是重做
日志文件的作用。
重做日志缓冲区用来记录对数据缓冲区数据进行的修改,可以循环使用。当用户运行
DML(INSERT、UPDATE、DELETE)以及
DDL(CREATE、ALTER、DROP)语句时,会改变数据高速缓存中的相应缓冲区。但是在修改这些缓冲区之前,Oracle 会自动生成重做项,
首先要将这些缓冲区的变化记载到“重做日志缓冲区”中。重做日志缓冲区由一条一条的重做项构成,每条重做项记载了修改的时间、被修改的块、修改位置以及新数据。缓冲区被循环使用,当重做日志缓冲区填满时,数据库系统将重做日志缓冲区的内容写入日志文件。在系统发生故障时,可以通过重做项重新执行对数据库的修改,实现对实例的恢复。
重做日志缓冲区的大小由LOG_BUFFER
初始化参数来决定。
|
|
3
|
共享池(Shared Pool)
SGA
的共享池(Shared Pool)内包含了库缓存(Library Cache),数据字典缓冲区 (Dictionary Cache)。
共享存储区的大小由
SHARED_POOL_SIZE 初始化参数来决定。同数据高速缓冲区一 样,它的大小可以动态的修改。
如下图所示,共享池由库高速缓存和数据字典缓冲区组成。
|
|
1)
|
数据字典缓冲区数据字典是一系列保存了数据库参考信息(例如数据库结构,数据库用户等)的表和视
图。
Oracle
需要频繁地使用经过解析的 SQL 语句访问数据字典。
数据字典信息对 Oracle
能否正常运行至关重要。
数据字典是用来描述数据库数据的组织方式的,由表视和图组成。
|
|
2)
|
会话内存(SessionMemory)
会话内存是为会话变量和会话有关信息分配的内存。对共享服务器模式,会话内存也是
共享的。
|
|
三、
|
后台进程结构
为了实现为多用户提供服务且保证系统性能,在一个多进程
Oracle 系统(multiprocess Oraclesystem)中,存在多个被称为后台进程(backgroundprocess)的
Oracle 进程。 一个 Oracle 实例中可以包含多种后台进程,这些进程不一定全部出现在实例中。系统中运行的后台进程数量众多,用户可以通过
V$BGPROCESS 视图查询关于后台进程的信息。这里给大家简单介绍一些经常用到的数据库后台进程:
● 系统监控进程(SMON),主要任务是实例启动时执行恢复性工作,对有故障数据库实例进行恢复。
● 进程监控进程(PMON),主要任务用于恢复失败的用户进程。
● 数据库写入进程(DBWn),将修改后的数据块内容写回数据文件。
● 日志写入进程(LGWR),将内存中的日志内容写入日志文件。
● 检查点进程(CKPT),启动检查点,用于减少数据库实例恢复所需要的时间。
● 归档进程(ARCn),当数据库服务器以归档方式运行时调用该进程完成日志归档。
● 恢复进程(RECO),用于分布式数据库中的失败处理。
● 锁进程(LCKn),在并行服务器模式下确保数据的一致性。
● 调度进程(Dnnn),负责把用户进程分配到可用的服务进程进行处理。
|
|
1
|
LGWR 日志写入进程(LogWriter)
LGWR日志写入进程负责将重做日志缓冲区的日志条目写入磁盘上的联机日志文件。
当运行 DML 或 DDL
语句时,服务器进程首先要将事务的变化记载到重做日志缓冲区,然后才会写入数据高速缓冲区,并且重做日志缓冲区的内容将会被写入联机重做日志文件,以避免系统出现意外带来的数据损失(如果操作系统断电,内存中的重做日志缓冲区的内容会丢失,而存在磁盘上的联机日志文件则不会丢失),这项任务由
LGWR 来完成。 重做日志缓冲区是一个循环结构,LGWR 将重做日志缓冲区中的重做记录写入联机重 做日志文件后,相应的缓冲区内容将被清空,保证
Oracle 有空闲的重做日志缓冲区可以写入。
在出现以下情况时 LGWR
会开始工作:
● 在 DWBR
进程将脏缓冲区写入数据文件之前。 //预写协议
●
在重做日志记录达到缓冲区的三分之一。
● 日志缓冲区记录的日志多于
1M。
● 每隔 3 秒钟。
//重做日志缓冲区是循环使用的,要腾出足够的空间给新的记录使用
● 提交事务(执行
Commit)。 //提交事务相当于确定保存修改,不存入日志文件就有丢失的可能 Oracle
总是先记载数据变化到重做日志缓冲区,然后才修改数据高速缓存。
与之类似, 在后台进程 DBWn
将脏缓冲区写入到数据文件之前,首先要由后台进程 LGWR
将重做日志缓冲区写入到重做日志中。与数据高速缓存相比,重做日志缓冲区相对要小得多,但写入频率高的多,Oracle
必须要确保重做日志缓冲区总有足够的空间容纳新事务,因此每隔 3 秒 钟或重做日志缓冲区已有三分之一填满时 LGWR 会自动工作。 另外,Oracle
采用了快速提交机制,当执行 COMMIT
操作时,并不是将“脏缓冲区”数据写入到数据文件中,而是将重做日志缓冲区的内容写入到重做日志文件中,以确保数据库完整性。此时即使系统出现意外情况(如掉电、系统崩溃等),因为被提交事务已经记载到了存放在磁盘上的联机重做日志文件中,将来在重新启动数据库时系统会自动进行实例恢复,并将事务所修改数据写入到数据文件中,从而避免了数据丢失。
|
|
2
|
DBWn 数据库写入进程(DatabaseWriter)
数据库写入进程负责将数据库高速缓冲区(脏缓冲区)的内容写入到数据文件。
尽管有一个数据库写进程(
DBW0 )适用于大多数系统,但数据库管理员可以配置额 外的进程(DBW0-DBW9,最多 10 个进程),以提高写入性能,通过设置初始化参数
DB_WRITER_PROCESSES 来完成。如果你的系统修改数据严重,这些额外的 DBWn 进程在单处理器系统不是非常有用。
当数据库高速缓冲区的块被修改,它被标记为脏缓冲区并添加到以
SCN(System ChangeNumber,系统更改号,这里可以看做“时间”)为顺序LRUW(LRUWriter)列表。
在出现以下情况时 DBWn
进程会开始工作:
● 系统发出检查点指令。
//同步数据,详见检查点进程(CKPT)。
● 脏缓冲区个数达到指定阀值。
●
服务进程搜索一定数目的数据块后,不能找到自由缓冲区。
● 数据写入计时时间到。
//客户端执行 SELECT\INSERT\UPDATE\DELETE
语句时,都需要访问数据库高速缓冲区。如果是第一次访问,必须要将数据由数据文件读取到数据库高速缓冲区,所 以 Oracle
必须要确保数据高速缓存总是存在足够的“自由缓冲区”以容纳新数据。 当 DBWn 进程将脏缓冲区的数据块写入到数据文件后,Oracle
将把“脏缓冲区”标记为“自由缓冲区”。 因此,为了保证有足够“自由缓冲区”来存放新的数据块,需要 DBWn 进程工作。
● 表空间脱机或进入只读状态。
● 执行删除或截断表操作。
● 执行
ALTERTABLESPACE … BEGIN BACKUP 命令
|
|
3
|
CKPT 检查点进程(Checkpoint) CKPT 检查点进程的作用是执行一个“检查点”,同步数据库的所有数据文件、控制文 件和重做日志文件。当执行检查点时,系统促使 DBWn
将数据缓冲区中数据的变化写入数据文件,同时完成对数据文件和控制文件的更新,记录下当前数据库的结构和状态。在执行一个检查点之后,数据库处于一个完整状态。在数据库发生崩溃后,可以将数据库恢复到上一个检查点。
Oracle 数据库在执行涉及数据变化的语句时,会针对任何修改生成一个顺序递增 SCN (System Change Number)值,并且会将
SCN 值连同事务的变化一起记载到重做日志缓 冲区。在数据文件、控制文件头部以及重做日志文件中都记载有该值。Oracle 通过比较各 种文件的 SCN
值,确定文件是否损坏、系统是否异常,最终确定系统是需要进行实例恢复 还是介质恢复。在发出检查点时,数据文件、控制文件和重做日志的 SCN 值完全一致。
进程 CKPT
在以下情况下会开始工作:
● 发生日志切换。
●
关闭实例(SHUTDOWNABORT 除外)。
● 手工执行检查点操作。
● 由初始化参数
LOG_CHECKPOINT_INTERVAL 和 LOG_CHECKPOINT_TIMEOUT 强制发出。
|
|
4
|
SMON 系统监控进程(System Monitor)
SMON 系统监控进程主要作用是强制对数据库进行恢复操作。在实例启动时,如果上
一次数据库是非正常关闭,并且重做日志文件和控制文件的 SCN 值是不同的,Oracle
将自动在重新打开数据库之前,通过执行重做日志文件的记录,来同步所有数据文件、控制文件和重做日志文件,确保所有数据库文件的一致性,然后才打开数据库。
如果检查点进程一例中,第四步完成后发生系统掉电、崩溃,那么数据会不会丢失呢?
当然不会。我们知道,系统掉电,导致内存中的数据(数据库高速缓冲区)的数据丢失。那么自然上例中的第五步无法完成(无法从数据库高速缓冲区写入数据文件),但是由于此时已写入联机日志文件。因此,此时数据将从联机日志文件中更新,而更新的数据量是多少,自然就是由
SCN 决定。 这一过程我们成为“实例恢复”。该过程不需要数据库管理员手工干预,由 SMON 进程自动完成。
该进程还负责在启动实例时清理临时段和合并区(Extent)碎片等工作。所以
SMON进程的工作归纳如下:
● 进行实例恢复
● 合并数据文件的自由空间
● 释放数据文件的临时段
|
|
5
|
PMON 进程监控进程(ProcessMonitor)
PMON 进程监控进程负责对失败的用户进程或服务进程进行恢复。当用户进程连接到
Oracle 服务器时,Oracle 将在服务器端分配相应的服务进程。这时由 PMON进程来监视用 户进程的执行情况。当由于种种原因,用户对
Oracle 数据库的连接,发生崩溃、挂起或异常终止现象时,该进程负责清除服务进程所占用的资源,回滚没有完成的事务。
当 PMON
检测到用户进程失败时,进行的工作归纳如下:
● 回滚当前用户的事务
● 释放当前用户加的表或行级锁
● 释放用户的其他资源
● 重新启动死掉的调度进程
假定我们在客户端运行 SQL*Plus 并通过网络访问 Oracle 服务器,那么 Oracle 将在服 务器端分配相应的服务进程。假如用户异常终止
SQL*Plus,或出现网络断开或客户端死机 的情况,PMON 就必须检测到这种情况,并释放掉服务进程所占用的资源。
|
|
6
|
ARCn 归档进程(Archive) ARCn
归档进程完成日志的归档备份,是一个可选后台进程。当数据库运行于归档日志
模式(ARCHIVELOG)下时,负责将已写满的重做日志文件复制到归档日志目标文件中,这样可以保留所有的重做记录。有了归档日志和数据库早期的物理备份,即使发生磁盘数据丢失,也可以通过原来的数据文件和归档日志进行恢复。
日志文件是循环使用的,当一个日志写满后,自动切换到另一个日志文件。ARCn
进程重做日志文件进行切换时开始工作,将写满的重做日志文件写入归档日志文件。根据归档 任务量的大小,通过设置初始化参数,可以同时启动多个 ARCn
进程。
|
|
7
|
RECO 恢复进程(Recover)
RECO
恢复进程负责在分布式数据库(Distributed
Database)环境下,自动恢复失败的分布式事务。当某个分布式事务由于网络连接故障或者其他原因失败时,RECO
进程将会尝试与该事物相关的所有数据库进行联系,已完成对失败事物的处理工作。
|
|
四、
|
Oracle数据库
数据库是数据存储的容器,作用是用来收集、存储数据和返回信息。
Oracle 数据库的物理结构包括两个部分,分别是数据库文件和操作系统文件。
|
|
(一)、
|
数据库文件
|
1.
|
控制文件(ControlFiles)
控制文件用于记录和维护数据库结构(数据库名、数据文件
的名称和路径、联机重做日志文件的名称和路径、备份信息等),每个 Oracle 数据库可以有 1-8 个控制文件,最少要包含一个控制文件。
一般情况下,实例和数据库是一一对应的关系,Oracle
数据库通过控制文件在实例和数据库之间建立关联。
在启动数据库时,系统会根据初始化参数
control_files 来定位控制文件,Oracle 从控制文件中读取组成数据库所有物理文件的信息,这样就可以打开必要的文件。如果控制文件丢
失或出现错误,数据库的启动就会失败。为了保护数据库的安全,Oracle 采用复合控制文件,即控制文件同时可以有多个镜像。
|
|
2.
|
数据文件(DataFile)
数据文件是用于存储数据库数据的物理文件,它由若干个操作系统文件组成,在数据文
件中存储着用户数据(表、索引等)、数据字典以及回滚段数据等。 数据文件和表空间有着密切的关系,Oracle
数据库至少要包含一个数据文件,并且数据文件是表空间的物理组成元素,一个表空间可以包含多个数据文件,并且每个数据文件只能惟一地属于某个表空间。
数据文件相关视图:
SQL> DESC
V$DATAFILE;
SQL> DESC
DBA_DATA_FILES;
|
|
3.
|
联机重做日志文件(OnlineRedo LogFile)
重做日志文件是用于记录数据库变化的物理文件,其作用是在发生意外时恢复 Oracle数据库。
日志文件以日志文件组的形式存在。
我们知道重做日志缓冲区是循环使用的:当重做日志缓冲区的重做项被写入联机重做日志文件后,重做日志缓冲区的内容可以被覆盖;
日志文件也是循环使用的,当联机重做日志文件中记录的数据已经同步写入数据文件,联机重做日志文件中的内容也可以被覆盖。但是这种循环以组的方式循环。
|
|
|
(二)、
|
操作系统文件
|
|
1.
|
初始化参数文件(Initialization
ParameterFile)
初始化参数文件定义了
Oracle 实例的各项参数,初始化参数文件是打开 Oracle 实例必 需的文件。
对于 Linux
操作系统,初始化参数文件一般默认存放在$ORACLE_HOME/dbs 路径下。初始化参数文件分为静态初始化参数文件和动态初始化参数文件。
|
|
2。
|
口令文件(PasswordFile)
口令文件用于存放特权用户信息及其口令的文件,“特权用户”是指具有启动、关闭
Oracle 服务器并建立数据库等特殊权利的用户。
如具有SYSDBA、SYSOPER、SYSASM权限的用户。
|
|
3.
|
归档日志文件(ArchiveLog File)
归档日志文件用于记录联机重做日志文件中的内容。
我们知道,联机重做日志文件以日志组的形式存在,并且循环使用。也就是说,如果联机重做日志文件被覆盖以后数据库发生故障,由于日志已经覆盖,将会导致数据库无法恢复。因此,我们希望联机重做日志文件能够得以保留。而联机重做日志文件是联机的,也就是说,数据库正常运行的时候需要用到,这时候如果把日志全部留在联机重做日志文件中,必然会对数据库的正常运行造成影响;而这些日志往往是出现意外时才会使用的。由于以上的原因,能够保留联机重做日志文件的内容,同时将这些内容脱机,是最好的解决方案。归档日志文件正满足了这些需求。当联机重做日志组发生切换时,上一组的内容同时写入归档日志文件,这样既可以保证日志不会丢失,又可以保证不影响数据库的正常运行。
|
|
4.
|
追踪文件(TraceFile)和警告文件(AlertLogFile)
追踪文件用于存放后台进程和服务器进程的跟踪信息。后台进程跟踪文件存放着后台进程的警告和错误信息,并且每个后台进程都有相应的跟踪文件。服务器进程跟踪文件用于存
放 SQL 语句的跟踪信息该类文件会记载 SQL 语句的执行时间、执行计划等信息等。
警告文件由连续的消息和错误组成。通过查看警告文件,可以查看到 Oracle
内部错误、块损坏错误以及非默认的初始化参数值,并且可以监视特权用户的所有操作,例如启动、关闭数据库
|