關於Oracle中重啟資料庫的一個bug

來源:互聯網
上載者:User

關於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存在的一種意義和價值所在。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.