深度对比Oracle与SQL ServerWord文档格式.docx
《深度对比Oracle与SQL ServerWord文档格式.docx》由会员分享,可在线阅读,更多相关《深度对比Oracle与SQL ServerWord文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
企业版
企业版包含所有的高级特性,适用于大规模、高容量的数据库需求。
标准版
标准版为那些不需要包含企业版高级特性的公司提供了一个相对便宜的数据库平台,大部分公司使用的都是标准版的数据库。
工作组版
工作组版适用于小的部门级别的应用。
Web版
这个适用于作为Web应用的低成本的后台解决方案。
Express版
这是一个很小的内嵌式的SQLServer引擎,通常用于本地数据存储或是小规模的系统开发。
Express版可以免费下载并且自由分发。
Compact版
Compact版可以让用户开发Windows桌面或者是手持设备的应用。
开发版
所有企业版所拥有的功能开发版都有,不过它仅仅授权单个用户访问,主要用于开发或是测试目的。
除了企业版,SQLServer2008R2还为数据中心和数据仓库提供两个“白金版”,这两个版本分别称为数据中心版(DatacenterEdition)和并行数据仓库版(ParallelDataWarehouseEdition)。
对于Oracle11gR2,发行版是这么样的:
这个版本提供了顶级的性能,同时价钱也是顶级的。
像SQLServer的企业版一样,所有这个产品能提供的特性在这个版本里面都有。
这个和SQLServer标准版很像,Oracle标准版包含了大部分业务应用所需要的大部分特性。
标准版1
这个版本为小型工作组应用而设计,授权最小的用户为5。
这个目标客户是小规模应用或者是数据库开发入门,可以免费分发。
现在Express版还处于10gR2版本。
下表提供了SQLServer和Oracle数据库发行版的直观的对比:
SQLServer
Oracle
EnterpriseEdition
StandardEdition
WorkgroupEdition
StandardEditionOne
Expressedition
ExpressEdition
WebEdition
X
CompactEdition
DeveloperEdition
top实例、数据库和表空间
SQLServer和Oracle之间第一个架构级别的差异就在于对实例(instance)和数据库(database)概念的定义了。
SQLServer中,实例一词用来代表一个包含了操作系统文件、内存结构、后台进程以及注册表信息的独立的应用服务。
在Windows系统中用一个存在着停止和运行状态的服务来代表一个实例,当处于运行状态时,实例要占用一定的服务器内存以及生成一定数量的后台进程。
SQLServer实例的中心是数据库。
一个SQLServer数据库指的是一个资料库以及操作数据所需要的程序代码,当实例没有运行时,实例中的数据库就不能够访问。
SQLServer有两种数据库:
系统数据库(systemdatabases)和用户数据库(userdatabases)。
在一个SQLServer实例安装完成之后,将会自动创建5个系统数据库:
master,model,msdb,tempdb和resource。
如果一个机器上面安装了多个SQLServer实例时,没有实例都会有自己单独的一套系统数据库。
除了msdb数据库之外,其它数据库不能访问或是被损坏都会导致实例无法启动。
相比之下用户数据库由DBA或者是开发人员在数据库实例安装完毕、系统数据库都启动之后所创建的,这些数据库中保存着公司的业务资料。
简而言之,一个SQLServer实例总是要包含一些数据库(尽管有时只是那些系统数据库),一个数据库也总是要有一个(且仅有一个)与之关联的实例。
从物理角度说,一个SQLServer数据库表现为存储于磁盘上面的一组操作系统文件的集合。
数据库文件分为两种:
数据文件(datafile)和事务日志文件(transactionlogfile)。
一个数据库至少要包含一个数据文件和一个事务日志文件,SQLServer数据库的资料主要是存在于数据文件中,事务日志文件用来记录发生在这些数据上面的变更记录,SQLServer在执行系统恢复的时候要用到它。
一个数据文件或事务日志文件只能隶属于一个特定的数据库,不存在两个数据库共用一个数据文件或者是日志文件的情况。
一个数据量很大的数据库可以使用多个数据文件,这些数据文件能够被逻辑的组合成一个称为文件组(filegroup)的逻辑组。
在Oracle中,这一切看起来都有点反着来了。
当Oracle启动时,它和SQLServer一样要先占用一些服务器内存用于执行操作,这个内存区域——著名的SGA(SystemGlobalArea)——被分为数个不同的结构,在创建SGA的同时也会启动一系列的后台进程用于和SGA进行交互,在这里这些分配的内存空间和后台进程组合起来就是Oracle实例了。
请注意现在我们没有见到数据库的影子还,实际上Oracle实例在没有数据库或是数据库不能访问时也是跑的很好的,在安装Oracle时,我们可以选择只安装软件,完了之后再安装数据库。
Oracle中的数据包含了一组操作系统文件。
不像SQLServer数据库,Oracle数据库并不能代表数据库对象的逻辑分组,它更像是表示包含多个存在于磁盘上的用来保存数据的文件的一个单个的集合名词。
组成Oracle数据库的文件可以分成三个类型:
数据文件(datafile)、重做日志文件(redologfile)和控制文件(controlfile)。
数据文件保存数据,Oracle中可以存在任意数量的数据文件;
重做日志文件跟SQLServer的事务日志文件一样用来保存对数据更改的记录,在系统恢复阶段需要用到;
控制文件是一些特别的小文件,用来保存一些至关重要的关于数据库的信息,没有这个文件的话,实例就无法打开数据库。
除了数据文件、重做日志文件、控制文件之外,数据库还包含参数文件(parameterfile)、密码文件(passwordfile)和可选的归档日志文件(archivelogfiles),后面很快会对这些文件类型展开讨论。
Oracle系统启动时,首先在内存中创建数据库实例,然后由实例找到保存在磁盘中的数据库,最后打开数据库让用户操作。
当系统关闭时,实例会从内存中清除掉:
整个内存结构和后台进程都会消失,但是数据库依然存在于磁盘上,只是处于关闭的状态。
之前也说过,Oracle实例可以在不打开数据库的情况下运行——这是与SQLServer数据库最大的不同,SQLServer实例是不能够离开系统数据库而运行的。
不过和SQLServer一样Oracle数据库在实例没有启动的情况下也是不能访问的。
一般来说Oracle实例和数据库之间是一对一的关系。
一个实例对应着一个数据库,但是一个数据库却可以同时由多个实例去访问它。
一个独立的Oracle安装包含一个实例和一个供实例操作的数据库,而配置成RAC(RealApplicationCluster)的安装则可以允许多个存在于不同机器上的实例访问存在于一个共享磁盘上面的数据库。
那Oracle中数据库对象的逻辑分组在那儿呢?
在SQLServer中逻辑分组由数据库自己来完成,而在Oracle中,这项工作由表空间(tablespace)完成,Oracle表空间是用来对表、视图、索引和其他数据库对象进行分组的逻辑结构。
例如,你的Oracle产品库可以给HR应用一个单独的表空间,支付应用则使用另外一个。
一个数据库可以逻辑的分成若干个表空间,这些表空间在物理上则由一个或者多个数据文件组成。
因此在Oracle中与SQLServer数据库等价的是表空间。
由于这两种结构在功能上相当类似,在SQLServer中建立数据库的过程和在Oracle中建立表空间的过程也非常相似。
不管是建立数据库还是表空间,DBA都要首先指定一个名字,然后给新建的数据库或者表空间分配一个或多个数据文件,并为每个数据文件指定初始大小和数据增长情况。
在SQLServer中可以做到让一个用户数据库离线或是只读,Oracle的用户表空间也一样可以。
在SQLServer中可以让一个用户数据库中的一个或者多个数据文件只读,而Oracle用户表空间中的一个或者多个数据文件也同样能标记为离线。
不过数据库和表空间在某些方面还是有差别的:
∙SQLServer中,数据文件可以用文件组逻辑的进行分组,而Oracle表空间就没有类似的概念。
∙SQLServer的每个数据库都有自己的事务日志文件,而且在创建数据库的时候就要指定这些日志文件的属性。
而在Oracle中整个数据库(意为所有的表空间)的事务日志都是记录在同样的一样重做日志中,因此也不存在说给每个表空间建立一个单独的日志文件的说法。
∙SQLServer中,数据库可以设置成简单恢复模式(simplerecoverymode),简单恢复模式指的是活动的数据库日志在checkpoint操作完成之后就会截断。
Oracle也有类似的概念,这个稍后会说到,不过不能在表空间级别上进行这样的设置。
top实例名和SID
SQLServer和Oracle都允许在同一个机器上面同时运行多个实例,多个实例的执行环境是完全独立的:
就单个的数据库引擎而言,它并不知道也不关心有没有其他的实例在这个机器上运行着。
在SQLServer中这种机制通过实例这个概念来实现,SQLServer可以作为一个命名的(named)
或是
默认(default)的实例来运行,默认实例的名字和运行它的Windows服务器的名字一样,显然一个系统的默认实例只可能存在一个,不过在一个机器上可以存在多个命名的实例,命令实例的名字格式为
HOSTNAME\INSTANCE_NAME
,同一个主机上每个运行实例的
INSTANCE_NAME
必须是唯一的,每个实例都有着自己的一套程序文件以及一些与其它实例共享的通用组件。
而Oracle也差不多,在安装Oracle的时候,DBA就需要指定一个
全局数据库名(GlobalDatabaseName)和系统标识符(SID,SystemIdentifier)。
Oracle中实例和数据库是完全不同的东西,一个全局数据库名用来在网络上唯一的识别一个数据库的存放位置,一个完整的名字通常是下面的格式database_work_domain_name。
SID则是用来识别一个与数据库关联的实例,大都数情况下一个实例关联一个单个的数据库,数据库名和SID名字会是一样。
RAC环境中就不一样了,RAC允许多个实例访问放在共享存储中的同一个数据库,此时的实例名和数据库名字将不一样。
当然和SQLServer一样,一个Oracle数据库服务器上面是不允许两个实例使用同一个SID的,另外一点类似的就是在安装时一旦指定,不管是SQLServer实例名还是OracleSID都是不能再修改了(译注:
实际上Oracle从9i开始就提供一个叫nid的工具用来修改数据库名了)。
SQLServerDBA可以通过下面的语句查询当前登录系统的实例名:
DE>
1DE>
SELECTDE>
@@SERVERNAMEDE>
OracleDBA用来查询实例名和数据名的语句如下:
INSTANCE_NAME,HOST_NAME,VERSION,DATABASE_STATUS
FROMDE>
V$INSTANCE;
2DE>
NAMEDE>
DATABASE_ROLE,CREATED
V$DE>
DATABASEDE>
;
top系统数据库和系统表空间
一个SQLServer实例需要有5个系统数据库(2005之前的是4个):
master,model,msdb,tempdb和resource,一个Oracle数据库则最少需要3个系统表空间才能正常操作,它们是:
SYSTEM,SYSAUX和TEMP。
master和resource数据库集中保存了SQLServer自身管理所需要的所有信息,里面保存了诸如系统配置,数据库列表和文件路径、终结点、连接服务器和用户帐户(或“登录”信息),系统级别的对象存储在只读的数据库”资源(resource)”中。
在Oracle中,SYSTEM表空间等价于master数据库,SYSTEM表空间包含了数据字典(datadictionary),也就是关于Oracle自身的元数据(metadata),这里的数据字典可以和SQLServer中的resource数据库进行类比。
到这里你也许猜到了:
如果SYSTEM不存在或是损坏了的话Oracle数据库是打不开的。
对于一个SQLServer实例,model数据库用作这个实例中所有新建的数据库的“模板”,对model数据库的任何修改都会反应到之后新建的其它数据库里面。
在Oracle中就没有这样的模板,不过在你新建一个表空间的时候,你可以指定这是一个永久的表空间或者是其他类似TEMP和UNDO一样的表空间,永久表空间才是用来保存用户数据的。
SQLServer的tempdb用作整个实例的“试验田”,每次实例重新启动的时候tempdb都会重新创建。
Oracle的TEMP表空间的作用类似:
用来包括大的排序操作的中间结果。
当然SQLServer的tempdb还能用来保存行版本(rowversioning)所需要的信息,当行版本启用后,行版本特性可以保证数据库引擎能将数据行的每次的修改记录保留下来,修改之前的行会保存在tempdb里面的版本库中,一般查询会返回一个数据行上最后提交的版本,当一个使用了特定隔离级别的依赖行版本的读操作不再会阻塞其它修改同样数据的事务,这是因为读操作不会在数据行上使用共享锁。
不过这个特性需要在单个数据库上单独启用。
Oracle中使用一个单独的表空间——著名的UNDO表空间——来达成同样目的。
UNDO表空间保存着被DML语句修改的数据块的读一致性的副本。
当用户开始对数据进行修改的时候,修改之前的数据块会被保存到UNDO表空间中,当另外一个用户需要查询这些数据的时候,他取到的实际上是UNDO表空间中查出来的读一致性的版本。
不像SQLServer的行版本,Oracle的UNDO不需要启用——因为它是属于Oracle并行访问机制的一部分。
最后一个要介绍的SQLServer中的msdb数据库,SQLServer代理服务需要操作这个库。
SQLServer代理负责计划任务、警告、复制、日志传送以及其它的很多东西,代理服务的正常运行离不开msdb数据库。
在Oracle没有明确与mdsb数据对应的东西。
SYSAUX表空间也是一个系统表空间,在安装过程中(译注:
准确说应该为“数据库创建过程中”)创建,它里面保存了诸如OracleAWR(AutomaticWorkloadRepository)信息、多维数据和多媒体数据,XML数据库等等。
数据库实例结构
当Oracle实例启动之后,所看到的就是在服务器内存上的一个个不同内存块加上产生的与这些内存交互的后台进程。
Oracle文档将这些内存结构和进程收的很详细。
由Oracle实例所占用的内存块成为SGA(SystemGlobalArea),它的大小可以通过调整Oracle初始化参数(initialisationparameter)进行修改,在SGA里边至少会创建3个不同的区域,它们分别是:
数据块缓存区(DatabaseBufferCache)
这里缓存的是数据块。
和SQLServer一样,用户不会直接的访问数据文件上的数据:
当读取数据时,相关的数据块会从数据文件中拷贝到内存中;
修改数据时也是修改内存中的数据,然后再由单独的进程将数据缓存区中被修改的数据写入到数据库中。
重做日志缓存(RedoLogBuffer)
SGA中的这个区域连续的记录着数据缓存区数据修改的记录,重做日志缓存中的内容会被写入到在线日志文件中去。
共享池(SharedPool)
SGA中有一大块的内存用作共享池,共享池等价于SQLServer中的执行缓存(ProcedureCache)。
它的主要作用就是缓存数据库中最近执行过的SQL语句。
共享池由下面的模块组成:
数据字典缓存(DictionaryCache)
数据字典缓存缓存了Oracle最近使用的数据字典信息。
库缓存(LibraryCache)
这个区域包含了最近执行的SQL和PL/SQL语句和对应的执行计划。
SQL区还能进一步分成共享区和私有区:
共享SQL区保存的语句可以由多个用户使用而私有区保存的则是跟各个连接对应的绑定变量的信息。
PL/SQL是Oracle对于行业标准SQL的程序扩展,当PL/SQL程序执行时,它的代码会拷贝到库缓存中的共享PL/SQL区中。
除了缓存执行代码和执行计划外,库缓存还包含锁、阀以及字符集等信息。
根据你所使用的组件的不一样,Oracle的SGA中也可能存在其它一些可选的内存区域。
在Oracle中使用Java应用时要使用到Java池(JavaPool),Oracle内置的备份恢复工具RMAN(RecoveryManager)要用到大池(LargePool),当使用Oracle高级队列机制时要用到流池(SteamsPool)。
上面介绍的各个内存区域都是属于SGA的一部分,它们是通过一序列的进程(process)来和数据库进行交互。
下面就开始介绍包括用户进程和服务器进程在内的Oracle进程了。
当用户或者是应用连接到Oracle数据库时就会产生一个用户进程(userprocess)。
在一个两层的系统架构中,用户进程存在于客户端机器上;
而在一个三层的系统架构中,用户进程由中间层产生。
一旦用户进程连接到Oracle监听服务(ListenerService)时,监听器就会为这个用户会话产生一个服务器进程(serverprocess)。
再说详细点就是,Oracle监听器是一个负责为Oracle处理近来连接的网络组件,监听器本身是一个单独的进程,负责监视着从客户端过来的连接请求,如果监听器没有运行的话,数据库也就无法连接了。
一旦连接建立,由监听器产生的服务器进程就开始接手处理用户操作数据库的请求了。
大多情况下每个用户连接会产生一个独立的服务器进程,不过Oracle也能配置成一个运行着多个预先创建好的服务器进程池的模式,此时用户进程连接到数据库实例之后将会直接从进程池中分配一个进程。
任何时候Oracle实例中都会有多个后台进程在运行着,不过,有5个必须要有的。
写数据库(DatabaseWriter)进程或称DBWn负责将数据缓存区中被修改的数据库写入到数据文件中。
为提高系统系能Oracle可以最多创建20个这样的进程,DBWn中的n代表着一个单独的进程:
n取值范围是0到9和a到j。
在DBWn进程将脏块写入到数据文件的同时,一个叫日志写入(LogWriter,LGWR)的进程也在降日志缓存中的日志写入到在线日志中去。
LGWR执行的要比DBWn进程频繁得多,主要原因有两点:
首先是要尽快的将事务信息写入到磁盘当中,以保证当意外宕机等事件发生时数据库能正常恢复,在一个就是日志缓存中的日志信息记录的不是实际的变化的数据,但是却是能够反应数据的变化——因此相比之下也就要小得多了。
检查点(Checkpoint,CKPT)进程负责定期的将SGA中的内容同步到数据库中。
当执行检查点时,它会调用DBWn进程将所有的脏块写入到数据文件中,同时将重做日志缓存中的内容写入到在线日志文件中,然后更新数据文件头和控制文件的相关信息。
如果某个访问数据库的进程意外的死掉的话,那进程监视器(ProcessMonitor,PMON)就会在后台悄悄的清理掉这个死掉的进程,所进行的操作包括释放相应的锁、回收分配的资源已经将这个进程从活动进程中清理出去。
PMON进程有点像一个UNIX的daemon进程:
它会定期的唤醒以检查看是否有清理工作要做。
在必要的时候也能启动一个别的进程或被其他的后台进程使唤。
在一个实例崩溃之后重启时,Oracle会自动的调用系统监视器(SystemMonitor,