Oracle的体系结构

Posted FANCY PANDA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle的体系结构相关的知识,希望对你有一定的参考价值。

完整的Oracle数据库系统通常是由两个部分组成: 实例+数据库

数据库:一系列物理文件的集合(数据文件、控制文件、联机日志、参数文件等)

实例:一组Oracle后台进程/线程以及服务器分配的共享内存区

数据库和实例之间的关系:

  1. 数据库可以由多个实例装载和打开
  2. 实例可以在任何时间装载和打开一个数据库
  3. 一个实例在其生存期最多只能装载和打开一个数据库

逻辑存储单元从小到大依次为:数据块、盘区、段、表空间

数据块:Oracle用来管理存储空间的最小单元,也是执行数据库输入输出的最小单位

  • 数据块的组成:块头部、表目录、行目录、空闲空间、行空间

盘区:Oracle存储分配的最小单位,是由一系列物理上连续存放的数据块组成的一个盘区,而一个或多个盘区组成一个段

:一个独立的逻辑存储结构,不同类型的数据库对象拥有不同类型的段,分为:数据段、索引段、临时段、回退段和LOB段

表空间:Oracle中可以使用的最大的逻辑存储结构,一个表空间由一个或多个数据文件组成,一个数据文件只可以属于一个表空间,这是逻辑与物理的统一;存储空间在物理上表现为数据文件,在逻辑上表现为表空间;在创建数据库是,Oracle会自动创建一些默认的表空间,其中除了用于存储用户数据的普通表空间外,还有SYSTEM表空间、撤销表空间、临时表空间

  • (1)SYSTEM表空间:数据字典、内部系统表基表、PL/SQL程序的源代码和解析代码、数据库对象的定义
  • (2)撤销表空间:专门用来在自动撤销管理方式下存储撤销信息,即回退信息
  • (3)临时表空间:在实例运行过程中,Oracle使用一些临时空间来保存SQL语句执行过程中所产生的临时数据
表空间说明
system系统表空间,用于存储系统的数据字典、系统的管理信息和用户数据表等
sysaux辅助系统表空间。用于减少系统表空间的负荷,提高系统作业效率。该表空间由Oracle系统自动维护,般不用于存储用 户数据
temp临时表空间。用于存储临时的数据,例如存储排序时产生的临时数据。一般情况下,数据库中的所有用户都使用temp作为默认的临时表空间
undotbsl撤销表空间。用于在自动撤销管理方式下存储撤销信息。在撤销表空间中,除了回退段以外,不能建立任何其他类型的段。所以用户不可以在撤销表空间中创建任何数据库对象
users用户表空间。用于存储永久性用户对象和私有信息

物理存储结构

  • 物理存储结构并不是独立存在的,它与数据库逻辑存储结构之间有着不可分割的联系

数据文件

数据库物理存储结构主要包括3类物理文件:

  • 数据文件
  • 控制文件
  • 重做文件
  • 以及一些参数文件

查看数据文件命令:

数据文件大致分为:

  • 系统数据文件(STSTEM01.DBF、STSTEMAUX01.DBF)
    •   	存放系统表和数据字典
      
  • 撤销段文件(UNDOTBS01.DBF)
    •   	存放撤销段数据文件,在数据修改段中存储修改之前的记录
      
  • 用户数据文件(USER01.DBF、EXAMPLE01.DBF)
    •   	存放用户数据
      

控制文件

  1. 数据库控制文件是一个很小的二进制文件,在其中包含了关于数据库物理结构的重要信息
  2. 通过在加载数据库时读取控制文件,Oracle才能找到自己所需的操作系统文件(数据文件、重做日志文件等)
  3. 在数据库运行过程中, Oracle会不断更新控制文件的内容因此控制文件必须在整个数据库打开期间保持可用状态。如果由于某种原因导致控制文件不可用,则数据库将崩溃
  4. 每个数据库必须至少拥有一个控制文件,一个数据库可以同时拥有多个控制文件,但是一个控制文件只能属于一个数据库
  5. 控制文件中的主要信息包括:数据库的名字、检查点信息、.数据库创建的时间戳、所有的数据文件、重做日志文件、归档日志文件信息和备份信息等

