[转]oracle学习入门系列之五内存结构、数据库结构、进程

时间:2024-01-01 14:21:09

原文地址:http://www.2cto.com/database/201505/399285.html

1 Oracle数据库结构

关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大师们的讲稿。但是我们不去管那些,按照我们自己节奏记出特性、记出精彩来。

首先插入本系列第一张图片,图一(绝对来自官网),看蛤蟆对于图片使用是多么小心的,如果大伙对这个图已有自己独到的理解,那么可直接跳过本篇笔记吧,当然温故而知新也未尝不可,知耻而后勇….额,而来知耻?

1.1 总体结构

这个图1从总体上描述了Oracle数据库的大概了,包含有内存结构,数据库文件,进程及客户端。虽然不是非常详细但是蛤蟆觉得该图是在是理解ORACLE数据库入门的好图。

[转]oracle学习入门系列之五内存结构、数据库结构、进程

那么我们一起围观下该图到底说了些什么。

服务进程,这里展开就是服务进程是专用服务进程还是共享,后续会慢慢道来。

内存结构,内存结构中主要包含PGA和SGA,PGA是为客户端接入时候服务,SGA是数据库运行服务的,这些在机器下电后就消失了。

还有主要的6个进程PMON,SMON,DBWR,LGWR,CHPT,Arcn,在启动数据库的时候才会有这些进程。

最下面就是存放在持久化介质上文件了,有归档日志,数据文件,参数文件,密码文件等,不随机器下电而消失的。

途中有2个在Oracle中非常重要的概念,实例和数据库:

1.1.1 实例

实例是oracle 创建的进程和内存结构的组合。

1.1.2 数据库

数据库是由一组文件组成的,对数据库的所有操作都是需要通过实例来完成了。通常数据库和实例是一一对应的。例外就是RAC了,RAC下一个数据库就对应了多个实例。

实例和数据库关系打个比方就是发动机和汽车的关系。汽车就是数据库,就在那里,但是动不了,只有发动机发动了,汽车才能动起来。一般情况下一个汽车一个单缸发动机;但是也可以是多缸的嘛,如6缸发动机什么的。

接下去看逻辑数据库结构。

1.2 逻辑数据库结构

放入第二章图,如下图2,如来自互联网

[转]oracle学习入门系列之五内存结构、数据库结构、进程

这里需要提一些概念了,都是ORACLE数据库中最基本而且需要一直掌握的概念,是一直,死都不能忘了,如果担心自己忘记就记下来把。这里提到的概念是一通百通的,很多可以适用到其他数据库中的,记住后我们后续学习必将事半功倍。

我们从最下面开始介绍吧,枯燥但不乏味的哈~

1.2.1 数据块

数据块,data block,是oracle数据块的存储基础,有若干字节组成。又是若干,到底是多少个字节呢?一般常用的是8KB,4KB的了,在创建数据库的时候可以 指定。一旦指定就不能改变了,不过即使在4KB的数据库中,我们也可以指定创建8KB的表空间的,只要我们内存结构中存在8KB的缓存。

数据块类似操作系统中的块大小,通常ORACLE数据库块大小会是操作系统块大小的整数倍,其中好处就无需多说了。

蛤蟆自身工作经验来看,在OLTP模型上,4KB、8KB及16KB下性能相差不是特别明显。

不过原则是块尺寸是处理Oracle的更新、选择或者插入数据事务的最小单位,且访问很随机,则选择块较小的块尺寸;如果行比较小且访问主要是连续,或者如果有较大的行,则用较大的块尺寸。

1.2.2 数据区间

区,extent,是两个或者多个相邻的ORACLE数据块,他是空间分配的单元。概念总是如此的明了,3点关键。

a) 2个或2个以上

b) 相邻的数据块

c) 空间分配单元

数据块是存储单元,区是分配单元。看着概念重不重要的,从概念我们就知道,ORACKE分配空间的时候至少2个数据块起步的。要是申请一个数据块,那么不好意思啦,就是不给。

