第二章 Oracle体系结构

Oracle数据库系统的体系结构主要讲解Oracle这款DBMS是如何设计和实现的。整体上Oracle数据库分为辅存中的Oracle(一般称为数据库,分为数据库物理存储结构逻辑存储结构)和内存中的Oracle(一般称为实例,分为内存结构和后台进程)。

Oracle数据库体系结构

-----------------------------------------存储结构--------------------------------------------


一 物理存储结构

1. 数据文件

① 数据文件是在物理上保存数据库中数据的操作系统文件,是所有数据的实际存储空间。所有数据文件大小之和构成了数据库的大小。

② 数据文件的特点
(1) 一个数据文件仅与一个数据库联系
(2) 一个表空间由一个或多个数据文件组成
(3) 数据文件可以通过设置其自动扩展参数,实现其自动扩展的功能

③ 数据文件可以分为永久性数据文件和临时性数据文件

④ 用户表中的数据最终存储在数据文件中,但无法指定存储在哪一个数据文件中。(该特点与SQLSever不同,SQLServer可以指定存储数据文件)

⑤ 虽然无法指定,但我们可以通过数据字典dba_data_files或者v$datafile查看数据文件信息。

查看数据文件位置及名称

2. 控制文件

① 控制文件是一个记录数据库结构信息的重要的二进制文件,用于描述和维护数据库的物理结构。由Oracle系统进行读写操作,DBA不能直接操作控制文件。

② 控制文件存放了数据库数据文件和日志文件的信息。
③ 数据库启动时,根据初始化参数文件的CONTROL_files参数找到控制文件,然后根据控制文件中的信息,进行数据库数据文件和重做日志文件的加载,最后打开数据库。

④ 一个数据库至少需要一个控制文件,如果控制文件损坏将导致数据库无法启动。(SQLsever中一个数据库只需要日志文件和主数据文件,其中主数据文件包含了控制文件的内容。)

⑤ 查看控制文件中的信息

通过数据字典视图v$controlfile查看控制文件信息。

3. 重做日志文件

① 重做日志文件是以重做记录的形式记录、保存用户对数据库进行的变更操作,是数据库中最重要的物理文件

② 对于"最重要的物理文件"的理解
重做日志文件可以进行事务的重做(Redo)或回退(Undo),是数据库实例恢复的基础。如果现在有数据修改,数据文件只能记录修改之后的数据,而重做日志文件不仅记录修改之前的数据,还记录修改之后的新数据,因此重做日志文件的内容更多,若数据库发生故障,重做日志文件就可以发挥其作用了。

③ 通过数据字典视图v$logfile查看重做日志文件信息
联机日志文件和归档日志文件
归档模式

④ 通过v$log查看日志文件组

4. 归档重做日志文件

5. 初始化参数文件

① 初始化参数文件是数据库启动过程所必需的文件,记录了数据库显式参数的设置。
② 数据库启动的第一步就是根据初始化参数文件中的设置,创建并启动实例,即分配内存空间、启动后台进程
③ 参数文件主要包括了数据库名和控制文件所在路径。参数文件分为文本参数文件和服务器参数文件。

6. 跟踪文件

跟踪文件是数据库中重要的诊断文件。
跟踪文件中包含数据库系统运行过程中所发生的重大事件的有关信息,可以为数据库运行故障的解决提供重要信息。

7. 警告文件

警告文件是特殊的跟踪文件。
警告文件也是数据库中重要的诊断文件,记录数据库在启动、关闭和运行期间后台进程的活动情况。
在数据库出现故障时,应首先查看该文件,但文件中的信息与任何错误状态没有必然的联系。

8. 口令文件

二 逻辑存储结构
Oracle数据库逻辑存储结构

1. 表空间

① 表空间是Oracle数据库最大的逻辑存储单元,一个表空间由多个段组成。

② 表空间与数据库文件直接关联,一个表空间包含一个或多个数据文件,一个数据文件只能从属于某一个表空间,数据库对象就是存储在表空间对应的一个或多个数据文件中。

