本系列是作为学习笔记,用于记录学习过程,加深学习印象,以及自己重新回顾学习内容只用,参考书籍为《oracle 11g从入门到精通(第二版)》,如果需要深入学习,请购买原书籍,谢谢!

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 当前进程信息

学习笔记:oracle学习一:oracle11g体系结构之服务器结构、数据字典的更多相关文章

  1. 20155234 2016-2017-2第十周《Java学习笔记》学习总结

    20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...

  2. #学习笔记#e2e学习使用(一)

    本文仅限于记录本人学习的过程,以及怎么踩的坑,是如何解决的.逻辑肯定是混乱的,有用之处会抽出共通另行发帖. 最终目标:要运用于Vue项目中,进行功能测试甚至自动化测试. 一.e2e概念 理解:end ...

  3. java JDK8 学习笔记——助教学习博客汇总

    java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...

  4. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  5. 20155234 2610-2017-2第九周《Java学习笔记》学习总结

    20155234第九周<Java学习笔记>学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC(Ja ...

  6. #学习笔记#e2e学习使用(二)

    前言: <#学习笔记#e2e学习使用(一)>主要记录了Vue项目的创建到e2e环境的搭建,以及期间遇到的各种问题和解决方法.本文建立在基础测试环境搭建完毕能正确运行的情况下,编写测试代码, ...

  7. mybatis学习笔记之学习目录(1)

    mybatis学习笔记之学习结构(1) 学习结构: 1.mybatis开发方法 原始dao开发方法(程序需要编写dao接口和dao实现类) mybatis的mapper接口(相当于dao接口)代理开发 ...

  8. amazeui学习笔记二(进阶开发1)--项目结构structure

    amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...

  9. Vue学习笔记-rest_framework_jwt 学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

随机推荐

  1. __stdcall、Q_DECL_IMPORT、Q_DECL_EXPORT

    https://www.cnblogs.com/songfeixiang/p/3733661.html 在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只 ...

  2. CF455C Civilization

    嘟嘟嘟 水题一道,某谷又恶意评分. 合并无非是将两棵树的直径的中点连一块,记原来两棵树的直径为\(d_1, d_2\),那么新的树的直径就是\(max(d_1, d_2, \lceil \frac{d ...

  3. [转]C++重载()(强制类型转换运算符)

    在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符. 类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数.经过适当重载后,(类型名) ...

  4. 免sudo使用docker

    前沿:通过root安装完docker,在普通用户下执行docker相关命令的时候,报权限不足: 查看sock文件的权限: [hadoop@slave1 monitor]$ ll /var/run/do ...

  5. Lucene4.2源码解析之fdt和fdx文件的读写——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压

    前言 通常在搜索打分完毕后,IndexSearcher会返回一个docID序列,但是仅仅有docID我们是无法看到存储在索引中的document,这时候就需要通过docID来得到完整Document信 ...

  6. C语言结构体笔记

    typedef给结构起别名 可以是匿名结构或者普通的结构,方便后面使用. #include<stdio.h> typedef struct{ //匿名结构 float tank_capac ...

  7. Mininet系列实验(二):Mininet可视化应用

    1 实验目的 该实验通过Mininet学习miniedit可视化操作,可直接在界面上编辑任意想要的拓扑,生成python自定义拓扑脚本,简单方便.在实验过程中,可以了解以下方面的知识: Miniedi ...

  8. OAuth 2.0 的四种方式

    上一篇文章介绍了 OAuth 2.0 是一种授权机制,主要用来颁发令牌(token).本文接着介绍颁发令牌的实务操作. 下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个 ...

  9. C#-片段:外侧代码

    ylbtech-C#-片段:外侧代码 1.返回顶部 ·#if #if true #endif ·#region #region MyRegion #endregion ·namespace names ...

  10. 阿里云RDS与ECS服务器数据库做主从

    阿里云RDS与ECS服务器数据库做主从 [精] 里云RDS(数据库)基于飞天大规模分布式计算和存储能力,提供超高性价比的单机版实例,同时利用读写分离横向扩展读能力,满足网站类的业务需求.提供稳定.高性 ...