關於Oracle中重啟資料庫的一個bug
關於drop database在Oracle中是致命的操作,這個操作自己在測試環境中體驗過,會完全刪除資料檔案,因此這個操作非常敏感但是實用性不強,不過話說過來,這個操作也不是隨便就能執行的,除了操作敏感的許可權之外,其實還是有一些前提條件的。
在資料庫open狀態,是無法運行這個命令的。
SQL> drop database TEST;
drop database TEST
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
需要重啟到mount階段。
SQL> alter database mount exclusive;
Database altered.
SQL> drop database TEST;
drop database TEST
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
同時還要保證處於exclustrict模式。
SQL> drop database;--要執行還是不容易的。
drop database
*
ERROR at line 1:
ORA-12719: operation requires database is in RESTRICTED mode
SQL> alter system enable restricted session;
System altered.
SQL> drop database;
Database dropped.
今天網友提供了一個精簡的兩個命令。就把停庫,重啟到Mount,設定restrict mode,drop database的步驟都完成了。
自己在本地的測試庫中也嘗試了一下,看看能不能啟動到restrict模式下.,結果啟動並執行時候報了一個ORA錯誤就退出了。
idle> startup force mount restrict;
ORA-00000: normal, successful completion
其實對於這個問題,oerr的解釋感覺有些牽強,至少對於我來說是不可接受的。
$ oerr ora 00000
00000, 00000, "normal, successful completion"
// *Cause: Normal exit.
// *Action: None.
順著這個問題在metalink上看了一圈,突然有一個文章引起了我的注意,就是關於錢包的一個設定。
關於錢包的設定,可以參考我之前對比MySQL和Oracle無密碼登入的案例。http://blog.itpub.net/23718752/viewspace-1659551/
metalink中相關的文章是Bug 11706168 - ORA-00000 during STARTUP with SQLNET.WALLET_OVERRIDE=TRUE (Doc ID 11706168.8)
由此可見很可能就是我碰到的這個bug.
我們來簡單驗證和複現一下。
如果啟用錢包的這個override特性,就出出現問題。
sys@TEST11G> startup force
ORA-00000: normal, successful completion
sys@TEST11G> !cat sqlnet.ora|grep SQLNET
SQLNET.WALLET_OVERRIDE=true
如果禁用,就會發現能夠正常重啟了。
idle> startup force
ORACLE instance started.
Total System Global Area 435224576 bytes
Fixed Size 1337044 bytes
Variable Size 272632108 bytes
Database Buffers 155189248 bytes
Redo Buffers 6066176 bytes
Database mounted.
Database opened.
idle> !cat sqlnet.ora|grep SQLNET
#SQLNET.WALLET_OVERRIDE=true
對於這個問題的測試還沒有完,我們可以深究一下,這個問題在什麼情境下還會出現。
其實在同一個session中進行資料庫的重啟也是會有問題的。
我們在同一個session內重啟,停庫
idle> startup
ORACLE instance started.
Total System Global Area 435224576 bytes
Fixed Size 1337044 bytes
Variable Size 272632108 bytes
Database Buffers 155189248 bytes
Redo Buffers 6066176 bytes
Database mounted.
Database opened.
idle> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
當再次重啟的時候,就會出現這個問題了,當然這個問題還是和錢包相關的。
idle> startup
ORA-00000: normal, successful completion
idle> !cat sqlnet.ora|grep SQLNET
SQLNET.WALLET_OVERRIDE=true
最後亮出那個精簡的命令,看看效果。
sys@TEST11G> startup force mount restrict;
ORACLE instance started.
Total System Global Area 435224576 bytes
Fixed Size 1337044 bytes
Variable Size 272632108 bytes
Database Buffers 155189248 bytes
Redo Buffers 6066176 bytes
Database mounted.
可以看到資料庫可以很快的重啟到Mount階段,然後設定為restrict模式。
當然,startup force也就是個人本地測試環境玩玩,工作中的環境中一概要撇清關係,因為後果是很嚴重的,別說破壞性操作,就算新特性的使用都是謹慎又謹慎的,這也是我們DBA存在的一種意義和價值所在。