③ 一个数据对象(例如:表、视图等)也要存储在一个表空间中。数据库的大小从逻辑上等于所有表空间大小之和。表空间的大小等于构成表空间的所有数据文件之和。

表空间的分类

  • 系统表空间
    1)System表空间
    system表空间主要存储:
    a. 数据库的数据字典
    b. SQL程序源代码和解释代码,包括存储过程、函数、包、触发器等;
    c. 数据库对象的定义,如表、视图、序列、同义词等。
    system表空间

    2)SysAUX表空间
    SYSAUX表空间是辅助系统表空间,主要用于存储数据库组件等信息,以减小SYSTEM表空间的负荷。
    sysaux表空间
  • 非系统表空间
    1)撤销表空间(undotbsl)
    专门进行回滚信息的自动管理,由UNDO_TABLESPACE参数设置。

    撤销表空间

    2)临时表空间(temp)
    专门进行临时数据管理的表空间。
    在数据库实例运行过程中,执行排序等SQL语句时会产生大量的临时数据,这些临时数据将保存在数据库临时表空间中。 临时表空间专门用于排序的。

    临时表空间

    3)用户表空间(users)
    保存用户数据

    用户表空间

    4)示例表空间(example)

    示例表空间

  • 大文件表空间与小文件表空间

表空间的查询

2. 段

① 段是由一个或多个连续或不连续的区组成的逻辑存储单元,是表空间的组成单位。使用段的目的是用来保存特定对象。
② 段的种类有四种
(1) 数据段(表段)
数据段用来存储表或簇的数据,可以细分为表数据段索引表数据段、分区表数据段及簇数据段四种。

数据段

(2) 索引段
用来存放索引信息,主要包括存储ROWID(行ID)索引键

索引段与其相应的表段经常会被同时访问,为了减少硬盘访问的冲突,索引段与数据段可以放到处于不同物理位置的表空间中。

索引段

(3) 临时段
当用户进行排序查询时,如果在指定的内存无法完成排序,Oracle将自动从用户默认的临时表空间中指派临时段进行排序。会话结束,数据将从临时段中自动删除。

临时段

(4) 回退段
回滚段用于保存数据库的回滚信息,包含当前未提交事务所修改的数据的原始版本

一个事务只能使用一个回滚段存放它的回滚信息,但是一个回滚段可以存放多个事务的回滚信息。回滚段可以动态创建和撤销。

回滚段的作用:

  • 事务回滚(Transaction Rollback)
    事务提交若出现故障,可以通过回滚段将事务返回Undo(撤销)队列或者Redo(重做)队列中。
  • 读一致性(Read Consistency)
    出现"污读"情况时,发生"脏数据"。Oracle数据库通过回滚段来防止污读情况的出现,实现读一致性。
  • 事务恢复(Transaction Recovery)
  • 闪回查询(Flashback Query)
    回滚段

3. 区

① 区是由一系列连续的数据块构成的逻辑存储单元,是存储空间分配的最小单位
② 当创建一个数据库对象时,Oracle为对象分配若干个区,以构成一个段来为对象提供初始的存储空间。当段中已分配的区都**写满后,Oracle会为段分配一个新区,以容纳更多的数据。
一个数据块只能属于一个区。

区的分配
可以通过使用UNIFORM选项,指定所有段的初始区和后续区具有统一大小
可以使用AUTOALLOCATE选项指定由Oracle自动决定后续区大小。
用户不能通过其他参数来干预区的分配。

区的分配方式

⑤ 通常分配给对象的区将一直保留,不论区中的数据块是否被使用。只有当对象被删除时,区才会被回收

4. 数据块

最小的I/O单元,每次读取都是以数据块为单位的,读取时不足一个数据块,则按一块为单位。
包括一个或者多个OS BLOCK(操作系统块)
在数据库创建时设置,不可更改。数据块的大小由DB_BLOCK_SIZE参数设置标准块。
分为标准块和非标准块。具有标准大小的数据块为标准块。
查看标准块大小:

标准块大小

数据块的结构
数据块结构

(1) 块头部包括标题表目录行目录三部分。
标题包含块的一般属性信息,如块的物理地址、块所属段的类型等;
表目录包含数据块中保存的表的信息;
行目录包含数据块中的行地址等信息。
头部信息区

(2) 行空间
行数据区是已经使用的空间,保存数据库的对象数据。是真正存放表数据和索引数据的地方。

(3) 空闲空间
空闲区是尚未使用的存储空间,用于新行的插入或用来更新已存在的行。

数据块的管理
(1) 行链接
当向表格中插入数据时,如果行的长度大于块的大小,行的信息无法存放在一个块中,就需要使用多个块存放行信息,将多余的行信息存放于另一个块中,再用指针链接,这称为行链接。

(2) 行迁移
当表格数据被更新时,如果更新后的数据长度大于块长度,Oracle会将整行的数据原数据块迁移到新的数据块中,只在原数据块中留下一个指针指向新数据块,这称为行迁移。

(3) 对块的管理主要是对块中可用存储空间的管理,确定保留多少空闲空间,避免产生行链接、行迁移而影响数据的查询效率。
对块的管理分为自动手动两种。

  • 自动管理
    如果建立表空间时使用本地管理方式,并且将段的管理方式设置为AUTO,则采用自动方式管理块。
  • 手动管理
    DBA可以采用手动管理方式,通过为设置PCTFREE(percent free 空闲率)PCTUSED(percent used使用率)两个参数来控制数据块中空闲空间的使用。数据块状态:空闲Free,使用Used。
    1)PCTFREE
    空闲率指定块中必须保留的最小空闲空间比例
    当数据块的自由空间百分率低于PCTFREE时,此数据块被标志为USED,此时在数据块中只可以进行更新操作,而不可以进行插入操作。该参数默认为10。
    2)PCTUSED
    使用率指定可以向块中插入数据时,块已使用的最大空间比列
    当数据块使用空间低于PCTUSED时,此块标志为FREE,可以对数据块中数据进行插入操作
    反之,如果使用空间高于PCTUSED,则不可以进行插入操作
    该参数默认为10。
    举例
    文字理解
    注意:数据块不能添加数据,但可以更新数据。

--------------------------------------------内存体系-----------------------------------------
Oracle数据库系统结构(体系结构)的核心是内存体系和存储结构。本次课主要学习Oracle的内存体系,分为Oracle内存结构Oracle进程结构两部分。
内存结构核心是共享的SGA(描述内存中各种数据存储结构),还包括进程私有的PGA。
进程结构则以Oracle后台进程为核心,还包括服务器进程和用户进程。

三 内存结构

实例:由系统全局区SGA和后台进程组成,是内存结构的核心。

内存结构
内存结构2

1. 系统全局结构(System Global Area,SGA)

SGA是由Oracle分配的共享内存结构,包含一个数据库实例的数据控制信息
SGA数据供所有的服务器进程后台进程共享,所以SGA又称为共享全局区(Shared Global Area)

  • ① 数据高速缓冲区
    1)数据高速缓冲区的功能
    a.存储从数据文件中读取出来的数据拷贝。应用程序要访问的数据必须从磁盘的数据文件读到数据缓冲区中处理。(从数据文件读取的数据要放在内存中的数据高速缓冲区)
    b.在数据缓冲区中被修改后的数据DBWR进程写到硬盘的数据文件中永久保存。(缓冲区相当于一个车间,在缓冲区中对数据进行处理,然后才写入仓库即数据文件)
    c.提高获取和更新数据的性能。(减少了对磁盘的IO操作)
    2)工作过程

