您的位置:首页 > 数据库 > Oracle

学习《Oracle 9i10g编程艺术》的笔记 (六) 体系结构

2009-11-27 10:52 405 查看
1.数据库和实例

作为Oracle 术语,这两个词的定义如下:
数据库(database):物理操作系统文件或磁盘( disk)的集合。使用Oracle 10g 的自动存
储管理(Automatic Storage Management,ASM)或RAW 分区时,数据库可能不作为操作系统中
单独的文件,但定义仍然不变。
实例(instance):一组Oracle 后台进程/线程以及一个共享内存区,这些内存由同一个计
算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁
盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过
你完全可以把它想成是最有用的事物,这有助于对实例和数据库划清界线。

实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;而数据库只是一个文件集合
(包括数据文件、临时文件、重做日志文件和控制文件)。在任何时刻,一个实例只能有一组相关的文件(与
一个数据库关联)。大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行操作。不过,Oracle
的真正应用集群(Real Application Clusters,RAC)是一个例外,这是Oracle 提供的一个选项,允许在
集群环境中的多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理
磁盘上)。

Oracle 使用默认设置,把所有内容都放在一起,并把数据库创建为一组持久的文件。如果关闭这个
数据库,再试图打开,就会发现数据库无法打开:
NAME
--------------------------------------------------------------------------------
/home/ora10g/dbs/dbs1ora10g.dbf
/home/ora10g/dbs/dbx1ora10g.dbf
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/home/ora10g/dbs/log1ora10g.dbf
/home/ora10g/dbs/log2ora10g.dbf
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/home/ora10g/dbs/cntrlora10g.dbf
SQL>
SQL> alter database close;
Database altered.
SQL> alter database open;
alter database open
一个实例在其生存期中最多只能装载和打开一个数据库。要想再打开这个(或其他)数据库,必须先
丢弃这个实例,并创建一个新的实例。
重申一遍:
实例是一组后台进程和共享内存。
数据库是磁盘上存储的数据集合。
实例“一生”只能装载并打开一个数据库。
数据库可以由一个或多个实例(使用RAC)装载和打开。
前面提到过,大多数情况下,实例和数据库之间存在一种一对一的关系。可能正因如此,才导致人们
很容易将二者混淆。从大多数人的经验看来,数据库就是实例,实例就是数据库。
不过,在许多测试环境中,情况并非如此。在我的磁盘上,可以有5 个不同的数据库。测试主机上任
意时间点只会运行一个Oracle 实例,但是它访问的数据库每天都可能不同(甚至每小时都不同),这取决
于我的需求。只需有不同的配置文件,我就能装载并打开其中任意一个数据库。在这种情况下,任何时刻
我都只有一个“实例”,但有多个数据库,在任意时间点上只能访问其中的一个数据库。
所以,你现在应该知道,如果有人谈到实例,他指的就是Oracle 的进程和内存。提到数据库时,则
是说保存数据的物理文件。可以从多个实例访问一个数据库,但是一个实例一次只能访问一个数据库。

2.SGA 和后台进程



图2-1 以最简单的形式展示了Oracle 实例和数据库。Oracle 有一个很大的内存块,称为系统全局区
(SGA),在这里它会做以下工作:
维护所有进程需要访问的多种内部数据结构;
缓存磁盘上的数据,另外重做数据写至磁盘之前先在这里缓存;
保存已解析的SQL 计划;
等等。
*
ERROR at line 1:
ORA-16196: database has been previously opened and closed

图2-1 Oracle 实例和数据库
Oracle 有一组“附加到”SGA 的进程,附加机制因操作系统而异。在UNIX 环境中,这些进程会物理
地附加到一个很大的共享内存段,这是操作系统中分配的一个内存块,可以由多个进程并发地访问(通常
要使用shmget()和shmat())。
在Windows 中,这些进程只是使用C 调用(malloc())来分配内存,因为它们实际上是一个大进程中
的线程,所以会共享相同的虚拟内存空间。Oracle 还有一组供数据库进程/线程读写的文件(只允许Oracle
进程读写这些文件)。这些文件保存了所有的表数据、索引、临时空间、重做日志等。
如果在一个UNIX 系统上启动Oracle,并执行ps 命令,会看到运行着许多物理进程,还会显示出这
些进程的名字。在前面的例子中,我们已经观察到了pmon、smon 以及其他一些进程。我会在第5 章逐一介
绍这些进程,现在只要知道它们通称为Oracle 后台进程(background process)就足够了。这些后台进程
是构成实例的持久性进程,从启动实例开始,这些进程会一直运行,直至实例关闭。
有一点要注意,这些都是进程,而不是单个的程序。UNIX 上只有一个Oracle 二进制可执行文件;根
据启动时所提供的选项,这个可执行文件会有多种不同的“个性”。执行ora_pmon_ora10g 进程要运行这个
二进制可执行文件,执行ora_ckpt_ora10g 进程时运行的可执行文件仍是它。二进制可执行文件只有一个,
就是oracle,只是会以不同的名字执行多次。

3.连接ORACLE 共享服务器

共享服务器连接和专用服务器连接之间有一个重大区别,与数据库连接的客户进程不会与共享服务
器直接通信,但专用服务器则不然,客户进程会与专用服务器直接通信。之所以不能与共享服务器直接对
话,原因就在于这个服务器进程是共享的。为了共享这些进程,还需要另外一种机制,通过这种机制才能
与服务器进程“对话”。为此,Oracle 使用了一个或一组称为调度器(dispatcher,也称分派器)的进程。
客户进程通过网络与一个调度器进程通信。这个调度器进程将客户的请求放入SGA 中的请求队列(这也是
SGA 的用途之一)。第一个空闲的共享服务器会得到这个请求,并进行处理(例如,请求可能是UPDATE T SET
X = X+5 WHERE Y = 2)。完成这个命令后,共享服务器会把响应放在原调度器(即接收请求的调度器)的
响应队列中。调度器进程一直在监听这个队列,发现有结果后,就会把结果传给客户。从概念上讲,共享
服务器请求的流程如图2-3 所示。


如图2-3 所示,客户连接向调度器发送一个请求。调度器首先将这个请求放在SGA 中的请求队列中①。
第一个可用的共享服务器从请求队列中取出这个请求②并处理。共享服务器的处理结束后,再把响应(返
回码、数据等)放到响应队列中③,接下来调度器拿到这个响应④,传回给客户。
在开发人员看来,共享服务器连接和专用服务器连接之间并没有什么区别。

TNS 代表透明网络底层(Transparent Network Substrate),这是Oracle 客户中处理远程连接的“基础”
软件,有了它才有可能建立对等通信。TNS 连接串告诉Oracle 软件如何与远程数据库连接。一般地,你的
机器上运行的客户软件会读取一个tnsnames.ora 文件。这是一个纯文本的配置文件,通常放在
[ORACLE_HOME]/network/admin 目录下([ORACLE_HOME] 表示Oracle 安装目录的完整路径)。如果有以下
配置:

ORA10G.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora10g)
)
根据这个配置信息,Oracle 客户软件可以把我们使用的TNS 连接串ora10g.localdomain 映射到某
些有用的信息,也就是主机名、该主机上“监听器”进程接受(监听)连接的端口、该主机上所连接数据
库的服务名,等等。服务名表示具有公共属性、服务级阈值和优先级的应用组。提供服务的实例数量对应
用是透明的,每个数据库实例可以向监听器注册,表示要提供多个服务。所以,服务就映射到物理的数据
库实例,并允许DBA 为之关联阈值和优先级。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: