啟動Oracle常見疑難問題分析
2024-08-29 13:48:01
供稿:網友
啟動Oracle常見疑難問題分析 (2003-10-1)
本文出自《網管員世界》2003年第10期“故障診斷”欄目
實例和數據庫的啟動與關閉是DBA的重要職責之一。只有打開數據庫,其他用戶才能對數據庫中的數據進行操作。一旦數據庫關閉,便不能對其操作。對于DBA們來說,關閉和重新啟動數據庫以便優化、調整應用程序的運行是經常碰到的事情。假如用戶已經進入了數據庫,使用SHUTDOWN IMMEDIATE 或SHUTDOWN ABORT命令來執行關閉數據庫,則用戶將失去連接,直到數據庫重新啟動。經常關閉和啟動會對數據庫性能造成一定的影響,當然也會影響到用戶對數據庫的使用。本文從治理數據庫的角度來分析在Oracle啟動和關閉時經常碰到的問題,并總結了在啟動和關閉Oracle數據庫中應該注重的問題和事項。
啟動常見問題
(一)在一個控制文件被損壞情況下,如何正常啟動?
系統環境
操作系統:windows 2000 Advanced Server
數據庫: Oracle 8i R2 (8.1.6) for NT 企業版
安裝路徑:C:/ORACLE
錯誤現象
因硬盤有壞道,一個控制文件損壞了,或人工誤刪一個控制文件,控制面板的Oracle相關服務可以啟動成功,但用SQL*Plus無法連接。錯誤提示為“ORA-01034: ORACLE not available”。
解決方法
(1)在開始菜單中直接運行命令,進入“svrmgrl>”提示符模式。
(2)在“svrmgrl>”提示符下鍵入“connect internal”命令。
(3)在“svrmgrl>”提示符下鍵入“shutdown abort”命令關閉數據庫。
(4)找到init.ora文件,它一般位于“C:/Oracle/admin/oradb/pfile”目錄下,然后修改init.ora文件,使無法使用的控制文件不在control_files參數中定義。如“C:/Oracle/oradata/oradb/control03.ctl”,可在init.ora中將其刪除掉,或者更換成其它可啟動的控制文件。
修改前:
control_files=(“C:/Oracle/oradata/oradb/control01.ctl”.C:/Oracle/oradata/oradb/control02.ctl“,”“C:/Oracle/oradata/oradb/control03.ctl”)
修改后:
control_files=(“C:/Oracle/oradata/oradb/
control01.ctl”,“C:/Oracle/oradata/oradb/control02.ctl”)
(5)重新啟動數據庫實例,即可解決問題。
注重:在控制文件中最少要有兩個控制文件。
(二)聯機熱備份失敗后,如何打開數據庫?
系統環境:
操作系統:Windows 2000 Advanced Server
數據庫: Oracle 8i R2 (8.1.6) for NT 企業版
安裝路徑:C:/ORACLE
錯誤現象
進行聯機熱備份時,服務器發生故障(如掉電等)。重新啟動服務器后,再啟動數據庫時,無法打開數據庫,Oracle要求進行介質恢復,因為表空間還處在熱備份狀態。
解決方法
(1)先將數據庫設置為歸檔模式
C:/>svrmgrl
svrmgrl>connect internal
svrmgrl>alter tablespace 表空間名 begin backup;
說明:這是在表空間進行熱備份模式沒結束時,就強行關閉數據庫所造成的錯誤。
svrmgrl>shutdown abort
svrmgrl>startup mount
(2)將此表空間的數據文件在沒打開數據庫時,設置成“end backup”模式
svrmgrl>alter database datafile '表空間的數據文件名' end backup;
(3)執行表空間介質恢復
svrmgrl>recover tablespace 表空間名;
svrmgrl>alter database open;
(三)Oracle啟動時,監聽器不啟動或打開出錯?
錯誤現象:
ORACLE啟動時,監聽器不啟動或打開出錯;服務器端:用username/passWord登錄正常,但用username/password@alias登錄不成功;客戶端:用username/password@alias登錄不成功
解決方法
(1)假如是因為修改了NT的機器名,則把listener.ora文件中的host參數全部改為新的NT機器名,重新啟動OracleTNSListener80服務即可。
例如:
LISTENER =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(Host = NT_Name)(Port = 1521))
(ADDRESS=(PROTOCOL=TCP)(Host=NT_Name)(Port= 1526))
)
(2)使用監聽器實用程序:LSNRCTL80.exe。
(3)檢查監聽器參數文件:c:/orant/NET80/admin/
listener.ora。
(4)檢查監聽器日志文件:c:/orant/NET80/log/
listener.log。
(5)Tnsnames.ora文件配置錯誤,重新配置。
(6)檢查client端 Tnsnames.ora。
(四)Oracle Enterprise Manager(OEM)工具中如何以SYSOPER、SYSDBA方式登錄?
軟件環境:
Windows NT4.0+ORACLE 8.0.4
ORACLE安裝路徑為:C:/ORANT
錯誤現象
在以Oracle Enterprise Manager(OEM)工具登錄數據庫時,不論是sys用戶、system用戶,還是其他用戶,在Connect As欄中以sysdba或sysoper角色登錄均遭拒絕,報錯:Ora-01017:invalid username/password;logon denied,但以normal登錄成功。
出錯分析
在Oracle數據庫中有三種連接方式:
(1)normal正常方式,基本連接方式,級別較低。
(2)sysopr系統方式,系統連接方式,高一級。
(3)sysdba治理員方式,是數據庫治理員連接方式,級別最高。
Oracle8中,sys、system已經只是具有特權的普通用戶,而internal才是DBA。所以在DBA進行治理數據時,只能使用具有特權的“internal”連接方式才不會出錯。
解決方法
以internal/oracle方式連接即可。
Oracle數據庫的啟動
啟動實例
啟動實例,以使Oracle Server完成如下任務:
◆ 讀參數文件init.ora文件,以決定如何初始化該實例;
◆ 根據參數文件中提供的SGA大小,來為SGA分配存貯空間;
◆ 啟動后臺進程;
◆ 打開后臺跟蹤文件。
實例啟動分正常啟動和約束啟動。所謂約束啟動,就是當數據庫打開后,只能使具有RESTRICTED session系統特權的用戶與其相連接。而正常啟動則答應所有用戶與其相連接。
實例啟動有如下三種方式:
◆ 只啟動實例;
◆ 啟動實例并安裝數據庫,但不打開數據庫;
◆ 啟動實例,并安裝和打開數據庫。
數據庫安裝
數據庫安裝就是將指定的數據庫與已啟動的實例相聯系。被安裝的數據庫在打開之前保持關閉,此時只有DBA能存取。在安裝數據庫時,實例查找參數文件中的CONTROL-Files參數所指定的控制文件,并打開它,從中取得數據庫的數據文件名和日志文件名,然后確認這些文件是否存在。假如希望多個實例并發地安裝同一個數據庫,則DBA可選擇并行方式安裝該數據庫。假如希望只有一個實例可安裝該數據庫,則選擇專用方式安裝該數據庫。假如ORACLE版本不支持并行服務器選項,則只能按專用方式安裝數據庫。當選擇并行方式安裝數據庫時,并發安裝同一個數據庫的實例個數受預定義最大值的限制,而且在參數文件中必須有命名的私用回滾段或可用的公用回滾段。
打開數據庫
在安裝的數據庫被打開之前,所有合法的用戶(除DBA)都不能對該數據庫進行連接和存取;只有被打開以后才能進行連接和存取。在打開數據庫的同時,實例也打開在線的數據文件和在線日志文件。假如數據庫是由于實例的異常而中止或電源故障而被關閉時,則下次打開它時會自動執行實例恢復。在數據庫被打開時,實例試圖獲取一個或多個回滾段。在分布事務中,若當—個數據庫因電源故障等忽然被關閉,此時若有一個或多個分布式事務還沒提交或回滾,則在該數據庫被重新打開時,繼續完成實例恢復,RECO后臺進程將自動、立即和一致地解決尚未提交或回滾的任何分布事務。
常用打開數據庫和實例命令方式
(1)startup nomount
非安裝啟動,這種啟動方式下可執行:重建控制文件、重建數據庫和啟動instance,即啟動SGA和后臺進程,這種啟動只需要init.ora文件。
(2)startup mount dbname
安裝啟動,這種啟動方式下可執行:數據庫日志歸檔、數據庫恢復和重新命名一些數據庫文件。
(3)startup open dbname
先執行“nomount”,然后執行“mount”,再打開包括Redolog文件在內的所有數據庫文件,這種方式下可訪問數據庫中的數據。
(4)startup等于以下三個命令
startup nomount
alter database mount
alter database open
(5)startup restrict
約束方式啟動,這種方式能夠啟動數據庫,但只答應具有一定特權的用戶訪問,非特權用戶訪問時,會出現以下提示:
ERROR:
ORA-01035: Oracle 只答應具有RESTRICTED SESSION權限的用戶使用。
(6)startup force
強制啟動方式,當不能關閉數據庫時,可以用startup force來完成數據庫的關閉,先關閉數據庫,再執行正常啟動數據庫命令。
(7)startup pfile=參數文件名
帶初始化參數文件的啟動方式,先讀取參數文件,再按參數文件中的設置啟動數據庫。例:startup pfile=E:/Oracle/admin/oradb/pfile/init.ora
(8)startup exclusive
SQL>conect internal
作為internal連接時,connect命令不需要口令,因為其授權是由操作系統隱式提供的。
Internal連接等價于sys連接,它們都是擁有Oracle數據字典的用戶。
應用
在Unix下啟動Oracle8i,其整個過程步驟如下:
(1)telnet 主機ip或者是主機名
user:***** password:*****
(2)lsnrctl start
(3)svrmgrl
(4)svrmgrl>connect internal
(5)svrmgrl>startup
實例和數據庫的關閉
關閉實例的步驟
關閉實例后,SGA從內存撤消,后臺進程被停止。關閉實例的步驟如下:
(1)啟動SQL*DBA
(2)作為INTERNAL用戶與數據庫相連接
(3)關閉實例
◆ 關閉數據庫
◆ 卸下數據庫
◆ 關閉實例
關閉數據庫
數據庫關閉時,首先將SGA中的所有數據庫數據和日志項數據寫入相應的數據文件和日志文件。然后關閉所有聯機數據文件和日志文件。在數據庫關閉后和卸下之前,控制文件仍保持打開,此時假如需要打開時,還可重新打開數據庫。
卸下數據庫
卸下數據庫就是切斷實例與數據庫的聯系,關閉數據庫控制文件,使內存僅保留實例。
常用關閉數據庫和實例命令
(1)shutdown normal(正常關閉數據庫)
在正常關閉情況下,Oracle在關閉數據庫前,等待所有與之相連接的用戶正常結束其對話。于是在下次啟動數據庫時,就不需要恢復實例。
(2)shutdown immediate(立即方式關閉數據庫)
當選擇Immediate關閉方式時,即實現直接關閉。在SVRMGRL中執行shutdown immediate,數據庫并不立即關閉, 而是在Oracle執行某些清除工作后才關閉(終止會話、釋放會話資源),當使用shutdown不能關閉數據庫時,shutdown immediate可以完成數據庫關閉的操作。
該關閉方式主要用于下列情況:
①馬上停電;
②Oracle正在非正規的運行數據庫或一個數據庫應用。
該方式關閉數據庫過程如下:
①Oracle結束當前正在處理的SQL語句;
②回滾未提交的事務;
③Oracle不等待與之相連接的用戶退出連接,就直接中斷他們,使用這種關閉方式,下次啟動數據庫時,Oracle應自動執行實例恢復。
(3)shutdown abort(撤消實例方式關閉數據庫)
這是一種最快的關閉方式,它主要用于下列情況:
①一分鐘后就要停電;
②Oracle正在非正規的運行數據庫或一個數據庫應用,并且其它的關閉方式失效;
③啟動一個數據庫實例時碰到問題。
該方式關閉數據庫的過程如下:
①Oracle不等待調用完成,直接中斷正在處理的SQL語句;
②回滾未提交事物。
使用這種關閉方式,下次啟動數據庫時,Oracle應自動執行實例恢復。啟動和關閉實例和數據庫的操作需要connect internal系統特權,安裝和打開數據庫的操作還要有alter database系統特權。直接關閉數據庫,正在訪問數據庫的會話會被忽然終止,假如數據庫中有大量操作正在執行,這時執行shutdown abort后,重新啟動數據庫需要很長時間。
應用
在Unix中關閉Oracle8i,其具體步驟如下:
svrmgrl>connect internal
svrmgrl>shutdown
svrmgrl>exit
在關閉Oracle數據庫時需注重問題
不要提前關閉SQL*NET。
當需要SHUTDOWN數據庫,不要提前關閉SQL*NET,直到確認關閉了SERVER上的所有數據庫后再關閉SQL*NET。假如關閉了SQL*NET,用戶將失去和數據庫的會話。
存檔或刪除舊的trace files和logs
當啟動Oracle的一個實例時,Oracle把關于該實例的診斷信息寫入指定的trace和log文件。每個后臺進程都增加一個TRACE文件,它被存儲在指定的目錄,該路徑由INIT.ORA或CONFIG.ORA文件中的BACKGROUND_DUMP_DEST參數指定。用戶在數據庫中碰到一個內部錯誤時也增加用戶的TRACE文件,該文件的位置由INIT.ORA或CONFIG.ORA文件中的USER_DUMP_DEST參數指定。TRACE文件的個數和名稱形式由使用數據庫的操作系統決定。
在每次啟動和關閉數據庫時,Oracle不會自動刪除TRACE文件。假如長期不刪除這些無用文件,它們將占據數據庫中大量的自由空間。數據庫治理員應該很好的治理這些文件,可以采取刪除或者存檔的策略來避免無用文件占用大量自由空間。
SQL*NET也產生LOG文件,一般叫LISTENER.LOG,LISTENER.LOG文件大小也隨著啟動的次數不斷的變大,所以通過妥善治理它也能有效的利用空間。查看該文件可以鍵入命令:
lsnrctl status
在Oracle8i中使用該命令,其顯示結果為:
o200 5% lsnrctl status
LSNRCTL for SGI IRIX64: Version 8.1.6.0.0 - ProdUCtion on 09-APR-2003 09:16:26
(c) Copyright 1998, 1999, Oracle Corporation. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY))
STATUS of the LISTENER
Alias LISTENER
Version TNSLSNR for SGI IRIX64: Version 8.1.6.0.0 - Production
Start Date 19-MAR-2003 14:43:53
Uptime 20 days 18 hr. 4607182418800017439 min. 56 sec
Trace Level off
Security OFF
SNMP OFF
Listener Log File /data/ora8i/OraHome/network/log/listener.log
The listener supports no services
The command completed successfully
改名ALERT LOG文件
ALERT LOG文件也是用來記錄INSTANCE的診斷信息的。
它的存放目錄也通過BACKGROUND_DUMP_DEST參數來指定。一般情況下ALERT LOG文件命名方式為:ALERT_ .LOG。ALTER LOG文件包括了一些數據庫主要事件信息,例如:startup和shutdown及redolog的使用、表空間的改變、文件的改變、內部錯誤信息和數據庫備份狀態的改變等。
ALTER LOG在后續數據庫的使用中,其增長速度非???。假如一段時間后,再查看它時,其文件已經變得非常大,所以查看它是非常的費勁。一般來講,為了既能留下這些有用的信息,同時不至于浪費很大的空間,最好的治理辦法就是給它改名。可以在任何時候更改ALTER LOG文件名,建議在SHUTDOWN/STARTUP數據庫時更改名字。