3)类型
a.脏缓存块(Dirty Buffers):脏缓存块中保存的是已经被修改过的数据。
b.空闲缓存块(Free Buffers):空闲缓存块中不包含任何数据,它们等待后台进程或服务器进程向其中写入数据。
c.命中缓存块(Pinned Buffers):命中缓存块是那些正被使用的数据块,同时还有很多会话等待修改或访问的数据块。
d.干净缓存块(Clean Buffers):干净缓存块是指那些当前没有被使用,即将被换出内存的缓存块。
4)大小
数据高速缓冲区越大,用户需要的数据在内存中的可能性就越大,即缓存命中率越高,从而减少了Oracle访问硬盘数据的次数,提高了数据库系统执行的效率。
然而,如果数据高速缓冲区的值太大,Oracle就不得不在内存中寻找更多的块来定位所需要的数据,反而降低了系统性能。显然需要确定一个**合理的数据高速缓冲区大小。 **
DB_CACHE_SIZE(标准块的缓冲区大小8k)

  • ② 重做日志缓冲区
    1)重做日志缓冲区的功能
    a.用于缓存用户对数据库进行修改操作时生成的重做记录
    b.为了提高工作效率,重做记录并不是直接写入重做日志文件中,而是首先被服务器进程写入重做日志缓冲区中,在一定条件下,再由日志写入进程(LGWR)把重做日志缓冲区的内容写入重做日志文件中做永久性保存。
    归档模式下,当重做日志切换时,由归档进程(ARCH)将重做日志文件的内容写入归档文件中,即当前日志文件写满了,LGWR将会切换一个文件写入,即日志切换,然后原来已经写满的文件就由Oracle保存到指定路径,即归档。
    非归档模式下,假设有3个日志文件,LGWR写满第1个就切换到第2个,写满第2个切换到第3个,当第3个写满了之后,又重新切换到第1个日志文件进行写入,将覆盖掉原来第1个文件的内容。

    2)工作过程
    工作过程

    3)大小
    LOG_BUFFER参数
    较大的重做日志缓冲区,可以减少对重做日志文件写的次数,适合长时间运行的、产生大量重做记录的事务

  • ③ 共享池
    1)共享池的功能
    共享池用于缓存最近执行过的SQL语句、PL/SQL程序和数据字典信息,是对SQL语句、PL/SQL程序进行语法分析、编译、执行的区域。

    2)组成
    a.库缓存
    库缓存用于缓存已经解释并执行过的SQL语句和PL/SQL程序代码,以提高SQL或PL/SQL程序的执行效率。
    包括SQL工作区PL/SQL工作区
    举例:实际上不是保存整条SQL语句,而是保存相似的语句结构。查询成绩select * from 成绩表 where 学号=…; 其中select * from 成绩表是每个学生操作的相似结构,这时将语句结构保存,而学号则作为一个变量来处理。
    b.数据字典缓存区
    数据字典缓存区保存最常用的数据字典信息(如表、字段)
    举例:select empno from emp。首先会在数据字典上查询emp表,查询到就保存在该数据字典缓存区中,之后查询都首先在该缓存区查找。(字段也是)

    3)大小
    SHARED_POOL_SIZE查看共享池大小。
    合适的共享池大小,可使编译过的程序代码长驻内存,大大降低重复执行相同的SQL语句(相同结构)、PL/SQL程序的系统开销,从而提高数据库的性能。

  • ④ 大型池
    1)功能
    大型池是一个可选的内存配置项,主要为Oracle多线程服务器、服务器I/O进程、数据库备份与恢复操作、执行具有大量排序操作的SQL语句、执行并行化的数据库操作等需要大量缓存的操作提供内存空间。(即大量/临时数据可以保存在大型池)
    如果没有大型池,上述操作所需要的缓存空间将在共享池或PGA中分配,因而影响共享池或PGA的使用效率。
    2)大小
    LARGE_POOL_SIZE查看

  • ⑤ Java池
    1)功能
    Java提供对Java程序设计的支持,用于存储Java代码、Java语句的语法分析表、Java语句的执行方案和进行Java程序开发。
    2)大小
    JAVA_POOL_SIZE
    通常不小于20M,以便安装Java虚拟机

  • ⑥ 流池
    1)功能
    流池是一个可选的内存配置项,用于对流的支持。
    2)大小
    STREAMS_POOL_SIZE

2. 程序(私有)全局区(Program/Private Global Area,PGA)

PGA是一个私有的内存区,不能共享,每个服务器进程只能访问自己的PGA,因此PGA又称为私有全局区(Private Global Area)。PGA不在实例中。

系统同时为每个后台进程分配私有的PGA区。(不是只有服务进程有PGA)
所有服务器进程PGA与所有后台进程PGA大小的和,即为实例的PGA的大小。

PGA随着服务器进程与后台进程的启动而分配,随着服务器进程和后台进程的终止而被释放。

① 排序区
存放排序操作(如创建索引、分组、多表连接)所产生的临时数据。(优先用大型池保存临时数据,没有才用PGA和共享池)

② 游标区
存放执行游标操作时所产生的数据。

③ 会话区
保存用户会话所具有的权限、角色、性能统计信息。

堆栈区(重要)
用于保存会话过程中的绑定变量、会话变量等私有信息。
如上面的select * from 成绩表 where 学号=101,这里的学号就是所说的绑定变量或会话变量。

3. 查看内存参数

查看SGA的基本信息

  • 使用V$SGAINFO视图查看SGA基本信息
  • 使用show parameters 参数名 查看
    比如
    SQL>show parameters log_buffer

    log_buffer

    查看日志缓冲区大小
    SQL>show parameters db_cache_size
    查看数据高速缓冲区,结果为0表示本实例采用了内存自动管理
    SQL>show parameters size(如果不知道具体名称可以用size)
    查看所有带size的参数

    SQL>show parameters
    查看所有参数
    为什么用v$sgainfo查询的高速缓存区是1275068416,而size里面的却是0?
    这是因为Oracle的默认模式是内存自动管理模式(自动分配管理)。show里面查询的是我们原始设置的参数大小,v$sgainfo是当前的内存大小分配,由系统自动调整。

四 进程结构

1. 进程结构的介绍

进程是操作系统中一个独立的可以调度的活动,用于完成指定的任务。进程与程序的区别在于:
① 进程是动态的概念,即动态创建,完成任务后立即消亡;而程序是一个静态实体。
② 进程强调执行过程,而程序仅仅是指令的有序集合。

类型:
用户进程
服务器进程
后台进程

2. Oracle服务进程

① 专用服务器进程
只能为一个用户进程提供服务。

专用服务进程
(1)用户进程向一个数据库实例发出连接请求。
(2)位于数据库服务器中的Oracle监听程序探测到用户进程请求后,首先验证用户进程提供的用户名和口令,验证通过后建立一个专用的服务器进程为该用户进程提供服务。
(3)用户提交一条SQL语句。
(4)专用服务器进程首先判断在共享池中是否存在类似的SQL语句。如果不存在,将为这条SQL语句保存到共享池,然后解析该语句。在解析过程中,服务器进程将检查该语句的语法正确性。同时,该语句的私有数据和信息保存到服务器进程的PGA中。
(5)解析完成后,服务器进程开始在数据高速缓冲区中寻找SQL语句所要求的数据。如果数据不在数据高速缓冲区中,还需要从数据文件中将所需要的数据读取到数据高速缓冲区中,同时返回给用户
(6)服务器进程执行SQL语句。如果SQL语句要对数据进行更改仅在数据高速缓冲区中对缓存块进行更改,并将更改所生成的重做记录保存在重做日志缓存区中。将来,由LGWR进程将重做记录写入重做日志文件,再由DBWR进程将脏缓存块写入数据文件。
(7)执行完毕后,服务器进程将结果返回给用户进程。

② 共享服务器进程
可以为多个用户进程提供服务。