就像小时候向爸爸妈妈要零花钱,

我们:“妈,给我5分钱,买个萝卜丝吃”

老妈:“!@#¥%……,没有5分”

我们:“一毛也行”

老妈:“好吧,又买两包萝卜丝?,给你1毛”

1.2.3 数据段

段是分配给某个逻辑结构的一组区。

2个关键点

a) 分配给某个逻辑结构

b) 一组区

1.2.4 对象

ORACLE数据库对象,主要就是如下10个了。

1) 表

2) 约束条件:保证数据完整性。

3) 视图:虚表,命名的查询语句。

4) 索引:加速查询(加快查询的速度)。

5) 序列:一串连续递增或递减的数字,步长相同,(代理键) 。

6) 同义词:一个对象的另外一个叫法(对象的别名)。

7) 存储过程:用于操作

8) 函数:用作复杂运算的。用于计算。

9) 触发器:由事件触发的存储过程。

10) 包

对数据库的操作可以基本归结为对数据对象的操作,这个对象蛤蟆也不知道如何去定义它。对象也是一个逻辑结构,是建立于段之上的,有头有脸的结构。

1.2.5 表空间

表空间是一组数据文件,通常由相关的段组成。表空间是包含物理数据文件的逻辑实体。表空间存储数据库的所有可用数据。

下节中就能看到表空间和物理数据文件的对应关系。表空间也是一个逻辑结构是,数据库下最大的逻辑结构了。

数据库创建完后会有如下表空间

a) System表空间

b) Sysaux 表空间

c) 撤销Undo表空间

d) 临时temporary表空间

1.3 物理数据库结构

上节介绍了oracle数据库的逻辑结构,那么接下去必须得看下,逻辑结构和物理存储结构是如何对应的。

首先在通常情况下我们可以这样理解,ORAC LE数据库由表空间组成;所以和物理数据库结构相关的从表空间开始了。

先看如下图3

[转]oracle学习入门系列之五内存结构、数据库结构、进程

从上图可以看出,逻辑结构比物理结构复杂了些许。

物理结构上就两个东西 操作系统块和文件。上节中提到数据库块是操作系统块的整数倍,从图中也能反映一二。

这里蛤蟆重点解释下ORACLE数据库中的文件。

1.4 数据文件

数据文件一般是数据库最大的物理存储部分,一个数据文件只能属于一个数据库。一个或者多个数据文件构成成为表空间的实体。

我们创建一个表空间时候,让他拥有一个2G大小的数据文件,那么该表空间就能存放2G大小的数据量,有一天耗尽了这2G,那么再增加一个数据文件给这个表空间,当然也可以扩大原先数据文件的大小。

注意:上篇提到了对象如索引、表等,虽然也是存在表空间所属的数据文件中,但是这些对象本身不会指定要存放在那个数据文件上,数据文件只与表空间关联

数据库中执行如下查看数据文件所在

SQL>selectname from v$datafile;

1.5 控制文件

一看这个文件,蛤蟆就不禁感叹:如此之小,确如此重要啊。小身材,大作用。

这个控制文件,管理了数据库的状态,非常重要,一般管理员都会进行至少3份备份。

控制文件包含了数据文件和重做日志文件的名字、位置、日志序号、备份等详细信息,以及所有重要的SCN(系统更改号)。数据库在操作过程中进程不断的更新控制文件。

控制文件中的检查点信息使ORACLE能确定从联机重做日志文件中需要返回多少以便恢复数据。此外,在启动oracle实例时,通过控制文件,确定数据库操作必须打开的所有数据文件和重做日志文件。

你看,重要不?

查看控制文件所在

SQL>selectname from v$controlfile

1.6 日志文件

日志文件其实准确的是重做日志文件,记录了对数据库做的全部更改,有助于恢复数据库。如果日志文件写满后就会进行归档,归档的日志文件叫做归档重做日志,正在记录的日志文件叫做联机重做日志文件。

