如果使用“alter database open;”命令打開一個曾經被“alter database close;”命令關閉的數據庫時,您將會收到如下的報錯信息:"ORA-16196: database has been previously opened and closed"這個報錯的原因是什么呢?原因是:一個實例在其生存期中最多只能裝載和打開一個數據庫。要想再打開此數據庫,必須先停掉這個實例再重新啟動數據庫。基于上面的報錯信息和原因,我來通過一個實驗來展示一下這個過程,以便有一個感性上的認識。1.為了保證實驗環境的“純潔”,先重新啟動一下數據庫(這里我使用的Oracle版本是10.2.0.3)ora10g@secDB /home/oracle$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on Sun Oct 25 23:07:57 2009
Copyright (c) 1982, 2006, Oracle.? All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
sys@ora10g> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ora10g> startup;
ORACLE instance started.
Total System Global Area 2147483648 bytes
Fixed Size????????????????? 2074152 bytes
Variable Size???????????? 637536728 bytes
Database Buffers???????? 1493172224 bytes
Redo Buffers?????????????? 14700544 bytes
Database mounted.
Database opened.
sys@ora10g>2.在數據庫啟動成功之后,我們通過v$database視圖和v$instance視圖查看一下當前數據庫的狀態,以便和close后的狀態進行比較sys@ora10g> select open_mode from v$database;OPEN_MODE----------READ WRITEsys@ora10g> select status from v$instance;STATUS------------OPEN可以看到現在的數據庫狀態是open并且是可讀寫操作的狀態。3.此時我們使用“alter database close;”命令關閉數據庫(注意這里我的用詞,關閉的是“數據庫”不是“實例”)執行這個命令需要等待一段時間才能完成,存在一個數據庫連接清理的過程。如果在Oracle 9i的環境下使用這個close命令,若數據庫中存在其他的連接,命令將無法完成,會收到“ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected”報錯信息,這里的演示環境時10g,在10g中即使是存在著其他的連接也同樣可以完成close過程。sys@ora10g> alter database close;Database altered.4.再次查詢v$database視圖和v$instance視圖中有關數據庫狀態的信息,與上面的信息進行比較sys@ora10g> select open_mode from v$database;OPEN_MODE----------MOUNTEDsys@ora10g> select status from v$instance;STATUS------------MOUNTED可以看到,此時數據庫的狀態已經變為“MOUNTED”的狀態。進一步檢查一下此時數據庫服務器有關該實例的后臺數據庫進程信息。通過下面的結果信息可以進一步確信,“alter database close;”操作并沒有將數據庫的實例關閉,僅僅是將數據庫的狀態從“OPEN”狀態帶到了“MOUNT”狀態sys@ora10g> !ps -ef | grep 'ora_.*ora10g' | grep -v greporacle???? 867???? 1? 0 22:31 ???????? 00:00:00 ora_pmon_ora10goracle???? 869???? 1? 0 22:31 ???????? 00:00:00 ora_psp0_ora10goracle???? 871???? 1? 0 22:31 ???????? 00:00:00 ora_mman_ora10goracle???? 873???? 1? 0 22:31 ???????? 00:00:00 ora_dbw0_ora10goracle???? 875???? 1? 0 22:31 ???????? 00:00:00 ora_dbw1_ora10goracle???? 877???? 1? 0 22:31 ???????? 00:00:00 ora_lgwr_ora10goracle???? 879???? 1? 0 22:31 ???????? 00:00:00 ora_ckpt_ora10goracle???? 881???? 1? 0 22:31 ???????? 00:00:00 ora_smon_ora10goracle???? 883???? 1? 0 22:31 ???????? 00:00:00 ora_reco_ora10goracle???? 887???? 1? 0 22:31 ???????? 00:00:00 ora_mmon_ora10goracle???? 889???? 1? 0 22:31 ???????? 00:00:00 ora_mmnl_ora10g5.既然數據庫的狀態現在是mount狀態,我們嘗試使用open命令重新開啟該數據庫。結果很顯然,在這樣的狀態下,我們是無法再次open該數據庫的。sys@ora10g> alter database open;alter database open*ERROR at line 1:ORA-16196: database has been previously opened and closed6.使用oerr工具查看一下“ORA-16196”報錯信息含義。從原因信息描述中可以非常清晰的得到具體的原因和后續的處理方法。sys@ora10g> ! oerr ora 1619616196, 00000, "database has been previously opened and closed"// *Cause:? The instance has already opened and closed the database,//????????? which is allowed only once in its lifetime.// *Action: Shut down the instance.7.此時如果想要重新使用該數據庫,只有按照上面提示信息中“Action:”部分描述的操作:關閉數據庫并重新開啟。sys@ora10g> shutdown immediate;ORA-01109: database not openDatabase dismounted.ORACLE instance shut down.sys@ora10g> startup ;ORACLE instance started.Total System Global Area 2147483648 bytesFixed Size????????????????? 2074152 bytesVariable Size???????????? 637536728 bytesDatabase Buffers???????? 1493172224 bytesRedo Buffers?????????????? 14700544 bytesDatabase mounted.Database opened.sys@ora10g>sys@ora10g> select open_mode from v$database;OPEN_MODE----------READ WRITEsys@ora10g> select status from v$instance;STATUS------------OPENOK,到此,數據庫又一個嶄新的生命周期開始了。
8.小結
通過上面的演示,大家應該對“