項目中一直在使用Oracle數據庫,由於我之前更多的是關注ORM映射框架,幾乎沒有關注過Oracle特性的東西,很多東西都不知道,而且項目中換數據庫的概率幾乎為零,所以有必要好好研究一下Oracle。正所謂,不怕不知道,就怕不知道嘛。不然遇到問題,都不知道從哪裡下手。
這兩天的Oracle學習,收獲不小。前幾天測試中遇到很多的稀奇古怪的問題,都被很好的解釋了。這裡就一個典型的例子談一談。
就是在測試階段,看著經理熟練的操作Oracle的各個指令,內心就已經有了一點不平靜。經理就是經理,這都是多少年不寫代碼的人了,這些Oracle指令還記的那麼清楚。
系統首次測試的時候,報出了一堆莫名其妙的bug。結果發現是備份的數據庫不完整。結果導致測試環境中的數據庫中缺少不少表和視圖。
PS:當時我的想法是,Oracle這東西,為啥非要往虛擬機裡裝啊,暈菜~~~ 可是事實證明,往虛擬機裡裝Oracle是沒問題的~~~
我們找到問題後,都感覺很莫名其妙,Oracle數據庫怎麼會有這樣的問題呢?一定不是數據庫的問題,可是備份的步驟很固定啊,不會有問題啊。而且之前gxpt項目中,數據庫備份還原度時候,也沒有這問題啊。不應該在gxpt還原中沒問題,在tky項目就有了問題啊。
現在才發現,這是由於Oracle的閃回技術造成的。Oracle數據庫也跟windows系統一樣,有一個回收站。執行一般的刪除表操作後,其實並沒有執行真刪除,而是將它們放在了回收站裡面。放在回收站有一個好處,就是隨時都能把刪除的表還原。
你可以在sql plus窗口中執行"select * from tab" 操作,查看數據庫中的表。這裡會查詢上來所有的表,以及一些長編碼的東西,這些東西就是你刪除表的痕跡。
但是閃回也有一些弊端。就是在數據庫備份的時候,如果回收站中未清除,就有可能造成備份數據不完整的情況。
這就解釋了備份失敗的原因。而gxpt項目中,是使用的JPA映射,自然而然就屏蔽了這些數據庫特性的東西。