Oracle要求数据库至少两个重做日志组,每个至少一个单独的日志文件。在归档的时候当前日志组就不能用了,所以需要有第二个日志组来接上。这样循环,生生不息。

考虑到日志文件恢复数据库的作用,一般建议多路复用重做日志,把日志副本存放到不同的磁盘上,保证不会轻易丢失。

查看重做日志文件所在

SQL>select member from v$logfile;

1.7 其他文件

还有一些文件,蛤蟆先简单带过一下吧,后续咱们再深入之。

SPFILE,PFILE,密码文件,告警日志文件,跟踪文件,备份文件等。

SPFILE是oracle实例的初始化参数,这个文件是二进制文件无法手动编辑,我们可以通过命令从SPFILE来生成PFILE,PFILE可以支持手动编辑。下节中内存结构中的组件大小都可以在SPFILE或者PFILE中进行设定。

密码文件是授予SYSDBA或SYSOPER管理权限的数据库用户名字,和数据库安全相关,后续蛤蟆会和大伙一起捣鼓捣鼓。

告警日志文件,蛤蟆喜欢叫他alert日志。捕捉了oracle实例运行期间的主要更改和事件。包含日志切换、错误、告警和其他信息,也是数据库错问题时候,蛤蟆第一时间查看地方,大伙没事可以进去看看也。Alert日志文件路径:

$ORACLE_BASE/diag/rdbms/[SID]/trace/alert_[SID].log。

跟踪文件,Oracle各类内部结构中所包含的信息转储(dump)到跟踪文件中,以便用户能根据文件内容来解决各种故障。

备份文件,顾名思义,因为备份数据操作得到的文件。

2 内存结构

内存结构也是ORACLE数据库实例的组成部分。这个内存结构可以让用户之间共享可执行代码,可以将数据库更改写入内存区域等,让数据库性能提升好几个数量级。

我们看图4

[转]oracle学习入门系列之五内存结构、数据库结构、进程

一图胜过千言万语啊,一看就明白了数据库内存结构包括PGA和SGA,那么问题来了,具体呢?

2.1 SGA

SGA是实例中最重要的内存部件了,特别是在OLTP数据库系统中,比PGA要大很多。在数据仓库环境下,PGA可能就是更重要的ORACLE内存区域。

2.1.1 数据库缓冲区

保存从文件中读取的数据块副本,提高读取性能。

当然数据库缓冲区本身还可以细化成:可用缓冲区,脏缓冲区,钉住缓冲区。

缓冲区的主要目的是最小数据未命中率和磁盘IO操作。

可以将一个缓冲区分成多个缓冲区提供给不同的对象使用,也可以设置多个数据库块尺寸的缓存区(如4KB,8KB,16KB的)。

2.1.2 共享池

共享池是保持可执行PL/SQL代码和SQL语句,以及数据字典表的信息。其可以分为库高速缓存和字典高速缓存。

注:数据字典是ORACLE维护的一组关键表,包含了又关数据表、用户、权限等重要的元数据。

该池可以减少相同代码的编译,减少硬解析从而减少内存和CPU资源。

蛤蟆就知道了数据字典和库高速缓存的低命中率的解决方法是相同的,即增加共享池的尺寸。

2.1.3 重做日志缓冲区

我们待会回将日志写入进程,因为日志写入进程的刷新频率,该区大小不必太大,基本几M就搞定了。

2.1.4 Java

为JVM何基于JAVA的应用保留。

2.1.5 大池

在使用并行查询时候才需要使用大池。此外使用RMAN和共享服务器配置也需要建议配置大池。

2.1.6 流池

实现在不同数据库之间和不同环境之间共享数据。

2.2 PGA

用户启动会话时为每个用户创建一个程序全局区。PGA保存ORACLE为用户创建的专用服务器进程的数据和控制信息。PGA是独占的不能共享,除非使用一个共享的服务器配置。

PGA可以存放用户的游标,不与其他用户共享,此外还会涉及一些排序类的内存密集型操作。

概念介绍大伙看看乐一乐好了,当前不需要太较真。

3 进程

进程是Oracle数据库实例的一部分,我们说过oracle数据库实例由内存结构和进程组成。

Oracle进程其实可以分为两种,一种是用户进程,用于连接用户和数据库;另一种是oracle进程,用于执行数据库的所有实际操作(读写数据文件,写日志等)。这里蛤蟆来聊聊最主要的几个后台进程,其他的进程咱有机会再说。

进程是什么呢?这个蛤蟆就不说了哈

咱们直接进入正题,如下进程都可以在安装ORACLE数据的系统中执行

#ps –ef | grep ora_

来查看。

3.1 数据写进程 (DBWR)

这个进程的作用是将在内存中的数据写入到磁盘中,使得对数据库的修改持久化。因为考虑到性能问题,并不是对数据库的所有修改多会直接写磁盘,而是保留在内存中,等时机成熟才进行批量刷入到磁盘中,这对性能提升还是大大的。

这个时机就是如下三种情况:

a) 数据库发布检查点

b) 内存缓冲区没有可用空间

c) 3秒

以上3点,任何一点满足即可。

考虑到有些系统每次刷入的数据量较大,ORACLE就支持多个进程一起写。通过在DB_WIRTER_PROCESSES参数在PFILE中设定,前提是系统支持异步IO,不然不如只用一个写进程。

3.2 日志写进程 (LGWR)

类似数据写进程,将重做日志在内存中的缓存写入到磁盘中。这个写特点是100%顺序写。如果日志文件不能被写入,那么数据库就会停止工作了,当然这种情况极小发生。毕竟好端端的怎么会突然不能被写入了呢。

日志写也是有时机的类似数据写进程,这进程有四个机会点了

a) 3秒

b) 缓存区到三分之一

c) 数据写进程触发(先完成日志写进程,方进行数据写进程,针对这个有个写前协议)

d) 事务提交,将提交记录写到重做日志

注意:重做日志文件可能包含提交以及未提交的事务记录。

3.3 系统监控进程 (SMON)

这是系统监控进程了,并非一直工作,周期性巡检。主要处理

a) 实例崩溃重启后,是否一致

b) 合并可用区(我们说过区是相邻的数据块嘛)

c) 清除不必要的临时段

3.4 进程监控进程 (PMON)

这个进程用于清除失败的用户进程,保证数据库释放死进程占用的资源。这个进程和SMON一样,一般是处于不活动的,但是会周期性的进行巡检,类似魔兽世界中猪头监工,不干活,周期性的走走,看看谁在偷懒,偷懒的它就动手。

如果可以蛤蟆也希望变成PMON,SMON,他们两兄弟干活真实轻松啊,一看就是领导。

3.5 检查点进程 (CKPT)

通知数据库写进程,这个还会触发日志写进程的。该进程的作用是同步缓存区高速缓存信息与数据库磁盘上的信息。

该进程具体是做了如下4个事情:

a) 日志缓冲写到日志文件

b) 检查点记录写入日志文件

c) 刷数据缓存到磁盘中

d) 更新数据文件和控制文件的头

3.6 归档进程 (ARCn)

这个进程在系统以归档方式运行时才有,负责将填满的日志文件归档。就是将联机日志文件的内容生成一个归档日志文档。如果需要,可以同时设置多个进行进行归档操作。

这个进程在切换日志的时候开始干活。

如果我们在非归档模式运行,那么压根就没有这个进程了,不过生产系统必须以归档模式运行,不然后果不堪设想,蛤蟆自己玩的系统崩溃也没事的哈哈。

其他进程在此就不啰嗦了,后续自然会涉及。这篇到此结束~如果大伙感兴趣就看下回笔记。