【ORA-16196】一個例項在其生命週期裡最多隻能裝載和開啟一個資料庫
如果使用“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 --
"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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個資料庫最多可有多少個例項,多少個日誌組資料庫
- RAC資料庫啟用、禁用一個例項資料庫
- 使用任意例項名來開啟資料庫測試--男人(例項)理論上能OPEN任意一個女人(資料庫)資料庫
- 一臺MySQL資料庫啟動多個例項MySql資料庫
- jafka安裝配置和啟動一個自帶例項和手寫一個例項
- 從幾個例項來記憶Activity的生命週期
- Vue例項及生命週期Vue
- vue例項以及生命週期Vue
- 《一個程式猿的生命週期》有感
- 《一個程式猿的生命週期》的感悟
- 建立和管理一個 CA 及證書的生命週期
- 在vue生命週期裡呼叫函式時犯的一個錯誤Vue函式
- Django ORM 資料庫生命週期DjangoORM資料庫
- 淺談資料庫生命週期資料庫
- 《一個程式設計師的生命週期》——有感程式設計師
- 《一個程式猿的生命週期》讀後感
- 【限制程式只開啟一個例項】
- 連線RAC資料庫中單個例項(一)資料庫
- 為同一個資料庫建立新的例項資料庫
- Vue例項的生命週期鉤子Vue
- Android如何保證一個執行緒最多隻能有一個LooperAndroid執行緒OOP
- 多例項資料庫一個用PSU(轉載)資料庫
- 06從一個例項看資料抽象與封裝抽象封裝
- Oracle Restart啟動資料庫例項故障一例OracleREST資料庫
- Salesforce 生命週期管理(一)應用生命週期淺談Salesforce
- 《一個程式設計師的生命週期》讀後感程式設計師
- vue生命週期探究(一)Vue
- 多個資料庫是否可以共有一個Oracle 11g RAC例項KG資料庫Oracle
- srvctl 是否能夠將RAC資料庫像單例項資料庫的方式一步一步啟動資料庫單例
- Activity的生命週期和啟動模式模式
- Angular元件——元件生命週期(一)Angular元件
- 多例項資料庫一個用PSU資料庫
- 2 Day DBA-安裝Oracle資料庫並建立一個資料庫-安裝選項Oracle資料庫
- 【連載】淺析React生命週期之一:掛載階段React
- 上手做一個華為鴻蒙手錶應用 4 - 生命週期事件鴻蒙事件
- [Vue系列一]vue生命週期和原始碼分析Vue原始碼
- 一個pyspark 開發練習例項Spark
- 資料庫和例項資料庫