史上最好的oracle体系架构浅析
Database vs Instance
对于刚接触oracle,尤其是以前有MS SQL server经验的的人来说,最迷惑的恐怕就是database和instance这两个词了。
其实这两个概念理解起来相当简单。让我们举个例子:
notepad记事本,相信大家都很熟悉。那么,位于windows目录下的notepad.exe,是一个软件,对吧。我们双击notepad.exe(或者从命令行启动,这都不是问题),然后内存中就有notepad的一个执行实例了,这个实例只存在于内存中,一旦计算机关机重启,实例就不再存在了。
再假设我们硬盘上有一个文本文件test.txt,这个文件是在硬盘上物理存在的,不管计算机是否关闭,他都存在。然后我们用执行的notepad开打这个test.txt,我们就将一个notepad实例和一个物理的文本文件关联起来了,test.txt被读入内存(缓存),在notepad实例中对这个test.txt文件进行编辑操作。
oracle虽然比notepad庞大复杂许多,但是基本原理也是一样的。我们安装完oracle服务器软件,就在硬盘上有了一个oracle的可执行程序,就像notepad.exe。我们启动oracle的一个instance,就好像启动一个notepad的实例,这个实例完全存在于内存中(当然,也可以由于内存不够而被swap到硬盘的pagafile上),notepad的实例只有一个进程(线程),而复杂的oracle就有很多的进程(线程),这些进程(线程)就叫做background
process,同时oracle由于要操作比较多的数据,所以就要划出一块比较大的内存给他用,这块内存的名字叫做SGA。然后oracle的instance打开一组文件,就像notepad实例打开test.txt,oracle给这组文件起了一个专门的名字:database
其实,软件也好,实例也好,文件也好,出现这些概念和区别,我想,最主要还是因为计算机的结构特性:内存速度快,但是掉电后丢失内容;硬盘速度慢,但是内容永久存在。这个特性决定了所有的计算机软件的行为:为了尽可能的快,程序要在内存中运行,数据要在内存中缓存;为了永久保存,程序和数据要保存在硬盘中。
在内存中运行的程序和保存该程序的数据的缓存,我们称之为instance;在硬盘上保留的程序,我们称之为软件,在硬盘上保留的数据,我们称之为文件。对于oracle,需要一组文件,别且要保持一定的一致性和完整性,这组文件统一有个名字叫database。
相关数据字典:v$instance v$database
注意到
v$instance.instance_name varchar2(16)
v$database.name varchar2(9)
所以instance和database的名字长度都有限制的。使用DBCA的时候,不输入数据库和SID名的话,提示:数据库名必须1到8个字符,SID必须1到64个字母数字字符。但我在xp上试验10gR2,手工建立名字超过15个字符的instance,可以成功并且能够startup,但是查询v$instance里面的instance_name字段为空,15个字符之内(包括15个)则正常。建议是:instance名不超过15个字符,database名不超过8个字符。一般情况下,最好保持instance名和database名一致。