Oracle 服务器由Oracle实例与Oracle数据库组成

Oracle实例(instance),通过ORACLE_SID来引导(Oracle标识)

单实例情况下:Oracle数据库名与Oracle实例名相同且具有唯一性

举例:

三国中,关羽使用青龙偃月刀,吕布使用方天画戟,这就是唯一性身份标识(连游戏里都有***力加成甚至其他特殊效果,别不承认,哈哈),那么青龙偃月刀和方天画戟分别是两个独立的库,他们的ORACLE_SID就分别是关羽和吕布。

另一种情况下,关羽与吕布的坐骑都是赤兔马(貂蝉不算哈,额,貂蝉,有木有),此时赤兔做为唯一库名,但是同时被关羽和吕布两个SID实例调用,因此赤兔马属于RAC(实时应用集群,具有LB+HA双层功效)

Oracle体系结构_第1张图片

单实例情况下,instance(sid)名与数据库是一致的(查询出的库名与表名默认都是大写形式,这是正常的)

Oracle体系结构_第2张图片

RAC集群的第一个节点

Oracle体系结构_第3张图片

RAC集群的第二个节点(可以明显看到,虽然实例名不同,但是库名是一样的,因此,RAC是一个多实例单库的集群数据库模式)

Oracle数据库结构包括内存结构、进程结构、存储结构

Oracle实例等于SGA + 后台进程

Oracle内存结构

Oracle体系结构_第4张图片

上面的图就说明了Oracle的内存结构,其中最重要的两个区域就是SGA与PGA

系统全局区(SGA):由所有服务器进程和后台进程共享

程序全局区(PGA):专用于每一个服务器进程或后台进程。每一个进程使用一个PGA

SGA 是包含实例的数据和控制信息的内存区。

SGA 包含以下数据结构:

数据库缓冲区高速缓存:缓存从数据库检索的数据块

重做日志缓冲区:高速缓存重做信息(用于实例恢复),直到可以将其写入磁盘中存储的物理重做日志文件

共享池:缓存可在用户间共享的各个结构

大型池:是一个可选区域,可为某些大型进程(如Oracle 备份和恢复操作、I/O 服务器进程)提供大量内存分配

Java 池:用于Java 虚拟机(JVM) 中特定会话的所有Java 代码和数据

Streams 池:由Oracle Streams 使用

通过使用Enterprise Manager 或SQL*Plus 启动实例,可以显示为SGA 分配的内存量。

下面具体说一下SGA里的几个重要的池

共享池(Shared_Pool):Oracle会将用户提交来的SQL语句都缓存在内存中。每次处理新的一条SQL语句时,都会先在内存中查看是否有相同的SQL语句。如果相同则可以减少最重要的解析工作(也就是生成执行计划),从而节省了大量的资源;反之,如果没有找到相同的SQL语句,则必须重新从头到尾进行完整的解析过程。这部分存放SQL语句的内存就叫做共享池(Shared Pool)。当然,Shared Pool里不仅仅是SQL语句,还包括管理Shared Pool的内存结构以及执行计划、控制信息等等内存结构。

数据库缓冲区高速缓存(Buffer_Cache):Buffer Cache所能提供的功能主要包括(一些频繁查询的热表可以考虑放在这个区域,这就像现在最火的固态硬盘一个道理,但是频繁DML操作的表不建议放入此处)

通过缓存数据块,从而减少I/O;

通过构造CR块,从而提供读一致×××;

通过提供各种Lock、Latch机制,从而提供多个进程并发访问同一个数据块的功能。

重做日志缓冲区(Log_Buffer):Oracle这种数据库最好的一个运作机制在于先写日志后操作,这样能够有效的确定你运行到了哪一步,方便故障排查与恢复。

为了临时存放所产生的日志信息,Oracle在SGA中开辟了一块内存区域。这块区域就叫做日志缓冲区(Log Buffer),当满足一定条件以后,Oracle会使用名为LGWR的后台进程将Log Buffer中的日志信息写入联机日志文件里。

在10g以后的Oracle版本中,有两个参数可以动态的调整SGA的大小,否则就需要自行设置每个池子的大小(当然,Oracle官方有一套科学的算法)

10g数据库有如下两个参数(在初始化参数文件中设置)

SGA_MAX_SIZE(允许的最大的SGA大小)

SGA_TARGET(SGA分配大小)

到了11g以后不仅可以自动配置SGA,也同时可以分配所有内存了,有如下两个参数(在初始化参数文件中设置)

MEMORY_MAX_TARGET(允许的最大的内存大小)

MEMORY_TARGET(内存分配大小)

进程结构

Oracle体系结构_第5张图片

Oracle的进程包括了上图所述几个主要种类的进程,这里主要说一下后台进程

系统监视器(SMON):出现故障后,在启动实例时执行崩溃恢复任务

进程监视器(PMON):用户进程失败时执行进程清理任务

数据库写进程(DBWn):将修改后的块从数据库缓冲区高速缓存写入磁盘中的数据文件

检查点(CKPT):通过更新数据库的所有数据文件和控制文件指出最新的检查点

日志写进程(LGWR):将重做日志条目写入磁盘

归档进程(ARCn):发生日志切换时将重做日志文件复制到归档存储器

Oracle体系结构_第6张图片

上图包括了所有的后台进程(MMON和MMNL是AWR报告的支持进程),其他一些进程不做详细解释

Oracle存储结构

Oracle体系结构_第7张图片

上图是一个Oracle的物理存储结构

构成Oracle 数据库的文件可分为以下几类:

控制文件:包含有关数据库本身的数据(即物理数据库的结构信息)。这些文件对数据库而言至关重要。没有这些文件,就无法打开用于访问数据库数据的数据文件。

数据文件:包含数据库中的用户数据或应用程序数据。

联机重做日志文件:可用来实现数据库实例恢复。如果数据库已崩溃但未丢失任何数据文件,那么使用这些文件中的信息可以通过实例恢复数据库。

要成功运行数据库,以下附加文件非常重要:

参数文件:用于定义启动实例时如何配置实例。

口令文件:允许用户远程连接到数据库并执行管理任务。

备份文件:用于恢复数据库。当因介质故障或用户错误而损坏或删除了原始文件时,通常需要还原备份文件。

归档日志文件:包含实例生成的数据更改(重做)的实时历史记录。

使用这些文件和数据库备份可以恢复丢失的数据文件。也就是说,使用归档日志可以恢复还原的数据文件。

跟踪文件:每个服务器和后台进程都可以对关联的跟踪文件执行写操作。如果在进程中检测到内部错误,进程就会将关于错误的信息转储到进程的跟踪文件中。写入到跟踪文件中的某些信息专门供数据库管理员使用,另一些信息则供Oracle 支持服务部门使用。

预警日志文件:是特殊的跟踪文件,又称为预警日志。数据库预警日志是按时间顺序列出的消息日志和错误日志。Oracle 建议你查看这些文件。

Oracle体系结构_第8张图片

这是一张逻辑与物理转换的图

Oracle 数据库在逻辑上将数据存储在表空间中,在物理上将数据存储在数据文件中。

表空间:

只能属于一个数据库

包括一个或多个数据文件

可进一步划分为逻辑存储单元

是存储方案对象数据的资料档案库

数据文件:

只能属于一个表空间和一个数据库

是构成表空间的基础文件

数据库、表空间、段(segment)、区(extent)、数据块(block)

1、一个表空间只能属于一个数据库、一个表空间可以包括多个数据文件、一个数据文件只能属于一个表空间

2、一个段可以跨越多个数据文件,普通表就是一个segment、索引也是一个segment

3、segment分配空间的最小单位就是extent,每个segment由一个或者多个extent组成

4、一个extent不能跨越多个数据文件因为一个extent是物理上连续的存储空间

5、一个extent由多个连续的block组成

6、block是oracle I/O的最小单位

下面通俗的话解释一下

数据库,可以看成是我们工作的公司(一般指大型集团性质的公司),表空间是集团下属的各种分公司(以种类划分,比如浪潮集团分为浪潮信息,浪潮服务器,浪潮软件,浪潮通软等),段是分公司下的具体行政划分(比如浪潮总公司,北京分公司,武汉分公司等),区是指各种行政部门(比如市场部,销售部,研发部,技术部等等),块就是苦逼的我们(每个人),人是公司的最小单元,一些相同工种的人构成了区(部门),有些部门人多势众(比如销售部32K,市场部16K),有些部门人则很少(比如人事部4K,财务部2K),而苦逼的我们(系统部,默认8K),这些部门组成了分公司(段),不同的分公司组成行政大区(表空间),不同的行政大区组成了完整的集团公司(数据库),当然,这些都是逻辑结构

一个公司,尤其是集团这种性质的公司,不可能只有一个办公地点,那么,这种实际的办公地点,就是我们的数据文件(什么,你不知道数据文件具体干啥用的,拜托,你在哪里上班啊,你坐的工位,就可以看成是一个OS块,足够的OS块组成的OS文件就是数据文件,数据文件也是OS文件的一种),但是一个办公地点只能被一个分公司注册(道理很简单了,你不可能武汉分公司的办公地点在上海,那样也太不靠谱了,当然,移动表空间这种情况单算,这事以后再说,HOHO)