1、服务器架构
Oracle服务器主要由实例、数据库、程序全局区和前台进程组成,如下图所示
- 实例:即例程,可以进一步划分为系统全局区(SGA)和后台进程(PMON、SMON等)两部分
- 数据库:包含数据文件(data files)、控制文件(control files)和重做日志文件(redo log file)
- 程序全局区(PGA):是一个非共享的内存区域,用于管理用户进程的私有资源
- 前台进程:可以进一步划分为用户进程和服务器进程
1.1 系统全局区SGA
系统全局区(system global area)是所有用户进程共享的一块内存区域。主要由高速数据缓冲区、重做日志缓存区、共享池、大型池和JAVA池等内存结构组成。SGA随着数据库实例的启动而加载到内存中,当数据库实例关闭时,SGA区域也就消失了。
1.1.1 高速数据缓冲区(database buffer cache)
高速数据缓冲区中存放着Oracle系统最近访问过的数据块(缓存块)。当用户向Oracle发出请求时,如果在高速数据缓存存在请求数据,则系统直接读取数据返回用户。否则,Oracle系统打开数据文件读取请求数据到高速缓冲区,然后再从缓冲区返回数据给用户。由于高速缓冲区是被所有用户共享的,只要数据文件中的某些数据块被当前或者其他用户青丘国,那么这些数据块就会被装载到高速缓冲区,这样当任何用户再次访问相同数据时,Oracle就不哦那个再从数据文件中读取数据。
经常或者最近访问的数据块会被放置到高速缓冲区的前端,不常访问的数据块会被放置到高速数据缓冲区的后端,当高速数据缓冲区填满时,会自动挤掉一些不常被访问的数据块。
高速缓冲区可以进一步分为:脏数据去、空闲区、保留区
- 脏数据区:脏数据区中存放着已被修改过的数据,这些数据等待被写入数据文件中。当一条更新或者删除语句对某些数据块中的数据修改后,那么这些数据块就被标记为“脏”,然后等待提交命令并通过后台进程DBWR将其写入数据文件中。
- 空闲区:等待被写入数据
- 保留区:保留区中包含正在被用户使用的数据块和明确保留作为将来使用的数据块(即缓存块)
1.1.2 重做日志缓冲区(redo log buffer cache)
重做日志缓冲区用于存放对于数据库进行修改操作时所产生的日志信息,这些日志信息在写入重做日志之前,首先存放到重做日志缓冲区中,然后,在检查点发生或者重做日志缓冲区中的信息量到达一定峰值时,由日志写入进程LGWR写入重做日志文件。
重做日志缓冲区大小由参数log_buffer决定。相较于高速数据缓冲区,重做日志缓冲区对数据库性能的影响较小,通常较大的重做日志缓冲区能减少重做日志文件对I/O的读写次数,从而提升数据库性能
1.1.3 共享池(shared pool)
共享池是SGA保留的内存区域,用于缓存sql语句,pl/sql语句、数据字典、资源锁、字符集以及其他控制结构等。包含库高速缓冲区(library cache)和字典缓冲区(dictionary cache)
1)、库高速缓冲区
属于共享池,主要包括共享sql区和私有sql区两个组成部分。库高速缓冲区存放最近用过的sql、pl/sql语句的文本和执行计划。当再次执行相同语句时,可以直接在库告诉缓冲区找到之前生成的执行计划,无需重复解析,从而提高效率。
2)、字典告诉缓冲区(dictionary cache)
用于存放oracle系统内部管理所需要的数据字典信息,如用户名、数据对象和权限等
共享池的内存空间大小可以动态改变,由参数shared_pool_size决定
alter system set shared_pool_size=30m; -- 修改共享池内存空间为30M
show parameter shared_pool_size; --查看共享池大小
1.1.4 大型池(large pool)
大型池在SGA中是非必须内存结构。只在某些特殊情况下, 实例需要是哦那个大型池来减轻共享池的访问压力:
- 使用恢复管理器进行备份和恢复操作时,大型池将作为I/O缓冲区
- 使用I/O仿真异步I/O功能时,大型池被当作I/O缓冲区
- 执行具有大量排序操作sql时
- 使用并行查询时,大型池作为并行查询进程彼此交换信息的地方
alter system set large_pool_size=16m; --修改大型池的缓冲区为16m
show parameter large_pool_size; --查看大型池的大小
1.1.5 Java池
提供内存空间给JAVA虚拟机使用,以支持在数据库中运行的java包,大小由java_pool_size决定
1.1.6 流池
Oracle流池用于在数据库和数据库之间进行信息共享。
1.2 程序全局区(PGA)
程序全局区(program global area)亦称作用户进程全局区,它的内存区在进程私有区而不是共享区中。在PGA中,一个服务进程只能访问属于它的那部分PGA资源区,各个服务进程的PGA总和即为实例PGA的大小。通常PGA由私有sql区和会话区组成。
- 私有SQL区:用于存储变量及sql语句运行时的内存结构信息,当每个用户连接到实例时,都会在实例中创建一个会话,这些会话可能会在SGA中创建一个共享SQL区,但在PGA中可能会创建多个私有sql区。把私有sql区和共享sql区合并在一起就可以获得一条sql语句的完整缓存数据;
- 会话区:用于存放用户的会话信息(如登录用户名)。如果数据库处于共享服务器连接模式下,则会话区位于SGA,而不是PGA中。
show parameter pga --显示当前用户进程的PGA信息
1.3 前台进程
前台进程包括用户进程和服务器进程,不属于实例。用户使用前台进程与实例沟通
1.3.1 用户进程
用户进程是指能够产生和执行sql语句的应用程序。包含两个重要概念:连接和会话
- 连接:用户进程和实例之间建立的通信渠道,可以通过操作系统上的相关通信机制或者网络实现。
- 会话:用户进程和实例之间连接建立后,形成的用户与实例之间的交互方式
1.4 后台进程
后台进程是一组运行于oracle服务器端的后台程序,主要有SMON、PMON、DBWR、LGWR和CKPT这5个进程。
如下所示:
![](https://img2018.cnblogs.com/blog/1659632/201911/1659632-20191113235422874-284876720.png)
1.4.1 数据写入进程(DBWR)
数据写入程序主要任务是负责将内存中的脏数据块回写到数据文件中。所谓脏数据快是指高速缓冲区中被修改过的数据块,这些数据块的内容与数据文件的数据块内容不一致。但DBWR并不是随时将所有的脏数据快都写入数据文件,只有满足一定条件时,才进行回写操作:
a、当用户进程执行插入或者修改等操作时,需要将新数据写入到高速缓冲区,如果在高速缓冲区中没有找到足够用的空闲数据块来存放这些新数据,则Oracle系统启动DBWR进程并将脏数据快写入数据文件,同时获得空闲数据块来存储新数据
b、检查点进程启动后,它会强制要求DBWR将某些脏数据快写入数据文件
c、当脏数据块在高速数据缓冲区中存放超过3秒钟,DBWR进程会自动启动并将某些脏数据快写入数据文件
注意:DBWR进程的最大数由spfile中的db_write_processes参数决定。但是DBWR进程的数量不应超过系统处理器的数量,否则会降低系统性能
1.4.2 检查点进程(CKPT)
检查点进程可以看作是一个事件,当检查点时间发生时,CKPT会要求DBWR将某些脏数据块回写到数据文件。
用户操作数据时,Oracle系统从数据文件读取数据存放到高速缓冲区,并产生大量的日志信息存储在重做日志缓冲区,当Oracle系统满足一定条件时,日志写入进程(LGWR)会将重做日志缓冲区中的日志信息写入重做日志文件组中,一个日志组写满后会自动切换到另一个日志组,此时就会启动检查点进程
1.4.3 日志写入进程(LGWR)
日志写入进程哦那个与将重做日志缓冲区中的日志信息写入重做日志文件。Oracle系统首先将用户所做的修改日志信息写入日志文件,然后再将修改结果写入数据文件。
Oracle实例在运行中会产生大量的日志信息,这些日志信息首先被记录在SGA的重做日志缓冲区中,当发生提交命令,或者重做日志缓冲区的信息满1/3,或者日志信息存放超过3秒钟时,LGWR进程就将日志信息从重做日志缓冲区中读出并写入日志文件组中序号较小的文件,当一个日志组写满后就会自动切换到另外一组继续写入。当LGWR进程将所有日志文件都写过一遍后,它将再次转向第一个日志组进行覆写,如下图所示
1.4.4 归档进程(ARCH)
归档进程是一个可选进程,只有Oracle处于归档模式时,该进程才起作用。
归档进程作用为当各个日志文件组都被写满即将被覆盖之前,把即将被覆盖的日志信息读出,然后把“读出的日志信息”写入到归档日志文件中,如下图所示
归档日志进程数由log_archive_max_processes参数决定,可以通过调大该参数,以提高归档速度从而降低LGWR进程等待时间,达到提高归档写磁盘的速度。
1.4.5 系统监控进程(SMON)
系统监控进程是在数据库系统启动时执行回复工作的强制性进程。比如,在并行服务器模式下,SMON可以回复另一条处于失败的数据库,使系统切换到另外一台正常的服务器上。
1.4.6 进程监控进程(PMON)
进程监控进程用于监控其他进程的状态,当有进程启动失败时,PMON会清除失败的用户进程,释放用户进程所用的资源。
1.4.7 锁进程(LCKN)
锁进程是一个可选进程,并行服务器模式下可以出现多个锁定进程以利于数据库通信
1.4.8 恢复进程(RECO)
是在分布式数据库模式下使用的一个可选进程,用于数据不一致时进行恢复工作
1.4.9 调度进程(DNNN)
调度进程也是一个可选进程,在共享服务器模式下使用,可以启动多个调度进程。
1.4.10 快照进程(SNPN)
快照进程用于处理数据库快照的自动刷新,并通过DBMS_JOB包运行预定的数据库存储过程
可以从v$bgprocess数据字典中查询当前实例的进程信息,代码如下:
set pagesize 50;
select name,description from v$bgprocess;
2、数据字典
数据字典是Oracle存放关于数据库内部信息的地方,用来描述数据库内部的运行和管理情况。如数据表的所有者、创建时间、所属表空间、用户访问权限等信息。
2.1 Oracle数据字典简介
Oracle数据字典的名称由前缀和后缀组成,使用下划线“_”连接,代表意义如下:
- DBA_:表示包含数据库实例的所有对象信息;
- V$_:表示当前实例的动态视图,包含系统管理和系统优化等所使用的视图;
- USER_:记录用户的对象信息;
- GV_:分布式环境下所有实例的动态视图,包含系统管理和优化使用的视图;
- ALL_:记录用户的对象信息及被授权访问对象的信息;
2.2 Oracle常用数据字典
2.2.1 基本数据字典
基本数据字典主要包括描述逻辑存储结构和物理存储结构的数据表,另外还包括一些描述其他数据库对象信息的表,比如dba_views、dba_triggers、dba_users等,如下所示
数据字典名称 | 说明 |
---|---|
dba_tablespaces | 关于表空间的信息 |
dba_ts_quotas | 所有用户表空间限额 |
dba_free_space | 所有表空间中的空闲空间 |
dba_segments | 描述数据库中所有段的存储空间 |
dba_extents | 数据库中所有数据区的信息 |
dba_tables | 数据库中所有数据表的信息 |
dba_tab_columns | 所有表、视图、簇的列 |
dba_views | 数据库中所有视图信息 |
dba_synoyms | 关于同义词的信息查询 |
dba_sequences | 所有用户序列的信息 |
dba_constraints | 所有用户表的约束信息 |
dba_indexs | 关于数据库中所有索引的描述 |
dba_ind_columns | 在所有表及簇上压缩索引的列 |
dba_triggers | 所有用户的触发器信息 |
dba_source | 所有用户的存储过程信息 |
dba_data_files | 数据库文件信息 |
dba_tab_grants/privs | 关于对象授权信息 |
dba_objects | 数据库中的所有对象 |
dba_users | 数据库中所有用户的信息 |
2.2 常用动态性能视图
Oracle系统内部提供了大量的动态性能视图,之所以说是动态,是因为这些视图的信息在数据库运行期间会不断更新。动态视图以v$作为名称前缀,这些视图提供了关于内存和磁盘的运行情况,用户只能访问而不能修改它们,常用动态视图如下所示:
数据字典名称 | 说明 |
---|---|
v$database | 描述关于数据库的相关信息 |
v$datafile | 数据库使用的数据文件 |
v$log | 从控制文件中提取有关重做日志组的信息 |
v$logfile | 有关实例重置日志组文件名及其日志信息 |
v$archived_log | 记录归档日志文件的基本信息 |
v$archived_dest | 记录归档日志文件的路径信息 |
v$controlfile | 描述控制文件的相关信息 |
v$instance | 记录实例的基本信息 |
v$system_parameter | 显示实例当前有效的参数信息 |
v$sga | 显示实例的SGA大小 |
v$sgastat | 统计SGA使用情况信息 |
v$parameter | 记录初始化参数文件中所有项的值 |
v$lock | 通过访问数据库会话,设置对象锁的所有信息 |
v$session | 有关会话的信息 |
v$sql | 记录sql语句的详细信息 |
v$sqltext | 记录sql语句的语句信息 |
v$bgprocess | 显示后台进程信息 |
v$process | 当前进程信息 |