摘要
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_eightioracle8 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.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 上,從作業系統中察看後台進程有些困難。從工作管理員中可能會看到運行著的應用(工作管理員的察看方法:在工作列點擊右鍵選擇 " 工作管理員 " )。在伺服器上 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.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 會話可以通過輸入如下的命令斷開:
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 中。
http://www.dbanotes.net/database/oracle_unix_vs_windows_2000.html