共享服务进程
(1)在客户端创建一个用户进程,连接数据库。
(2)位于服务器中的Oracle监听程序探测到用户进程请求后,首先验证用户进程提供的用户名和口令,验证通过后将该用户进程分配给一个调度进程。
(3)用户进程直接调度进程(可能有多个)进行交互。
(4)用户提交一条SQL语句,调度进程对SQL语句进行处理,然后将处理结果放入位于SGA中的一个“请求队列”(只有一个)中,同时将调度程序ID也存入请求队列。
(5)当某个共享服务器(多个)进程空闲时,从“请求队列”中取出一条处理后的SQL语句,并对该语句进行解析和执行,得到它所请求的数据。
(6)共享服务器进程将处理结果放入SGA中的一个“响应队列”(有多个)中。每个调度进程都有一个对应的“响应队列”。
(7)调度进程定期检查自己的“响应队列”,如果发现有自己送出请求的处理结果,则将结果取出。调度进程根据处理结果中保存的调度程序ID来标识该结果是否是自己的。
(8)调度程序将处理结果返回给用户进程。

3. 后台进程

① DBWR进程(数据库写入进程)

  • 把数据高速缓冲区中已经被修改过的数据(脏缓存块)成批写入数据文件中永久保存,同时使数据高速缓冲区有更多的空闲缓存块,保证服务器进程将所需要的数据从数据文件中读取到数据高速缓冲区中,提高缓存命中率。
  • 启动DBWR进程
    a.执行INSERT、UPDATE等操作时 ,没有足够的空闲块
    b.当检查点发生时,将启动DBWR进程
    c.当数据缓存的LRU列表的长度达到初始化 DB_BLOCK_WRITE_BATCH指定值的一半时。
    d.若发生超时(大约3秒未被启动)

② LGWR进程(日志写入进程)

  • 日志写入进程负责把重做日志缓冲区的重做记录一次性写入重做日志文件中永久保存。
  • 启动LGWR进程
    a.用户通过COMMIT语句提交当前事务:事物对应两种数据,一种是日志数据信息、一种是脏缓存块中的用户数据。提交后,前者直接由LGWR写入日志文件,而后者则是还存在高速缓存区中,当条件满足后,由启动DBWR进程确定。
    b.重做日志缓存被写满三分之一(假如日志缓存区90MB,第一个事物是29MB,则不会启动,仍可以写入缓存区,但第二个事物是60MB,超过30MB,马上启动全部写入)
    c.DBWR进程开始将脏缓存块写入数据文件时
    d.每隔3秒,即发生一次超时,将启动LGWR

③ CPKT进程(检查点进程)

  • 检查点概念
    检查点是一个事件,①当该事件发生时(每隔一段时间发生),DBWR进程要把数据高速缓冲区中脏缓存块写入数据文件中,这时,会使得LGWR进程启动,则会先写重做日志缓冲区,再脏缓存块写入数据文件。②同时Oracle将对数据库控制文件和数据文件的头部的同步序号进行更新,以记录下当前的数据库结构和状态,保证数据的一致性
  • CKPT进程的作用
    a.更新控制文件与数据文件的头部,使其同步
    b.触发DBWR进程,将脏缓存块写入数据文件(会先调用LGWR进程)

④ SMON进程(系统监控进程)

  • 功能
    a. 实例恢复

    • 执行前滚(ROLL FORWARD),将重做日志信息已经写入到重做日志文件中但还数据还没有写入到数据文件中的已提交的数据写入到数据文件。
    • 在前滚完成后立即打开数据库。此时用户可以连接数据库,但此时数据文件中可能存在一些没有提交的数据需要回滚
    • 回滚没有提交的事务

    b. 回收不再使用的临时空间。
    c. 将各个表空间的空闲碎片(空闲块)合并(表空间的存储参数PCTINCREASE不为0时)
    因为块必须是连续的,因此中间的块若有数据删除,则产生空闲,这时就可以用SMON进程合并这些空闲块。

⑤ PMON进程(进程监控进程)
负责恢复失败的用户进程或服务器进程,并且释放进程所占用的资源

清除非正常中断的用户进程留下的孤儿会话回退未提交的事务释放会话所占用的锁、SGA、PGA等资源。

监控调度进程和服务器进程的状态,如果它们失败,则尝试重新启动它们,并释放它们所占用的各种资源。

⑥ ARCH进程(归档进程)
归档进程负责在日志切换后将已经写满的重做日志文件复制到归档目标(一个磁盘路径)中,防止写满的重做日志文件被覆盖

⑦ RECO进程(恢复进程)
RECO进程负责在分布式数据库环境中自动解决分布式事务的故障。一个节点的RECO自动解决所有的悬而未决的事务。当一个数据库服务器的RECO后台进程试图建立同一远程服务器的通信,如果该远程服务器不可用或者网络连接不能建立时,RECO自动地在一个时间间隔之后再次连接。

⑧ LCKn进程(锁进程)
LCKn进程用于Oracle并行服务器环境中。在数据库中最多可以启动10个LCKn进程,主要用于实例间的封锁(锁的是实例)

⑨ Dnnn(调度进程)
Dnnn进程是多线程服务器(Multithreaded Server,MTS)的组成部分,以后台进程的形式运行。调度进程接受用户进程请求,将它们放入请求队列中,然后为请求队列中的用户进程分配一个服务器进程。最后,从响应队列返回数据给用户进程

-----------------------------------学习Oracle的数据字典--------------------------------
前面课程已经学习了Oracle数据库系统的体系结构,但是针对一个具体的Oracle数据库,我们应该如何获知该数据库的结构信息呢?一条记录是如何在Oracle内部被存储管理的呢?本次课主要学习Oracle的数据字典,然后利用Oracle的数据字典来查看一条记录是如何存储的

五 数据字典

数据字典是只读的,只能由Oracle系统才能对字典管理维护
数据字典表 和 视图 都属于sys用户存储于system表空间
(注意:系统表空间不止包括system表空间)

Oracle数据字典保存数据本身的系统信息以及所有数据库对象信息。

1.保存数据库对象的定义信息。表、视图、索引、同义词、序列、存储过程、函数、包、触发器及其他各种对象。
2.数据库存储空间分配信息。
记录数据库对象分配了多少个区、使用了多少空间(区)
3.数据库安全信息。用户、权限、角色、完整性
4.数据库运行时的性能(SGA分配合理?与PGA够大?)和统计信息。
5.其他数据库本身的基本信息。


数据字典用途

1.Oracle通过访问数据字典判断
用户权限的合法性
模式对象的存在性: 表存在不存在
存储空间的可用性 配额:给存储空间分配的额度。
在user表空间中(insert ... into emp ) 假设用户HR有权限添加
仅仅有权之外,还受制于用户在user表空间的配额。假如分配的配额是1M,那么每次只能最大添加1M。
另一种含义:支持系统可以性,表空间如果脱机、查询不了数据。

2.使用DDL语句修改数据库对象后,Oracle将在数据字典中记录所做的修改。
3.任何用户都可以从数据字典只读视图中获取各种数据库对象信息。
4.DBA可从数据字典动态性能视图中获取数据库的运行状态,作为进行性能调整的依据。


数据字典的结构

分为:
数据字典表数据字典视图

按数据字典对象的虚实性不同(数据字典的可变性),分为
静态数据字典(数据不变)动态数据字典(实时记录数据变化,数据可变)

2*2 = 4 一共得到四种数据字典
1.静态数据字典表
在数据库创建过程由sql.bsq自动创建。由sys所有。
$结尾,如tab$。只有Oracle才能读写,用户不能读,不直接使用。

2.静态数据字典视图
该数据字典是用户该使用的。
为了用户可读,可使用静态数据字典视图。
catalog.sql脚本创建的静态数据字典视图和其别名。
如user_tables,由 _组成。

