【ORA-16196】一個例項在其生命週期裡最多隻能裝載和開啟一個資料庫

secooler發表於2009-10-25
如果使用“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 WRITE

sys@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
----------
MOUNTED

sys@ora10g> select status from v$instance;

STATUS
------------
MOUNTED

可以看到,此時資料庫的狀態已經變為“MOUNTED”的狀態

進一步檢查一下此時資料庫伺服器有關該例項的後臺資料庫程式資訊。透過下面的結果資訊可以進一步確信,“alter database close;”操作並沒有將資料庫的例項關閉,僅僅是將資料庫的狀態從“OPEN”狀態帶到了“MOUNT”狀態
sys@ora10g> !ps -ef | grep 'ora_.*ora10g' | grep -v grep
oracle     867     1  0 22:31 ?        00:00:00 ora_pmon_ora10g
oracle     869     1  0 22:31 ?        00:00:00 ora_psp0_ora10g
oracle     871     1  0 22:31 ?        00:00:00 ora_mman_ora10g
oracle     873     1  0 22:31 ?        00:00:00 ora_dbw0_ora10g
oracle     875     1  0 22:31 ?        00:00:00 ora_dbw1_ora10g
oracle     877     1  0 22:31 ?        00:00:00 ora_lgwr_ora10g
oracle     879     1  0 22:31 ?        00:00:00 ora_ckpt_ora10g
oracle     881     1  0 22:31 ?        00:00:00 ora_smon_ora10g
oracle     883     1  0 22:31 ?        00:00:00 ora_reco_ora10g
oracle     887     1  0 22:31 ?        00:00:00 ora_mmon_ora10g
oracle     889     1  0 22:31 ?        00:00:00 ora_mmnl_ora10g

5.既然資料庫的狀態現在是mount狀態,我們嘗試使用open命令重新開啟該資料庫。結果很顯然,在這樣的狀態下,我們是無法再次open該資料庫的。
sys@ora10g> alter database open;
alter database open
*
ERROR at line 1:
ORA-16196: database has been previously opened and closed

6.使用oerr工具檢視一下“ORA-16196”報錯資訊含義。從原因資訊描述中可以非常清晰的得到具體的原因和後續的處理方法
sys@ora10g> ! oerr ora 16196
16196, 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 open


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>
sys@ora10g> select open_mode from v$database;

OPEN_MODE
----------
READ WRITE

sys@ora10g> select status from v$instance;

STATUS
------------
OPEN

OK,到此,資料庫又一個嶄新的生命週期開始了。

8.小結
透過上面的演示,大家應該對“
一個例項在其生存期中最多隻能裝載和開啟一個資料庫。”這句話有了一個更加具體的理解。其實Oracle資料庫的每一個狀態都很值得認真研究,其中充滿了N多令人神往的細節。

Good luck.

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-617382/,如需轉載,請註明出處,否則將追究法律責任。

相關文章