重做日志文件

重做日志文件是记录数据库中所有修改信息的文件

重做日志文件记录两类数据:1. 修改前的数据 2. 修改后的数据

  1. 当满足一定条件时先将修改操作所产生的重做记录写入重做日志文件中,然后才将内存中的修改结果成批的写入数据文件,最后再提交事务
  2. 重做日志文件是由重做记录组成的,重做记录是由修改向量组成的当用户执行一条update语句对某-一个表中的记录进行修改时,会生成一条记录。这条记录用多个向量记录下了被这条语句修改过的各个数据块中的信息,一旦数据库崩溃,Oracle服务器就使用重做日志文件中的记录来进行数据库的恢复工作。
  3. Oracle使用了多组( group)重做日志。重做日志写进程( LGWR )在任意时刻只能写- -组重做日志组,LGWR后台进程正在写的重做日志组称作当前(current)重做日志组。LGWR把完全相同的信息从重做日志缓冲区(redolog buffer )中复制到该组的每个重做日志文件中。它是以循环的方式写重做日志组的。当LGWR写满了一-组重做日志时,它就开始写下一-组重做日志。这称为日志切换。当写满了最后一组时,LGWR开始写第一-组重做日志。

其他文件

  • 归档日志文件
  • 参数文件
  • 密码文件
  • 预警日志文件
  • 后台或用户跟踪文件

实例的内存结构:系统全局区SGA、程序全局区PGA

系统全局区SGA
当启动Oracle数据库时,系统会先在内存内规划一个固定区域,用来储存用户需要的数据,以及Oracle运行时必备的系统信息

程序全局区PGA

  • 程序全局区( PGA)是保存特定服务进程的数据和控制
  • 信息的内存结构,这个内存结构是非共享的,只有服务进程本身才能够访问它自己的PGA区。每个服务进程都有
    它自己的PGA区包含如下结构:
    • 私有SQL工作区
    • 会话内存区
  • 进程是操作系统中一个独立的可以调度的活动,用于完成指定的任务。
  • 进程与程序的区别在于前者是一个动态概念,后者是一个静态实体。程序仅仅是指令的有序集合,而进程则强调执行过程。
    进程可以动态地创建,当完成任务后即会消亡。

Oracle的进程包括三类:

  • 服务进程
  • 服务器进程
  • 后台进程

服务进程
用户执行一个Oracle应用程序或启动一个Oracle工具(如SQLPlus)时,创建一个用户进程来执行相应的用户任务。*
(1)连接:是一个用户进程与数据库实例之间的一条通信路径,这条通信路径通过操作系统平台中的进程间通信机制或网络连接来实现。
(2)会话:是一个用户到数据库的指定连接。例如当-一个用户启动SQL*Plus,并输入正确的用户名和密码连接到一个数据库库后,就为该用户创建了一个会话。会话在用户连接到实例的过程中始终存在,直到用户断开连接或终止应用程序为止。
会话是通过连接来建立的;同一个用户可以通过建立多个连接来创建到Oracle数据库的多个会话。

服务器进程

  1. 服务器进程就是代表客户会话完成工作的进程。
  2. 负责在用户进程和Oracle实例之间调度请求和响应。
  3. 应用向数据库发送的SQL语句就是由这些进程接收并执行当用户进程提交查询之后,服务器进程则负责执行该查询语句,即将数据从磁盘读入缓存,获取查询结果,然后向用户进程返回结果。
  4. 即使响应出现了某些错误,服务器进程也会把错误信息发回用户进程,以便用户进程进行合适的处理在Oracle数据库中可以同时存在两种类型的服务器进程:
  • 专用服务器进程:只能为一个用户进程提供服务。
  • 共享服务进程:可以为多个用户进程提供服务。

后台进程
Oracle实例包括两部分:SGA和一组后台进程

在任意一个刻Oracle数据库可以处理多个并发用户请求,进行复杂的数据操作,与此同时还要维护数据库系统使其始终具有良好的性能。
为了完成这些任务,Oracle具有一组后台进程保证数据库运行所需的实际维护任务


Oracle的实例所必需的后台进程:

  • DBWR (数据写 进程)
    • 该进程将缓冲区用户所使用的数据写入数据文件。使用户进程总是可以得到未用的缓冲区
  • LGWR (日 志写进程)
    • 向在线重做日志文件中记录所有数据库的已提交事务处理,它会在以下四种情况中执行写入操作
  • 事务处理进行提交
      • 重做日志缓存已经填充1/3
      • 重做日志缓存中的数据数量达到1MB
      • 每3秒的时间
  • CKPT(检查点进程)
    • 该进程在检查点出现时,对全部数据文件的标题进行修改,在通常的情况下,检查点进程是不启动的它的工作由日志写入进程LGWR执行。然而,如果检查点明显地降低系统性能时,CKPT进程就会运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现
  • SMON ( 系统监视进程)
    • 在出现实例故障的情况下,SMON负责重 新启动系统,执行崩溃恢复。
    • SMON将会清除已经分配但还没有释放的临时段。
    • SMON也会在表空间管理中执行盘区结合。
  • PMON (进 程监视进程)
    • 监控服务器进程,以确保能够销毁发生损坏或者出现故障的进程,释放它们的资源。在主机操作系统上使用0racle监听器注册数据库服务器。
  • 此外,常用的其他进程:
  • ARCn (归档进程)
    • 将重做日志的事务变化写入归档日志
    • 在重做日志文件中的事务处理被覆盖之前保存重做日志文件
  • RECO (恢复进程)
  • Dnnn (调度进程)

数据字典

数据字典是由一系列对于用户而言是只读的基础表和视图组成,它保存了关于数据库本身以及其中存储的所有对象的基本信息。
对数据字典的管理和维护由Oracle系统负责,任何数据库用户都无法对数据字典中的内容进行修改,但是用户可以查看数据字典中的内容。
数据字典中的信息是通过表和视图的形式组织起来的,数据字典和视图都保存在SYSTEM表空间中。视图好比一本关于当前Oracle数据库的参考手册,可以通过SELECT语句查询。

Oracle中的数据字典有静态和动态之分:

  • 静态数据字典:在用户访问数据字典时不会发生改变,主要是由表和视图组成,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图
    • 静态数据字:典中的视图分为三类,它们分别由三个前缀够成:user_、all_、 dba_ *
    • 动态数据字典:依赖数据库运行的性能的,反映数据库运行的一些内在信息,会不断进行更新

静态数据字典3类视图:

  • user_ *
    • 该视图存储了关于当前用户所拥有的对象的信息。(即所有在该用户模式下的对象)
  • all_ *
    • 该视图存储了当前用户能够访问的对象的信息。(与 user_ *相比all_ *并不需要拥有该对象,只需要具有访问该对象的权限即可)
  • dba_ *
    • 该视图存储了数据库中所有对象的信息。(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限)

数据字典查询举例:

查看当前用户的用户名、 缺省表空间:
SQL> select username,default_ tablespace from user_ _users;
查看用户下所有的表
SQL>select * from user_ tables;
查看当前用户的角色:
SQL >select * from user_ role_ _privs;
查看当前用户的系统权限和表级权限:
SQL>select * from user_ sys_ privs;
sQL>select * from user_ _tab_ _privs;
查询当前用户有权访问的所有对象的信息:
SQL> select object name, object type from all_ objects;
查询当前用户有权访问的所有表对象的信息:
SQL> select owner, table_ name from all_ _tables;
查询数据库实例中有多少用户:
SQL .>select username from dba_ _users;
显示指定用户所具有的系统权限:
sQL>select * from dba_ sys_ privs where grantee='SCOTT; 

显示特权用户

显示全区存储区SGA的信息

以上是关于Oracle的体系结构的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 数据表误删恢复(转)

Oracle 体系结构

[Oracle]同义词(synonym)

Java重载覆写thissuper抽象类接口

Java中的工厂模式

oracle 修改表结构或修改视图时很慢,直接让PLSQL卡死,不知道是啥原因? 重启oracle 服务却又可以了!