3.动态数据字典表
动态数据字典表是在数据库实例运行过程中由Oracle动态创建和维护的一系列“虚表”,在实例关闭时被释放。
“虚表”,系统使用、用户不使用,以X$开头,由sys用户所有。

4.动态数据字典视图
v$开头,用户可以使用,主要是管理员使用。动态性能视图又称为V$视图,如动态性能视图V$DATAFILE


数据字典的使用

查询数据字典信息
dictionary 获取表或试图的名称和解释
dict_columns 获取的是表或视图中 字段 的名称和解释 大写


1.静态数据字典表的使用
用户不能对这些表直接操作。
2.静态数据字典视图
通常,用户通过对静态数据字典视图的查询可以获取所需要的所有数据库信息。

user_ 当前数据库用户 所拥有的 所有模式对象 的信息
all_ 当前数据库用户 可以访问 的所有模式对象的信息
user是all的子集
dba_ 包含了所有数据库对象信息,只有具有DBA角色的用户才能够访问这些视图


3.动态性能表使用
都属于sys用户,用户不能使用。

4.动态性能视图的使用
动态性能视图是SYS用户所拥有的,在默认情况下,只有SYS用户和拥有DBA角色的用户可以访问。
不同模式下,执行同一数据库的数据字典视图,信息可能不同。
不同状态下,能使用的数据字典视图不一样。
nomount下,打开了初始化参数文件,可以使用与参数相关的视图。
mount下,打开了控制文件,记录了数据库信息,可以访问与数据库相关的视图
open下,可以访问表了。

-----------------------------------------------------------------------------------------------------------------------------

Oracle体系结构总结

一个数据库分两大部分
实例存储结构

存储结构主要是物理存储结构
数据文件 控制文件 重做日志文件 归档文件

实例
后台进程:DBWR CKPT LGWR ARCH SMON PMON
实例内存结构SGA:数据高速缓冲区 日志缓冲区 共享池 大型池 Java池 流池 其他

用户进程发出请求,让服务器进程接收,然后服务器使用实例。
查询操作select
服务进程 到 数据高速缓冲区 查找 找到了返回给服务器进程,再给用户进程。
若找不到,服务进程则会通过 数据字典 打开数据文件,以块为单位读出数据块,把这些块放入数据高速缓冲区
然后服务进程同时返回信息给用户进程。

修改操作updata
前提:数据高速缓冲区由DL(脏缓存块列表,存放脏缓存块的块号)LRU(最近最少列表) 管理。
服务进程先找到数据高速缓冲区,找到了,在数据缓冲区进行修改,写入脏缓存块,然后将脏缓存块放入DL。

若要再修改下一个update,发现数据缓冲区没有空闲
会再修改之前先生成重做日志记录信息写入日志缓冲区
写完再修改缓存块,再将缓存块的地址放入DL,
最后会启动DBWR,将缓冲区数据写入数据文件。

CKPT发生时,会启动DBWR,要求DBWR将全部脏缓存块写入数据文件,
但DBWR启动之前,DBWR会要求LGWR启动先将对应的日志缓存信息写入到重做日志文件
LGWR写一半时,发现重做日志文件写满了
则在归档模式下,ARCH进程会启动,将写满的重做日志文件在另一个路径下写入归档文件,
然后LGWR会继续写入日志缓冲区,写完后,DBWR将全部脏缓存块写入数据文件,
DBWR写完之后,CKPT会在数据文件、控制文件、重做日志文件(非必须)的头部写入同步序列号
若发现序列号不同,则用归档文件恢复。

多表查询下,会生成大量临时数据。
此时,若有大型池,先用大型池,
若无,则用服务进程的PGA的排序区,若不够用
则共享池中存放,也可以使用临时表空间。

逻辑存储结构 与 物理存储结构


结合案例更明晰。

你可能感兴趣的:(第二章 Oracle体系结构)