作者:Ian Adam & David Stien, SAIC Ltd?
日期:19-Dec-2003
出處:http://www.dbanotes.net
翻譯:Fenng
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
摘要
ORACLE Database是廣為人知的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 進程與一個SQL*Plus 會話相關,其他的進程都是后臺進程。在 ORACLE 中我們可以通過輸 入 SQL*Plus 會話察看這些進程:
SELECT SID, spid, osuser, s.programFROM v$process p, v$session sWHERE 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 上,從操作系統中察看后臺進程有些困難。從任務管理器中可能會看到運行著的應用(任務管理器 的察看方法:在任務欄點擊右鍵選擇 " 任務管理器 " )。在服務器上 ORACLE 可以是可用的,運行著的應用卻是不 可見的。進程表的確顯示一個進程叫做 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.programFROM v$process p, v$session sWHERE 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 NAMEFROM v$process p, v$session s, v$bgprocess bgWHERE 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 會話 可以通過輸入如下的命令斷開:
orakill atei 1200 Kill of thread id 1200 in instance atei successfully signaled.
在 Windows 2000 中,如果一個斷開的會話標記為 "marked for kill" 但是沒被刪除, orakill 會終止它。不過要 記住Kill一個后臺進程總不是個好主意,尤其是 Windows 上,會導致進程崩潰,甚至導致數據庫不可用。
Windows 2000 注冊表
和其他的 Windows 2000 中的應用那樣, ORACLE 的大多數的設定都在注冊表中。 你應該看看注冊表中的 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 下面都有什么。這些參數中的一部分在后面會詳細討論。和 ORACLE 服務相關的參數和其他的服務一樣存貯在同樣的位置: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 。
環境變量
在 Unix 中兩個最重要的變量是 ORACLE_HOME 和 ORACLE_SID 。一旦這些變量設定的話,應用就可以運行并聯 接到本地數據庫。 通常也把 $ORACLE_HOME/bin包含在 $PATH中以便在使用 ORACLE 工具(如: Sql*Plus ) 的時候免去輸入全路徑的麻煩。
Windows 2000 中可以打開命令行設定 ORACLE_SID 變量再聯接到本地數據庫。其他的值可以從注冊表中得到。
MULTIPLE ORACLE HOMES
Windows 2000 全面支持多個 ORACLE home 。以前在 Windows NT 上這是個主要的問題, 一直到 ORACLE 8.0.4 以后才開始支持。最初得對這一點的支持很差勁。 ORACLE Home Selector, ORACLE8i 的一個新的應用工 具,改變環境路徑,使選擇的 ORACLE home 路徑作為主的 home 。只是簡單的改變系統路徑,把 ORACLE 選擇 的 BIN 目錄放在啟動路徑中。
每一個 BIN 目錄都有一個 ORACLE.KEY 文件,指明在注冊表中 ORACLE 程序在哪里可以找 ORACLE_HOME 和其 他的環境變量。如果在服務器上面只有一個數據庫,通常在注冊表中設定 ORACLE_SID 。不過,不要設定 ORACLE_HOME ,對于 ORACLE 產品來說根本不需要,可能會導致問題。
文件系統
多 ORACLE home 的支持允許在 Windows 上面實現 Unix 的 OFA 標準。這極大的簡化了從 Unix 的過渡。 OFA 目錄樹的頂層的名字有差異,不過主要的子目錄和文件名字在兩種操作系統中都是一致的。
? Unix NT ORACLE_BASE /oracle/app/oracle D:\Oracle ORACLE_HOME /oracle/app/oracle/product/8.1.7 D:\Oracle\Ora817 Admin directories /oracle/app/oracle/admin D:\Oracle\Admin Database files /db01/oradata/SID D:\Oracle\Oradata\SID ? /db02/oradata/SID F:\Oracle\Oradata\SID ? /db03/oradata/SID G:\Oracle\Oradata\SID
服務管理器
從 ORACLE 8i 開始,服務管理器的名字在不同的平臺上都一致了,都叫做 svrmgrl 。以前在Windows NT 上 ORACLE 的執行文件名字隨著版本變動而改變,對于那些在多平臺上工作的人來說這很令人討厭,尤其是在使用一些命令 ( imp 、 exp 等)的時候。
ORACLE 服務器版本 Windows 服務器管理器可執行程序 7.3 svrmgr23 8.0 svrmgr30 8.1 svrmgrl
要注意 server manager 正在逐步被淘汰 ( 譯者注: 9i 中徹底淘汰了 svrmgrl) ,一些額外的功能被加到了 SQL*Plus 中。
?
數據庫啟動與關閉
在 Windows2000 上數據庫可以通過啟動相關的服務打開。通過控制面板的服務選項或者是通過命令行模式,如: net start OracleServiceatei 就可以打開相關服務。這依賴于一些注冊表參數,我們在后面討論。停止相關的服務 ,例如: net stop OracleServiceatei 可以關閉一個數據庫。
在所有的平臺上, ORACLE8i 實例都可以從服務管理器(或者 SQL*Plus! )中通過 startup 命令啟動。在 Unix 中,這個命令啟動后臺進程并且打開數據庫。它還生成了一個 Unix 特定文件,叫做 $ORACLE_HOME/dbs/lk &DBNAME>,這是個MOUNT 鎖文件 [6 Metalink, 2000] 。這會阻止兩個實例 mount 在同一數據庫上,當不使用并行服務器的模式下,要使用不同的 ORACLE_SID 。原來這是個 0 長度文件,不過現在 包含文本 'DO NOT DELETE THIS FILE!' 。不要試圖通過查看這個文件來得知是否數據庫是可用的,它不是很準確 的。在 Windows 2000 中, startup 命令并不啟動 ORACLE 服務,不過,如果服務已經運行的話,這將打開數據 庫。
類似的,服務管理器 Server Manager 的 shutdown 命令在任何平臺上都會關掉數據庫,不過在Windows 2000 上它并不停掉服務。很有可能的情況就是 ORACLE 服務被啟動但是數據庫卻關掉了。
UNIX 上的數據庫的自動啟動與關閉
在 Unix 上, ORACLE 提供了 dbstart 和 dbshut 腳本以供使用。在 Linux 中 ORACLE 檢測文件 /etc/oratab 來決定哪個數據庫自動的啟動 / 關閉。在 Solaris ( 和一些其他版本的 Unix) 中,檢查 /var/opt/oracle/oratab 文 件。要注意: 8.1.6 版本的 dbstart 有個 bug, 在 8.1.7 中已經被修復,察看 [7 Metalink, 2000] 有詳細說明。
在 Linux 上,作為 root 用戶,在 /etc/rc.d/init.d 目錄中創建一個一個名為 dbora 的文件。這個文件將會檢查參數 是否是 'start' 或者 'stop' 并且適當的執行 dbstart/dbshut ;通常也從這個腳本啟動 listener 。再生成兩個符號 連接 /etc/rc.d/rc2.d/S99dbora 和 /etc/rc.d/rc0.d/K10dbora 。數據庫在運行級 2( 多用戶 ) 時通過 /etc/rc.d/rc2.d/S99dbora 啟動 , 在系統關閉到運行級 0 的時候通過 /etc/rc.d/rc0.d/K10dbora 關閉數據庫。在 Solaris 上,這個腳本的在 /etc/init.d 中而不是在 /etc/rc.d/init.d。
要注意默認的 dbshut 執行了一個正常 (normal) 的關閉操作。 在 Unix中可以通過編輯 $ORACLE_HOME/bin/dbshut 中的這一行來改變數據庫的關閉模式。
把 shutdown 修改成:shutdown immediate
如果啟動一個已經運行的實例, dbstart 還會執行一個 shutdown abort 。在 dbstart script 腳本的頂部警告說 'It should ONLY be executed as part of the system boot procedure' 。這個腳本要常被復制、修改,這樣 在其它的時候使用才能足夠安全。
WINDOWS 2000 上的數據庫自動的啟動與關閉
在以前的版本( 8i )中,當 oracle 的啟動被一個額外的服務 ORACLEStartSID 處理,服務器的啟動和關閉的時候 ORACLE 不能被自動的干凈的關掉。從 ORACLE8i 開始, stop/start 功能成為了主要的 ORACLE 服務,并通過注 冊表控制。注意當 ORADIM 用于創建或者修改實例的時候,自動的在注冊表中設定這些值。這些設置在 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID 鍵值下。 ID 號從 0 開始,每有一個額外的 ORACLE home 遞增。
參數 描述 ORA_SID_AUTOSTART 設定為 TRUE 的時候 ( 默認值 ) , ORACLEServiceSID 啟動的時候啟動數據庫。 ORA_SID_PFILE 設定 INIT.ORA 參數文件的全路徑。 ORA_SHUTDOWN 當設定為 TRUE 的時候,在當前任何 ORACLE home 下的任何數據庫將 shutdown 。 ORA_SID_SHUTDOWN 設定為 TRUE 的時候,關閉標記 SID 值的 ORACLE8i 數據庫。
如果 SHUTDOWN 參數設定為 FALSE ,停掉 ORACLEServiceSID 將會 abort 的方式關閉實例,下次啟動的時候 要進行實例恢復。
下面的可選參數可以在注冊表中設為合適的值
參數 描述 ORA_SID_SHUTDOWNTYPE 指明數據庫關閉模式 A (abort ), I (immediate) , N(normal) 。
如果你不設定這個參數的話,默認的模式是 I (immediate) 。ORA_SID_SHUTDOWN_TIMEOUT 在一個 SID 停止前等待的最大時間。
操作系統認證
OS 認證在兩個平臺間是相似的,參數文件中設定 os_authent_prefix 參數,創建用戶都標記為 externally 。在 Windows2000 中創建用戶要指定大寫的域名并且用戶名要在 " " 中,否則不起作用。如果你在注冊表中把 OSAUTH_PREFIX_DOMAIN 設定成 FALSE 的話,你可以忽略掉域。客戶機和服務器的機器還需要在 sqlnet.ora 中包含 sqlnet.authentication_services=(nts) 這一行。
在 Windows 2000 中,可以允許一個域用戶登陸到一個遠程 pc 上,無需提供額外的密碼就可以連接到數據庫中。 參見 [2 Kelly III,2000] 可以得到詳細內容。
LISTENER
在 Windows 2000 上面 listener 作為一個服務實現的,所以 listener 可以通過啟動 ORACLETNSListener 服務 來啟動。兩種平臺上 listener 都可以從 lsnrctl 命令控制。在 Unix 上 lsnrctl start 啟動 listener 進程;在 Windows 2000 啟動 ORACLETNSListener 服務就可以。 如果 listener 第一次啟動的時候沒有 ORACLETNSListener 服務將創建它。如果從你的計算機中刪除 ORACLE 的話, listener 服務要手工從注冊表中 刪除。
在兩個平臺上的 listener 都可以監聽不同版本的數據庫。在 win2000 中,在 LISTENER.ORA 中不需要 ORACLE_HOME 參數 ( 在 UNIX 中要使用到的),因為每個 SID 在 SERVER 中是唯一的。 listener 可以從注冊 表中得到正確的 ORACLE_HOME 。
ORACLE8i 有個特性叫服務器注冊, pmon 自動對 listener 注冊信息。這意味著 Net8 listener 可以無需在 listener.ora 文件中設置就可以監聽一個數據庫。不過這樣做的話, Enterprise Manager 要直到啟動后才可以連 接到數據庫。所以這個例子不能用來啟動一個遠程的實例。
通常最好在 listener.ora 中設置所有的實例以避免沖突,尤其在一個有多位 DBA 的站點中,可以避免我們提到的 Enterprise Manager 問題。
加長的 SID 名字
Windows NT 上的 ORACLE 7 實例名字有著 4 個字符長的限制,這可能會產生很晦澀的實例名--慶幸的是在8i 中 SID 名字已經加長了。不過在包括命名服務的幾個場合中使用太長的實例名字也不總是很有用。在 Windows 2000 上面有個 bug ,限制了實例名字最長 15 個字符。
? Unix操作系統 NT 操作系統 ? 數據庫名長度 SID名字長度 數據庫名長度 SID 名字長度 Oracle7 8 8 8 4 Oracle8 8 8 8 4 Oracle8i 8 64 8 64
數據庫的創建
當你在安裝過程中的時候選擇創建 ORACLE 8i 數據庫,數據庫生成助手就會通過 ORACLE Universal Installer 自動運行。在安裝后它也可以作為一個單獨的工具手工運行。用它還可以手工的輸入 SID 代替默認的 ORCL ,默認的情況下,不在 ORACLE_HOME 下面創建數據庫,完全遵循 OFA 的意圖。
建議你運行 Database Creation Assistant ,不過在最后一頁選擇[ Save information to a batch file ] (保存信息到一個批處理文件中),再點擊[完成]按鈕。這會產生幾個腳本。從不同的平臺對比它們的內容很有趣的。在Unix 和 Windows 上的內容很相似,除了 windows 上對 oradim 的調用不同。第一次對它的調用產生了一個與ORACLE 數據庫相關聯的 ORACLE 服務:
D:\ORACLE\Ora817\bin\oradim -new -sid ATEI -intpwd man -startmode manual -pfile "D:\ORACLE\admin\atei\pfile\initatei.ora"
第二次對 oradim 的調用把服務更改為自動啟動:
D:\ORACLE\Ora817\bin\oradim -edit -sid atei -startmode auto
可以用這些文件作為創建其它數據庫的模版。若你不使用上面建議的方式創建數據庫的話, Database Creation Assistant 生成的這些文件和目錄沒什么大用處。在使用這些腳本創建額外的數據庫之前,這些文件和目錄不得實現創建。特別注明一下,腳本假定一個密碼文件已經存在 , 密碼文件可以用 orapwd 命令預創建 [2 H Kelly III, 2000] 。
Database Creation Assistant 創建的目錄: Windows 2000 Unix ORACLE_BASE = D:\oracle ORACLE_BASE = /db01/app/oracle ORACLE_BASE\oradata\atei $ORACLE_BASE/oradata/eighti ORACLE_BASE\oradata\atei\archive $ORACLE_BASE/oradata/eighti/archive ORACLE_BASE\admin\atei $ORACLE_BASE/admin/eighti 還有這些子文件夾:sadhoc bdump cdump create exp pfile udump
通過 Database Creation Assistant 創建 / 改動的文件: Windows 2000 Unix ORACLE_HOME = D:\oracle\ora817 ORACLE_HOME = /db01/app/oracle/product/8.1.7 ORACLE_HOME\database\PWDatei.ora $ORACLE_HOME/dbs/orapweighti.ora ORACLE_BASE\admin\atei\pfile\initatei.ora $ORACLE_BASE/admin/eighti/pfile/initeighti.ora ORACLE_HOME\database\initatei.ora?
包含一行?
IFILE='d:\oracle\admin\atei\pfile\initatei.ora‘$ORACLE_HOME/dbs/initeighti.ora?
符號鏈接到:?
/db01/app/oracle/ admin/eighti/pfile/initeighti.ora添加到 tnsnames.ora 的條目 添加到 tnsnames.ora 的條目 添加到 listener.ora 的條目 添加到 listener.ora 的條目 windows 沒有相關的操作 添加項目到 oratab >
通過 Database Creation Assistant 創建的腳本: Windows 2000 Unix 注釋 atei.bat eighti 調用其它腳本 , 在 Windows 上還可以調用 ORADIM ateirun.sql eightirun.sh 包含創建數據庫的語句 ateirun1.sql eightirun1.sh 創建表空間 / 創建回滾段 不創建系統中的第二個回滾段 N/A eightirun2.sh 額外的腳本(如,catproc ) ,?
這些在 Windows 上從 ateirun1.sql 中運行ateisqlplus.sql eightisqlplus.sh 添加 SQL*Plus 幫助?
@c:\oracle\ora817\sqlplus\admin\help\helpbld.sql helpus.sqlateialterTablespace.sql eightialterTablespace.sh 為 SYSTEM 用戶更改默認的和臨時的表空間 ateireplicate.sql ateijava.sql?
ateiordinst.sql?
ateiiMedia.sql?
ateidrsys.sql?
ateicontext.sql?
ateispatial1.sql?
ateitimeseries.sql?
ateivirage.sql?eightireplicate.sh eightijava.sh?
eightiordinst.sh?
eightiiMedia.sh?
eightidrsys.sh?
eighticontext.sh?
eightispatial1.sh?
eightitimeseries.sh?
eightivirage.sh各種腳本,只有在你選擇相應的選項的時候才會生成。
遠程掛接(mount)的文件系統,如 UNIX 上的 NFS 和 Windows 2000 上 UNC ,在兩個平臺上都不支持。