Oracle数据库的两种连接方式:专用服务器连接 和 共享服务器连接
一、Oracle数据库组成:
oracle server 是由:实例和数据库组成;
oracle数据库由:数据文件 重做日志文件 临时文件 控制文件 参数文件 密码文件等组成 (其中最重要的就是数据文件和重做日志文件)
oracle实例是由:系统全局区SGA的共享内存块以及大量后台进程构成。
SGA包括:数据库缓冲区缓存、日志缓冲区、共享池、还有(大池、Java池、流池)
后台进程:DBWR(数据库写进程);LGWR(日志写进程);CKPT(检查点);SMON(系统监控进程);PMON(进程监控);ARCH(归档进程);RECO恢复;LCKN封锁;等
PGA:用户会话还需要服务器端的内存,此内存不共享,也称为程序全局区PGA,每个会话都有自己的PGA。
-----从Oracle12C起,全局临时表所产生的undo可以存放在临时表空间中。
《控制文件》
控制文件是一个相当小的文件(极端情况下能增长到64MB),它储存了数据库需要的一些文件的位置,还记录了一些其他信息,如:检查点的有关信息,数据库名、数据库创建是时间戳、归档重做日志的历史以及RMAN信息等。
《重做日志》
重做日志分为在线重做日志redo和归档重做日志。
online Redo log files--在线重做日志,又称联机重做日志,指Oracle以SQL脚本的形式实时记录数据库的数据更新,换句话说,实时保存已执行的SQL脚本到在线日志文件中(按特定的格式)。
注意:在线重做日志最重要的目标就是在实例失败后我们能够恢复已经提交的事务;
Archive Redo log files--归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。
SGA和PGA
PGA是用户进程区,也可以这么理解,如果并发500 那么就需要分配500M的PGA
PGA是进程专用的内存区
《重做缓冲区》
---实际上,LGWR进程会在以下任何一种情况发生时把缓冲区数据刷新输出到磁盘:
1、每3秒一次
2、发生提交或回滚请求时
3、要求LGWR切换日志文件时
4、重做缓冲区用满三分之一,或者缓存重做日志数据达到1MB时;
数据需要写到在线重做日志时,在它们被写到磁盘之前,需要在重做缓冲区中临时缓存这些数据;
重做日志缓冲区的默认大小是由log_buffer参数控制;
《块缓冲区缓存block buffer cache》
Oracle将数据库块写到磁盘之前,或从磁盘上读取数据库块之后,就会把这些数据库块存储在块缓冲区缓存中;
块缓冲区缓存不能太小,要不然 我们的查询就会永远也执行不完。也不能太大,因为又会抢占其他进程的资源;
数据库中只有一种块大小:2KB 4KB 8KB 16KB 32KB中的一种;如果要修改数据库块,在安装数据库的时候 在init.ora文件中指定:db_block_size=16384 即可,16384是16K
《共享池shared pool》
共享池就是Oracle缓存一些程序数据的地方,在解析一个查询时,解析得到的结果就缓存在那里。在完成解析整个查询的任务之前,Oracle会搜索共享池,看看这个工作是否完成;
共享池的特点是有大量小的内存块,一般为4KB或更小。我们的目标是使用小块的内存来避免碎片问题,如果大小各不同 很可能出现碎片问题。
《大池large pool》
大池是用于被大块内存的分配,而共享池无法处理这么大的内存块。
《JAVA池》
JAVA池目的是支持在数据库中运行JAVA,如果用JAVA编写一个存储过程,Oracle会在处理代码时使用Java池的内存。
《流池》
流池被用来缓冲队列消息,而且流池对于:goldengate streams等很重要,这些场景必须要有流池;
---SGA自动管理时,statistics_level参数必须被设置为typical或者all,因为如果统计信息收集功能没有启用,数据库就没有相关的历史记录来判断各个组件所需的内存大小。
二、Oracle数据库进程
一个Oracle实例主要有3类进程:服务器进程 后台进程 从属进程
---通过v$bgprocess视图可以查看数据库所有可能的后台进程
select paddr,name,description from v$bgprocess order by paddr desc;
通过查询v$process中pname不为空的记录,来查看系统中正在运行的后台进程;
注意:后台进程也分为两类:一类是有特定任务的进程,另一种是能够执行各种其他任务的进程(如工具进程)
---在12C中查看启动的后台进程:
select paddr,name,description from v$bgprocess where paddr <>‘00‘ order by paddr desc;
(在12C中将启动大约22个后台进程,而在11GR2中 只有17个后台进程)
1、PMON进程监视器
进程监视器(process monitor)负责在连接出现异常终止后进行清理工作。(例如:一个专用服务器失败或者出于某种原因被结束掉,就要由PMON进程负责善后并释放资源。PMON会回滚未提交的工作,释放锁,并释放之前为失败进程分配的SGA资源)
注意:在Oracle12C之前,PMON还负责处理注册监听的任务,从Oracle12C开始 改由专门的监听注册后台进程来注册实例和服务到监听器
2、LREG监听注册进程
从Oracle12C开始,LREG进程负责将数据库实例和服务注册到监听器中;
3、SMON系统监视器
SMON进程用来做所有系统级的任务。SMON所做的工作包括如下几种:
①:清理临时表空间:(并不是说完全不需要手动清理的)
②:合并空闲表空间:(只有在使用数据字典的表空间适用)
③:针对原来不可用的文件恢复活动的事务:
④:执行RAC中失败节点的实例恢复:
⑤:清理OBJ$:(OBJ$是一个底层的数据字典,数据库中几乎每个对象(表 索引 触发器 视图等)都在其中对应一个条目,很多时候,有些条目表示的可能是已经删除的对象,或者表示not there不在哪里的对象)
⑥:管理撤销段:SMON会负责实施撤销段的自动上下线以及收缩撤销段;
⑦:回滚段离线:
4、RECO分布式数据库恢复
reco有一个非常核心的任务:由于两阶段提交(2pc)期间的崩溃或链接丢失等原因,有些事务可能会保持在准备状态,这个进程就是要恢复这些事务;
5、CKPT检查点进程
实施检查点主要是DBWn进程的工作,CKPT仅仅是协助实际运行检查点的进程,来更新数据文件的文件头;
6、DBWn数据库块写入器
数据库块写入器是负责将脏块写入磁盘的后台进程;
DBWn的性能至关重要,如果它写出块的速度不够快,不能很快的释放缓冲区,就会看到free buffer waits和write complete waits这两个等待事件的数量和等待事件在增加;其实我们可以配置多个DBWn进程,实际上在Oracle11G可以配置36个,在Oracle12C则多达100个;
select name,description from v$bgprocess where description like ‘db writer process%‘; ----来查看数据库有几个DBWn进程
7、LGWR日志写入器:
LGWR进程负责将SGA中重做日志缓冲区的内容刷新输出到磁盘;
8、ARCn归档进程
该进程的任务是:当LGWR将一个在线重做日志文件填满时,就将其复制到另一个位置,此后这些归档的重做日志文件就可以用于完成介质恢复;
9、DIAG诊断进程
该进程在以前的版本中专用语RAC环境中,从Oracle11G开始 利用ADR(高级诊断库),它会负责监视实列的整体状况,而且会捕获处理实列失败时的所需信息;
10、FBDA闪回数据归档进程
11、DBRM数据库资源管理器进程
DBRM进程会去实施那些为一个数据库实例配置的资源计划;
12.还有一些其他进程:
LMON 锁监视器
LMD 锁管理器守护
LMSn 锁管理器服务器
LCK0 锁进程