UNIX 和 WINDOWS2000 上的 ORACLE 的差异

Ian Adam, SAIC Ltd

David Stien, SAIC Ltd

翻译 :Fenng

摘要

ORACLE 是广为人知的 Unix 硬件平台上的领先的数据库系统。 ORACLE 用户和管理员因此熟悉 Unix 平台上的 ORACLE 架构以及它上面的工具和技巧,并从他们的数据库得到最大的收益。相反, Windows 上的 ORACLE 架构就不那么的被广为了解。这篇文章从一个 DBA 的角度考察了两个操作系统之间的关键的异同点。

简介

在看了几本令人失望的这方面的书之后,我们写了这篇文章。那些书的通病是试图做太多的事情--在细节上讲述 Windows 和 ORACLE 。我们的这篇文章假定读者熟悉 Unix 平台上的 ORACLE DBA 的工作。因此本文将分析两个平台上的 ORACLE 的关键的差异而不是从头教你 ORACLE 的技巧。我们不想把它作为你的一份详尽的指导或者是手册的替代品,事实上它可能鼓励你阅读一些手册。作为数据库服务器平台,它只会涉及一些 Unix 和 Windows 上相关的优点,这就是本文的目的。

范例

这个例子使用 linux 上的 ORACLE 8i ,实例名字叫作 eighti 。 Windows 2000 上面的 ORACLE 8i 的实例名字叫作 atei 。

客户端对 ORACLE 的访问

当客户端连接到 ORACLE 时,通常的来说 ORACLE 服务器的平台与客户端的应用无关。这实际上很难说清。 ORACLE DBA 和系统管理人员更关心操作系统平台,他们有的时候会基于需求(如运行时间和可扩展性)选择平台。 更通常的情况下 , 他们接受(或是接手)给定的平台并学习从中得到最大受益。

关于 WINDOWS 2000

值得一提的是 Windows 2000 是从 Windows NT 升级而来。在这两个操作系统之间有很多的相似点, Windows 2000 也有些新的特性。微软从 NT4.0 的升级途径见下表。

两个系统间有很多相似点:

-------------------------------------------------------------------------------------

NT 4.0 Windows 2000

-------------------------------------------------------------------------------------

NT 4.0 Workstation Windows 2000 Professional

NT 4.0 Server Windows 2000 Server

NT 4.0 Enterprise Edition Windows 2000 Advanced server

Unix Windows 2000 Datacenter server

-------------------------------------------------------------------------------------

ORACLE 后台进程

下面这句话对于用过 ORACLE 的人来说是会很熟悉的: " 每一个运行着的 ORACLE 数据库都对应一个 ORACLE 实例,当一个数据库在数据库服务器(不考虑机器的类型)上启动的时候, ORACLE 分配一块叫做 System Global Area (SGA) 的内存区域并启动一个或者多个 ORACLE 进程。 SGA 和 ORACLE 进程合起来称作 ORACLE 实例。 " ――摘自 ORACLE 8i Concepts [4 L Leverenz, 1999] 。处理后台进程是放在首位的,也是不同的操作系统之间最明显的差异。

ORACLE 在 UNIX 上的后台进程

任何连接到 UNIX 的用户都可以很容易的察看 ORACLE 的后台进程:

% ps -ef|grep eighti|grep -v grep

oracle8 18451 1 0 16:37:18 ? 0:00 ora_pmon_eighti

oracle8 18453 1 0 16:37:19 ? 0:00 ora_dbw0_eighti

oracle8 18457 1 0 16:37:19 ? 0:04 ora_ckpt_eighti

oracle8 18461 1 0 16:37:19 ? 0:00 ora_reco_eighti

oracle8 18455 1 0 16:37:19 ? 0:02 ora_lgwr_eighti

oracle8 18459 1 0 16:37:19 ? 0:01 ora_smon_eighti

oracle8 19168 19167 0 16:43:46 ? 0:00 oracleeighti

(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

最后一行的 ORACLE 进程与一个 SQLPlus 会话相关,其他的进程都是后台进程。在 ORACLE 中我们可以通过输入 SQLPlus 会话察看这些进程:

SELECT sid, spid, osuser, s.program

FROM v$process p, v$session s WHERE p.addr=s.paddr ;

SID SPID OSUSER PROGRAM

-------------------------------------------------------------------

1 18451 oracle8 oracle@saic02 (PMON)

2 18453 oracle8 oracle@saic02 (DBW0)

3 18455 oracle8 oracle@saic02 (LGWR)

4 18457 oracle8 oracle@saic02 (CKPT)

5 18459 oracle8 oracle@saic02 (SMON)

6 18461 oracle8 oracle@saic02 (RECO)

7 19168 oracle8 sqlplus@saic02(TNS V1-V3)

7 rows selected.

每一个后台进程都有一行,还有一行信息是与 SQL*Plus 会话相关的, SPID 对应相应的 UNIX 进程号。

在 WINDOWS2000 上的 ORACLE 后台进程

回到 WINDOWS 上,从操作系统中察看后台进程有些困难。从任务管理器中可能会看到运行着的应用(任务管理器的察看方法:在任务栏点击右键选择 " 任务管理器 " )。在服务器上 ORAC

LE 可以是可用的,运行着的应用却是不可见的。进程表的确显示一个进程叫做 ORACLE.EXE ,

察看 alert log 显示 ORACLE 的所有后台进程都是启动的:

PMON started with pid=2

DBW0 started with pid=3

LGWR started with pid=4

CKPT started with pid=5

SMON started with pid=6

RECO started with pid=7

要看实际的后台进程,需要运行额外的软件,例如,进程察看器。该软件可以从 Windows

2000 CD 中得到( Windows NT 的话可以从资源包中得到)。

在 Windows 2000 上, ORACLE 实例是作为一个单一的 Windows 2000 进程( ORACLE.EXE )实现的。这个进程包括实例所需要实现的每个任务的线程。

因此一个线程对应每个 ORACLE 后台进程。 ORACLE.EXE 进程作为一个服务运行,可以从控制面板的服务中察看到 ORACLEServiceSID 。其他的服务也可以这样控制。

这允许 ORACLE 在没有用户登录服务器的时候也持续的运行。对于共享主处理器资源的所有的进程来说, ORACLE 能够达到高速、低负荷的上下文切换。

在 Unix 下显示 ORACLE 中的进程,我们也可以通过输入简单的 SQL 语句来达到。为了显示 PID 列, SQL 语句做了些轻微的改动。要注意 PID 匹配警告日志中报告的值。

SELECT s.sid, p.pid, p.spid signaled, s.osuser, s.program

FROM v$process p, v$session s

WHERE p.addr=s.paddr;

SID PID THREADID OSUSER PROGRAM

---- ------- --------- --------------- --------------------

1 2 1088 SYSTEM ORACLE.EXE

2 3 1172 SYSTEM ORACLE.EXE

3 4 1180 SYSTEM ORACLE.EXE

4 5 1192 SYSTEM ORACLE.EXE

5 6 1212 SYSTEM ORACLE.EXE

6 7 1220 SYSTEM ORACLE.EXE

7 8 1200 Administrator SQLPLUSW.EXE

7 rows selected.

每一个后台进程都有一行,还有一行信息是与 SQL*Plus 会话相关。程序名字并没有指明后台进程的名字,和在 Unix 中一样,这些名字可以通过和 v$bgprocess 连接得到。

SELECT s.sid SID, p.spid THREADID, p.program PROCESSNAME, bg.name NAME

FROM v$process p, v$session s, v$bgprocess bg

WHERE p.addr = s.paddr

AND p.addr = bg.paddr

AND bg.paddr <> '00' ;

SID THREADID PROCESSNAME NAME

---------- --------- --------------- -------------

1 1088 ORACLE.EXE PMON

2 1172 ORACLE.EXE DBW0

3 1180 ORACLE.EXE LGWR

4 1192 ORACLE.EXE CKPT

5 1212 ORACLE.EXE SMON

6 1220 ORACLE.EXE RECO

6 rows selected.

断开会话

提交 SQL 命令 ALTER SYSTEM DISCONNECT SESSION 可以断开会话。有的时候需要在操作系统级别断开会话,在 UNIX 上,通过 kill 命令实现,前面例子中的 SQL 会话可以通过输入 UNIX 命令断开:

kill -9 19168

在 Windows 2000 上可以用 orakill 断开一个会话。 orakill 是 Windows 平台上的 ORACLE 的一个特定命令,默认安装在 $ORACLE_HOME\bin 下。在命令行下输入 orakill 可以察看它的用法。前面例子中的 SQL*Plus 会话可以通过输入如下的命令断开:

<P class=MsoNormal styl

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus