深度对比Oracle与SQL Server 联系客服

发布时间 : 星期一 文章深度对比Oracle与SQL Server更新完毕开始阅读0b7d1f64910ef12d2bf9e79f

SQL> select value from v$parameter 2 where name = 'service_names'; VALUE

------------------------------------------ yuyu

6. 系统数据库和系统表空间

6.1. 系统数据库

一个SQL Server实例需要有5个系统数据库(2005之前的是4个):master, model, msdb, tempdb和resource,一个Oracle数据库则最少需要3个系统表空间才能正常操作,它们是:SYSTEM, SYSAUX和TEMP。

master和resource数据库集中保存了SQL Server自身管理所需要的所有信息,里面保存了诸如系统配置,数据库列表和文件路径、终结点、连接服务器和用户帐户(或“登录”信息),系统级别的对象存储在只读的数据库”资源(resource)”中。

在Oracle中,SYSTEM表空间等价于master数据库,SYSTEM表空间包含了数据字典(data dictionary),也就是关于Oracle自身的元数据(metadata),这里的数据字典可以和SQL Server中的resource数据库进行类比。到这里你也许猜到了:如果SYSTEM不存在或是损坏了的话Oracle数据库是打不开的。

对于一个SQL Server实例,model数据库用作这个实例中所有新建的数据库的“模板”,对model数据库的任何修改都会反应到之后新建的其它数据库里面。在Oracle中就没有这样的模板,不过在你新建一个表空间的时候,你可以指定这是一个永久的表空间或者是其他类似TEMP和UNDO一样的表空间,永久表空间才是用来保存用户数据的。

SQL Server的tempdb用作整个实例的“试验田”,每次实例重新启动的时候tempdb都会重新创建。Oracle的TEMP表空间的作用类似:用来包括大的排序操作的中间结果。当然SQL Server的tempdb还能用来保存行版本(row versioning)所需要的信息,当行版本启用后,行版本特性可以保证数据库引擎能将数据行的每次的修改记录保留下来,修改之前的行会保存在tempdb里面的版本库中,一般查询会返回一个数据行上最后提交的版本,当一个使用了特定隔离级别的依赖行版本的读操作不再会阻塞其它修改同样数据的事务,这是因为读操作不会在数据行上使用共享锁。不过这个特性需要在单个数据库上单独启用。

Oracle中使用一个单独的表空间——著名的UNDO表空间——来达成同样目的。UNDO表空间保存着被DML语句修改的数据块的读一致性的副本。当用户开始对数据进行修改的时候,修改之前的数据块会被保存到UNDO表空间中,当另外一个用户需要查询这些数据的时候,他取到的实际上是UNDO表空间中查出来的读一致性的版本。不像SQL Server的行版本,Oracle的UNDO不需要启用——因为它是属于Oracle并行访问机制的一部分。

最后一个要介绍的SQL Server中的msdb数据库,SQL Server代理服务需要操作这个库。SQL Server代理负责计划任务、警告、复制、日志传送以及其它的很多东西,代理服务的正常运行离不开msdb数据库。

在Oracle没有明确与mdsb数据对应的东西。SYSAUX表空间也是一个系统表空间,在安装过程中(译注:准确说应该为“数据库创建过程中”)创建,它里面保存了诸如Oracle AWR(Automatic Workload Repository)信息、多维数据和多媒体数据,XML数据库等等。

6.2. 数据库实例结构

6.2.1. Oracle实例结构

当Oracle实例启动之后,所看到的就是在服务器内存上的一个个不同内存块加上产生的与这些内存交互的后台进程。Oracle文档将这些内存结构和进程收的很详细。

由Oracle实例所占用的内存块成为SGA(System Global Area),它的大小可以通过调整Oracle初始化参数(initialisation parameter)进行修改,在SGA里边至少会创建3个不同的区域,它们分别是:

数据块缓存区(Database Buffer Cache)

这里缓存的是数据块。和SQL Server一样,用户不会直接的访问数据文件上的数据:当读取数据时,相关的数据块会从数据文件中拷贝到内存中;修改数据时也是修改内存中的数据,然后再由单独的进程将数据缓存区中被修改的数据写入到数据库中。

重做日志缓存(Redo Log Buffer)

SGA中的这个区域连续的记录着数据缓存区数据修改的记录,重做日志缓存中的内容会被写入到在线日志文件中去。

共享池(Shared Pool)

SGA中有一大块的内存用作共享池,共享池等价于SQL Server中的执行缓存(Procedure Cache)。它的主要作用就是缓存数据库中最近执行过的SQL语句。共享池由下面的模块组成:

数据字典缓存(Dictionary Cache)

数据字典缓存缓存了Oracle最近使用的数据字典信息。 库缓存(Library Cache)

这个区域包含了最近执行的SQL和PL/SQL语句和对应的执行计划。SQL区还能进一步分成共享区和私有区:共享SQL区保存的语句可以由多个用户使用而私有区保存的则是跟各个连接对应的绑定变量的信息。PL/SQL是Oracle对于行业标准SQL的程序扩展,当PL/SQL程序执行时,它的代码会拷贝到库缓存中的共享PL/SQL区中。除了缓存执行代码和执行计划外,库缓存还包含锁、阀以及字符集等信息。

根据你所使用的组件的不一样,Oracle的SGA中也可能存在其它一些可选的内存区域。在Oracle中使用Java应用时要使用到Java池(Java Pool),Oracle内置的备份恢复工具RMAN(Recovery Manager)要用到大池(Large Pool),当使用Oracle高级队列机制时要用到流池(Steams Pool)。

上面介绍的各个内存区域都是属于SGA的一部分,它们是通过一序列的进程(process)来和数据库进行交互。下面就开始介绍包括用户进程和服务器进程在内的Oracle进程了。

当用户或者是应用连接到Oracle数据库时就会产生一个用户进程(user process)。在一个两层的系统架构中,用户进程存在于客户端机器上;而在一个三层的系统架构中,用户进程由中间层产生。一旦用户进程连接到Oracle监听服务(Listener Service)时,监听器就会为这个用户会话产生一个服务器进程(server process)。再说详细点就是,Oracle监听器是一个负责为Oracle处理近来连接的网络组件,监听器本身是一个单独的进程,负责监视着从客户端过来的连接请求,如果监听器没有运行的话,数据库也就无法连接了。一旦连接建立,由监听器产生的服务器进程就开始接手处理用户操作数据库的请求了。大多情况下每个用

户连接会产生一个独立的服务器进程,不过Oracle也能配置成一个运行着多个预先创建好的服务器进程池的模式,此时用户进程连接到数据库实例之后将会直接从进程池中分配一个进程。

任何时候Oracle实例中都会有多个后台进程在运行着,不过,有5个必须要有的。

写数据库(Database Writer)进程或称DBWn负责将数据缓存区中被修改的数据库写入到数据文件中。为提高系统系能Oracle可以最多创建20个这样的进程,DBWn中的n代表着一个单独的进程:n取值范围是0到9和a到j。

在DBWn进程将脏块写入到数据文件的同时,一个叫日志写入(Log Writer, LGWR)的进程也在降日志缓存中的日志写入到在线日志中去。LGWR执行的要比DBWn进程频繁得多,主要原因有两点:首先是要尽快的将事务信息写入到磁盘当中,以保证当意外宕机等事件发生时数据库能正常恢复,在一个就是日志缓存中的日志信息记录的不是实际的变化的数据,但是却是能够反应数据的变化——因此相比之下也就要小得多了。

检查点(Checkpoint, CKPT)进程负责定期的将SGA中的内容同步到数据库中。当执行检查点时,它会调用DBWn进程将所有的脏块写入到数据文件中,同时将重做日志缓存中的内容写入到在线日志文件中,然后更新数据文件头和控制文件的相关信息。

如果某个访问数据库的进程意外的死掉的话,那进程监视器(Process Monitor, PMON)就会在后台悄悄的清理掉这个死掉的进程,所进行的操作包括释放相应的锁、回收分配的资源已经将这个进程从活动进程中清理出去。PMON进程有点像一个UNIX的daemon进程:它会定期的唤醒以检查看是否有清理工作要做。在必要的时候也能启动一个别的进程或被其他的后台进程使唤。

在一个实例崩溃之后重启时,Oracle会自动的调用系统监视器(System Monitor, SMON)进程,SMON会利用在线日志文件来完成崩溃恢复操作。

归档进程(Archiver, ARCn)是Oracle实例中可选的几种进程之一,这里的n和之前说的一样都是代表着单个的进程。只有在数据库开启了归档模式(archive log mode)之后才会启动ARCn进程,在在线日志中的内容满了之后,在Oracle覆盖这些记录之前ARCn进程会将这些内存保存到磁盘上,这些文件称为归档日志(archive log),这样的话在线日志内容就不会丢掉了。

下图显示的是Oracle实例结构的一个简化版。