目录
LLL的数据库培训—第二部分—Oracle基础知识培训—第4讲—Oracle11g的体系结构(实例+内存结构+进程)
一、Oracle的体系结构
几张图
同样可以查看地址了解:https://www.topunix.com/post-5418.html
1、oracle服务器
(1)是一个提供开放式的、全面的、综合性信息管理服务的数据库管理系统
(2)Oracle服务器由实例和数据库,两部分组成。
2、实例
(1)一种访问数据库的机制;
(2)它由共享内存(即SGA)和后台进程组成;
注:----前期版本是有内存结构+后台进程组成,
但后来内存结构又出现了一个PGA进程(官方称:server process),前端用户连接服务器时,服务器会产生一个server process,,但PGA进程不属于实例的一部分(后面会讲解作用)
(3)每个实例只能操作(打开)其对应的一个数据库,但一个数据库可以有多个实例操作(RAC)
3、数据库
有一系列的物理文件组成
(1)核心文件
控制文件:包含了维护和校验数据库一致性 所需的信息。 重做日志文件:包含了当实例/系统崩溃后进行恢复所需记录的变换信息。 数据文件:包含了数据库中真正的数据。
(2)其他关键文件
参数文件:定义了实例的特性,如SGA、PGA、DBWR数量、processes数量、db_name等信息。 密码文件:用于数据库在启动前,管理员需要登录的密码认证,一般为sys用户的密码,二进制文件。 归档日志文件:是重做日志文件(redo log)的自动备份文件。在系统崩溃后可能需要这些文件进行恢复。
(3)其他文件
跟踪文件: 通常是一个服务器进程对某种尝一尝错误条件作出响应时创建的诊断文件。 警告文件: 与跟踪文件类似,但会更加容易读懂,通过一个集中式文件警告DBA。 临时文件: 用于完成基于磁盘的排序和临时数据的存储。 修改跟踪文件:用于数据库建立增量备份 闪回日志文件:flashback log file,包含数据块“被修改前的映像”,用于对表的误操作的恢复,还原,比用户模式下的恢复要方便快捷,10g后才出。 转储文件: exp,imp 数据泵文件: expdp,impdp
Oracle有3个主要内存结构SGA、PGA、UGA。
系统全局区( System Global Area,gA):这是一个大的共享内存段,几乎所有 Oracle进程都要访问这个区域。
进程全局区( (Process (or Program Global Area,A):这是一个进程或线程专用的内存,其他进程线程不能访问。
用户全局区( User Global Area,ugA):这个内存区与特定的会话相关联。它可能在SGA中分配,也可能在PGA中分配,这取决于是用共享服务器还是用专用服务器来连接数据库。如果使用共享服务器,UGA就在SGA中分配;如果使用专用服务器,UGA就会在PGA中。
二、内存结构1—SGA
SGA分为5大池:共享池、大池、java池、空池、流池
1、共享池:
由库高速缓存(library cache)和数据字典高速缓存(data dictionary cache)两部分组成。
包含共享游标、存储过程、状态对象、字典缓存区、和诸如此类的大量其他数据。共享池可以动态分配大小。
(1)库高速缓存
A、作用:
服务器进程将SQL(或PL/SQL)语句的正文编译后的代码(parsed code)以及执行计划都要放在共享池(shared pool)的库高速缓存中。 在进行编译时,服务器进程首先会在共享池中搜索是否有相同的SQL或PL/SQL(正文),如果有就不进行任何后续的编译处理,而是直接使用已存在的编译后的代码和执行计划。
B、想要共享SQL或PL/SQL语句:
第一,library cache要足够大,只有这样,共享的SQL或PL/SQL语句才不会被很快地淘汰出内存。 第二,SQL或PL/SQL语句一定是要能共享的通用代码(generic code);即oracle是比较SQL或PL/SQL的正文来确认是否是共享语句。
C、举个例子:这两个语句是否是共享sql语句?
select * from test where id=1; select * from test where id=2;
服务器进程(server process)会将上述正文进行编译,显然两个语句是不一样的,所以编译后的语句是无法共享的。
D、什么是共享语句:
select * from test where id=:g_sal;
因为变量不是在编译阶段而是在运行阶段赋值的,所以服务器进程将正文进行编译后,就存放到了library cache中,下一次同样的sql语句被执行后,不需要进行编译,直接赋值即可进行语句的执行。
E、11g和12c的新特性
库高速缓存还可以包括SQL或PL/SQL的执行结果,这样其他使用相同SQL或PL/SQL语句的进程就可以直接共享这些代码和执行计划了,其效率将更高。
F、LRU队列算法--管理库高速缓存
①刚使用的内存块(的地址)放在LRU队列的头上(最前面); ②当一个服务器进程需要库高速缓存的内存空间而又没有空闲的内存空间时,该进程就从LRU队列的尾部(最后面)获得所需的内存块; ③这些内存块一旦被使用,它们(的地址)就立即放在LRU队列的最前面。 ④这样那些长时间没使用过的内存块将自然地移到LRU队列的尾部而被最先使用。
(2)数据字典高速缓存
作用:
①当Oracle执行SQL语句时,服务器进程把数据文件、表、索引、列、用户和其他的数据对象的定义和权限的信息放入数据字典高速缓存。
②如果在这之后,有进程(用户)需要同样的信息,如表和列的定义,那么所有的这些信息都将从数据字典高速缓存中获得。
③因为以上信息都是存在于oracle的数据字典中,所以将该部分内存称为数据字典高速缓存
2、空池(“NULL” pool)
这个池其实没有名字。它是块缓冲区、重做日志缓冲区和"固定SGA"区专用的内存。
(1)重做日志缓冲区
数据需要写到在线重做日志中时,在它们被写至磁盘之前,需要在重做缓冲区(redo buffer)中临时缓存这些数据。
注意:数据再写入数据块高速缓冲区之前,先写入重做日志缓冲区。它存在的意义就是数据的恢复。
(2)数据块高速缓冲区
oracle将数据库块写至磁盘之前,或从磁盘上读取数据库块之后,就会把这些数据库块存储在块缓冲区中。
如用户执行sql语句查询表数据,服务器进程首先在数据块高速缓冲区(block buffer cache或有些书籍称数据库高速缓冲区,database buffer cache)中搜寻所需的数据,如果找到了就直接使用,如果没有找到,就进行磁盘操作,把数据文件中的数据读入到数据库高速缓冲区中。
为了便于SGA的管理内存数据,Oracle把高速数据缓冲区分为以下3个部分:
脏数据区:存放着已被修改过的数据,这些数据等待被写入到数据文件中。
空闲区:空闲区中的数据块不包含任何数据,这些数据块可以被写入数据,Oracle可以从数据文件中读取数据块,并将其存放到该区中
保留区:包含那些被用户访问的数据块和明确保留以作为将来使用的数据块
(3)“固定SGA”
固定SGA是无法控制固定SGA的大小,通常情况它很小,可以理解为SGA的“启动(bootstrap)”区,oracle在内部要使用这个区来找到SGA内的其他一些信息。
3、大池(large pool)
之所以称为大池,是因为它被用于大块内存的分配,而共享池无法处理这么大的内存块。
- 在使用共享服务器连接时存放会话内存(UGA)、
- 在使用并行执行功能时作为消息缓冲区;
- 在RMAN备份时作为磁盘I/O缓冲区。
- 大池可以动态调整大小。
4、流池(streams pool)
这是一个专门针对数据传输/共享工具(如OGG,Oracle Streams)的内存池。可以动态调整大小。
如果为配置流池,但使用了流功能,oracle会使用共享池中最多10%的空间作为流内存。
5、Java池
java池为数据库中运行的java虚拟机(JVM)所分配的一段固定大小的内存。java池可以再数据库启动和运行时动态调整大小。
三、内存结构2——PGA
1、什么是PGA
(1)Program Global Area,也可以称作用户进程全局区。
(2)PGA是特定于进程的一段内存。换句话说它是操作系统中某个进程或线程专用的内存,不允许系统中的其他进程或线程访问。
(2)PGA一般是通过C语言运行时调用 H malloc()或 memmap()来分配,而且可以在运行时动态扩大(或收缩)。
(3)PGA绝对不会在 Oracle的SGA中分配,而总是由进程或线程为自身分配。
(4)PGA中的P代表 Process(程)或 Program(程序),是不共享的。
(5)虽然PGA是一个全局区,可以把代码、全局变量和数据结构都可以放在其中,但区域内的资源并不像SGA中的那样被所以用户所共享,而是每个Oracle服务器进程都只用于属于自己的那部分PGA资源。
(6)各个服务进程PGA区总和即为实例PGA区的大小。
(7)包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反,PGA是只被一个进程使用的区域,PGA在创建进程时分配,在终止进程时回收。
简单理解,每一个用户连接进来,在专用模式下,都会给用户分配一个PGA内存。
2、PGA的区
(1)私有SQL区:
存储变量以及SQL语句运行时的内存结构信息,当每个用户连接到实例时,都会在实例中创建一个会话。
这些会话可能会在SGA区中创建一个共享SQL区,但在PGA区中可能会创建多个私有SQL区。
把一个私有SQL区与对应共享SQL区合并在一起,就可以获得一条SQL语句的完整缓存数据。
另外,每个私有SQL区可以再分为静态区和动态区两部分。
①静态区的信息在会话过程中保持不变,只有当会话结束时,静态区才会释放掉; ②而动态区的信息在整个会话过程中是不断变化的,一旦SQL语句指定完毕,即使会话还没有结束,动态区也被释放掉。
(2)会话区
用于存放用户的会话信息(如登陆用户名)。
如果数据库处于共享服务器连接模式下,则会话区将位于SGA区域,而不是PGA中 。
更改用:alter system set pga_aggregate_target=18m; 查看PGA:show parameter pga;
四、内存结构3——UGA
UGA(用户全局区)实际上来说,就是你的会话的状态。它是一段你的会话一直能访问到的内存。
UGA的分配位置完全取决于你如何连接 Oracle.
1、如果是通过共享服务器方式连接
UGA肯定存储在每个共享服务器进程都能访问的内存结构中,也就是SGA中。也就是说,内存资源是有SGA分配的。
如果是这样,你的会话可以使用任何共享服务器进程来连接数据库,因为任何一个共享服务器进程都能读写你的会话的数据。
2、如果通过一个专用服务器连接
则不再需要其他进程都能访问你的会话状态,这时候UGA几乎成了PGA的同义词。
实际上,UGA就包含在专用服务器的PGA中。内存资源也是由PGA分配的。
查看系统统计信息时可以看到,采用专用服务器模式时,总是会看到UGA是在PGA中(PGA内存大于或等于UGA所用的内存,也就是说PGA内存的大小会包括UGA的大小)。
所以,PGA包含进程内存,还可能包含UGAPA内存中的其他区域通常用于完成内存中的排序、位图合并以及散列。可以肯定地说,除了UGA,这些区域在PGA中占的比重最大。
五、进程
ORACLE的进程分为四种:用户进程、服务器进程、后台进程、从属进程(暂不讲解)
可以通过ORACLE提供的进程结构图,可以清楚地看到三个进程中系统运行中的主要作用,
1、用户进程:
当用户运行应用程序时,操作系统会为用户运行的应用建立一个进程。那么这个进程就是我们所说的用户进程。
进程的查看:用户进程在每个客户端上面,比如我通过个人电脑的sqlplus程序连接到oracle服务器,那么这个时候个人电脑上面的sqlplus进程就是oracle的用户进程。
这个用户进程还可以是plsql或者其他一些连接工具;
2、服务器进程:
服务器进程用于处理连接到该实例的用户进程的请求;
服务器进程执行的任务:对应用程序所发出的SQL语句进行语法分析和执行,从磁盘中读入必要的数据到SGA的共享数据库缓冲去将结果返回给应用程序处理;
(1)进程的查看:
服务器进程存放于服务器上面,进程的命名方式为oracleSID的格式,通过ps -ef|grep oracle的方式查看;
(2)LOCAL=NO :
非本地连接,即网络连接。 它是通过Listener 连接到服务器的。 客户端的应用通过客户端的监听向服务器的监听发送请求,服务器的监听接收后,在与数据库连接,执行相关操作,在把结果返回给客户端。 这是通过监听的流程。 所以在客户端需要配置连接字符串内容,即配置tnsnames.ora。
(3)LOCAL=YES:
本地连接。 本地连接不走监听,所以在服务监听没有启动的情况下,通过本地的sqlplus 还是可以连上数据库的。
(4)专用服务器连接(dedicated server)
采用专用服务器连接时,会在服务器得到一个针对这个连接的专用进程。这时,数据库连接与服务器进程(或线程)之间是一一对应的。
采用共享服务器连接时,多个会话可以共享一个服务器进程池,其中的进程有Oracle实例生成和管理。你连接的是一个数据库调度器(dispatches),而不是特意为该连接创建的专用服务器进程。
查看服务器是专用模式还是共享模式
SQL> select server from v$session where sid=(select distinct sid from v$mystat);
$lsnrctl server
3、后台进程
后台进程是在实例启动时启动,启动Oracle数据库的实例时会自动启动后台进程;
后台进程是为所有数据库用户异步完成各种任务,无论用户是否连接数据库,后台进程都会作为数据库的一部分运行,部分的后台进程如果死掉,会导致整个数据库跟着死掉;
数据库正常运行所需的后台进程:PMON、SMON、DBWn、LGWR、CKPT。这四种进程一旦被kill掉,oracle实例也会自动关闭。
进程查看:
SQL> select paddr,name,description from v$bgprocess where paddr<>'00' order by paddr desc;
进程详解:
(1)PMON(process monitor 进程监控器)
作用:对应各个进程的管理
①负责在连接出现异常中止后进行清理工作。 如:一个专用服务器“失败”或出于某种原因被结束掉,就要由PMON进程负责善后(恢复或撤销工作),并释放资源。 PMON会回滚未提交的工作,释放锁、并释放之前为失败进程分配的SGA资源。
②还负责监视其他的Oracle后台进程,并在必要(而且可能)时重启这些后台进程。如SMON、DBWn、LGWR、CKPT这四个进程终止,PMON检测出后,会立即终止实例。 PMON (ospid: 27431): terminating the instance due to error 474
③kill 掉pmon进程,会被PSPO或MMON 结束 PSP0 (ospid: 27093): terminating the instance due to error 472结束,【PSP0】----11.2.0.4.0 MMON (ospid: ): terminating the instance due to ORA error 【MMON】-19.0.3.0
④kill掉MMON,几分钟后会自动重启 Restarting dead background process MMON
(2)SMON:(system monitor 系统监视器)
作用:对应系统级别的管理
①清理临时表空间 ②合并空闲表空间 ③针对原来不可用的文件恢复活动的事务 ④执行RAC中失败节点的实例恢复 ⑤清理BOJ$ ⑥管理撤掉段(即undo段) ⑦回滚段离线
(3)CKPT(checkpoint process,检查点进程)
作用:
①并不是像它的名字所写的那样是用来建立检查点; ②实施检查点主要是DBWn进程的工作,给DBWn发信号 ③仅仅是协助实际运行检查点的进程,来更新数据文件的文件头。 ④修改控制文件信息
触发条件:
①执行alter system checkpoint;
②自动或手动切换redolog:alter system swicth logfile;
③shutdown immediate/normal
④alter tablespace ... offline;
(4)DBWn(数据库写进程):
作用:
①负责将脏块数据写入磁盘的后台进程,将数据缓冲区缓存中的脏块刷出到硬盘,为缓存腾出更多的空间。 ②或为了推荐检查点(将在线重做日志文件的位置前移,如果实例失败或崩溃,oracle会从这个位置读取来恢复实例)
触发条件:
①检查点执行(ckpt) ②脏块上限数到达 ③缓存区没有自由空间 ④dbwr超时,大约3秒 ⑤连接RAC要求 ⑥表空间脱机 ⑦表空间只读 ⑧清空和删除表 ⑨表空间开始备份
(5)LGWR(日志写入器)
作用:
LGWR进程负责将SGA中重做日志缓冲区的内容刷新输出到磁盘。
触发条件:
①用户提交(commit) ②有1/3重做日志缓冲区未被写入磁盘(磁盘是指redo01.log等) ③有大于1m的重做日志缓冲区未被写入磁盘 ④3秒超时 ⑤dbwr 需要写入的数据的scn大于lgwr记录的scn,dbwr触发lgwr 写入
(6)ARCn(归档进程)
作用/任务:
将在线重做日志归档
触发条件:
①当LGWR将一个在线重做日志文件填满时,就将其复制到另一个位置。
②alter system switch logfile
归档日志的作用:
①此后这些归档的重做日志文件可以用于完成介质恢复。 ②在线重做日志用于在出现掉电(实例终止)时“修正“数据文件,而归档重做目志则是在出现硬盘故摩时用于“修正”数据文件。 ③如果丢失了包含数据文件101/dbfile/ORA12CR1/systeme1.dbf的文件,我们可以去找上一周的备份,从备份中恢复该文件的备份,之后要求数据库去应用自这次备份之后生成的所有归档和在线重做曰志。 ④这样就能使这个数据文件与数据库中的其他数据文件同步,我们就可以继续使用而没有丢失任何数据。
(7)DIAG(诊断进程)
在以前的版本中,DIAG进程(diagnosabilityprocess)专用于RAC环境。从OracleDatabase11g开始,利用ADR(高级诊断库,AdvancedDiagnosticRepository),它会负责监视实例的整体状况,而且会捕获处理实例失败时所需的信息。这既适用于单个实例配置,适用于多实例的RAC配置。
(8)FBDA:闪回数据归档进程
这个进程是OracleDatabasellgRelease1新增的。这是新增闪回数据归档功能的重要组成部分闪回数据归档功能是指能够闪回查询(asof查询)很久以前的数据(例如,查询1年前、5年前等,当时一个表中的数据)。这种长期历史查询功能是通过维护行的历史变化记录,即记录一个表中的每行数据的变化来实现的。这个历史就是由后台的FBDA进程维护。这个进程在事务提交之后就立即工作。FBDA进程会读取该事务生成的undo,并回滚事务作出的改变。然后将回滚后的这些行(原来的值)记录在闪回数据归档中。
(9)DBRM:数据库资源管理嚣进程
DBRM进程(DatabaseResourceManagerprocess)会去实施那些为一个数据库实例配置的资源计划。它会设置指定的资源计划,执行相关的各种操作来实施/实现这些资源计划。资源管理器允许数据库管理员对数据库实例所用的资源、应用访问数据库所用的资源或者单个用户访问数据库所用的资源进行细粒度的控制。
(10)GEN:通用任务执行进程
顾名思义,通用任务执行进程(generaltaskexecutionprocess)为数据库提供了一个执行通用任务的进程。这个进程的主要目标是分担进程中某些可能造成进程阻塞(blocking)的处理过程(这些处理过程会导致一个进程的停止),并将它们放在后台中完成。例如,如果主ASM进程需要完成某个阻塞文件的操作,而且这个操作是可以在后台被安全地完成的(就是说这个操作完成之前ASM仍可以