程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 從Oracle數據庫的用戶錯誤中恢復

從Oracle數據庫的用戶錯誤中恢復

編輯:Oracle數據庫基礎
這是摘錄自Damir Bersinic 和John Watson編著的《Oracle Database 10g OCP Certification All-In-One Exam Guide》一書中第29章內容,Oracle出版社copyright 2006,McGraw-Hill分公司。點擊這裡閱讀完整章節。

  在這章中你將會學到如何:

  ·使用回閃技術恢復被刪除的表

  ·管理回收的二進制文件

  ·執行回閃表操作

  ·使用回閃版本查詢從用戶錯誤中恢復

  ·使用回閃事務查詢執行事務級別的恢復

  前面的章節介紹了回閃數據庫,一種強大但是非常有個性的功能,相當於不完全恢復。這一章覆蓋的內容是Oracle 10g數據庫中可用的其它回閃技術。這些都不像回閃數據庫那麼極端,它們都不依賴於停機時間或者損失的數據量。它們是靜態的,然而,也是通過撤銷你不想要的修改提交來恢復錯誤的非常強大的技術。

  這裡討論的回閃技術,首先,使回閃刪除,可以通過使用DROP TABLE命令來激活和執行;第二,使用UNDO功能的不同方式:回閃版本查詢,回閃表查詢,以及回閃事務查詢。

  回閃和ACID測試

  還記得第9章中描述的ACID測試嗎。這是關系型數據庫必須遵循的規則的一部分,對於理解回閃技術也是至關重要的:不論是它們的功能,還是它們的局限性。

  所有的數據管理語言事務都是通過COMMIT或者ROLLBACK語句來結束的。到那個時候,因為事務已經執行了,出於Oracle實現的事務隔離的原則(ACID測試中的I),保證除了執行事務的會話之外,沒有人能夠看到進行的修改。

  進一步講,原子性的原則(ACID測試中的A)也保證了事務可以用ROLLBACK來終結這個事務,這可以將修改徹底地恢復過來;沒有其它會話會知道進行了哪些修改。如果事務是以COMMIT終結的,那麼修改就會立即被所有其它會話看到。惟一的例外情況就是任何出於讀一致性原因(ACID測試中的C)的會話必須與這個修改相隔離。此外,一旦事務被提交了,那麼數據庫要丟失這個修改是決對不可能的;這就是ACID測試中的D,持久性。

  在很多方式上,數據定義語言的命令都與其它的事務沒什麼兩樣。關系型數據庫需要這樣的規則,以保證經過提交的數據定義語言永遠不會被翻轉,所有的數據定義語言都是自動提交的。你對此無法進行控制;COMMIT是所有數據定義語言命令中很重要的一部分。

  Flashback Drop提供了一種方式讓你能夠撤銷DROP TABLE 命令的影響,但是不能保證它會成功。這要根據執行了DROP命令之後數據庫中進行的其它活動。你可以使用各種回閃查詢命令來翻轉數據管理語言命令,但是,還要再一次強調的是,它是否成功取決於在這段時間內發生的其它活動。不可能回滾一個已經提交的事務,無論是數據管理員語言還是數據定義語言。ACID測試不允許這樣。回閃技術依賴於構建另一個可以翻轉最初事務影響的事務,但是這個新的事務有可能會失敗,因為其它的,相反的已經被提交的修改。

這是摘錄自Damir Bersinic 和John Watson編著的《Oracle Database 10g OCP Certification All-In-One Exam Guide》一書中第29章內容,Oracle出版社copyright 2006,McGraw-Hill分公司。點擊這裡閱讀完整章節。

  在這章中你將會學到如何:

  ·使用回閃技術恢復被刪除的表

  ·管理回收的二進制文件

  ·執行回閃表操作

  ·使用回閃版本查詢從用戶錯誤中恢復

  ·使用回閃事務查詢執行事務級別的恢復

  前面的章節介紹了回閃數據庫,一種強大但是非常有個性的功能,相當於不完全恢復。這一章覆蓋的內容是Oracle 10g數據庫中可用的其它回閃技術。這些都不像回閃數據庫那麼極端,它們都不依賴於停機時間或者損失的數據量。它們是靜態的,然而,也是通過撤銷你不想要的修改提交來恢復錯誤的非常強大的技術。

  這裡討論的回閃技術,首先,使回閃刪除,可以通過使用DROP TABLE命令來激活和執行;第二,使用UNDO功能的不同方式:回閃版本查詢,回閃表查詢,以及回閃事務查詢。

  回閃和ACID測試

  還記得第9章中描述的ACID測試嗎。這是關系型數據庫必須遵循的規則的一部分,對於理解回閃技術也是至關重要的:不論是它們的功能,還是它們的局限性。

  所有的數據管理語言事務都是通過COMMIT或者ROLLBACK語句來結束的。到那個時候,因為事務已經執行了,出於Oracle實現的事務隔離的原則(ACID測試中的I),保證除了執行事務的會話之外,沒有人能夠看到進行的修改。

  進一步講,原子性的原則(ACID測試中的A)也保證了事務可以用ROLLBACK來終結這個事務,這可以將修改徹底地恢復過來;沒有其它會話會知道進行了哪些修改。如果事務是以COMMIT終結的,那麼修改就會立即被所有其它會話看到。惟一的例外情況就是任何出於讀一致性原因(ACID測試中的C)的會話必須與這個修改相隔離。此外,一旦事務被提交了,那麼數據庫要丟失這個修改是決對不可能的;這就是ACID測試中的D,持久性。

  在很多方式上,數據定義語言的命令都與其它的事務沒什麼兩樣。關系型數據庫需要這樣的規則,以保證經過提交的數據定義語言永遠不會被翻轉,所有的數據定義語言都是自動提交的。你對此無法進行控制;COMMIT是所有數據定義語言命令中很重要的一部分。

  Flashback Drop提供了一種方式讓你能夠撤銷DROP TABLE 命令的影響,但是不能保證它會成功。這要根據執行了DROP命令之後數據庫中進行的其它活動。你可以使用各種回閃查詢命令來翻轉數據管理語言命令,但是,還要再一次強調的是,它是否成功取決於在這段時間內發生的其它活動。不可能回滾一個已經提交的事務,無論是數據管理員語言還是數據定義語言。ACID測試不允許這樣。回閃技術依賴於構建另一個可以翻轉最初事務影響的事務,但是這個新的事務有可能會失敗,因為其它的,相反的已經被提交的修改。

回閃刪除

  意外刪除了一個表是非常有可能發生的。不僅僅是你有可能因為輸入錯誤而刪除了錯誤的表;也有可能是正確的表,但是你連接了錯誤的計劃,或者是登錄到錯誤的環境中去。你可以減少這種可能性,通過設置你的SQL*Plus提示,例如: SQL> set sqlprompt "_user'@'_connect_identifIEr> "
SYSTEM@ocp10g>

  貼士:要讓所有的SQL*Plus會話都自動設置你的提示符,在glogin.sql文件中添加上述命令,在Oracle_HOME/sqlplus /admin目錄裡。

  回閃刪除可以讓你恢復前面一個被刪除的表(但是不是截取表),就好像它被刪除之前。所有的索引都會被恢復,還有所有的觸發器和許可。Unique,主鍵,還有非空約束也都會恢復,但是外鍵約束無法恢復了。

  測驗:回閃刪除只能應用於表上,但是所有相關的對象也都會被恢復,除了外鍵約束。

  回閃刪除的實現

  在Oracle數據庫的早期版本中,當一個表被刪除了,所有的參考都從數據字典中刪除。如果有可能看到原來的DROP TABLE命令的源代碼的話,你可以看到它實際上是一系列對定義了表和它的空間使用情況的系統計劃中各種表的DELETE命令,後面跟著一個COMMIT。這實際上沒有從硬盤中刪除數據,但是刪除表所用的空間被標志為沒有使用,因此可以獲得重用。即使是表所在的塊還在,也沒有可能取回它們了,因為數據字典已經沒有對屬於這個被刪除的表的任何塊有任何記錄,惟一恢復被刪除表的方法就是做一個時間點恢復,重新存儲刪除之前某個時間點的數據庫版本,這個版本中數據字典中仍然保留表的信息。

  在發布的10g Oracle數據庫中,DROP TABLE命令的實現被完全改變了。表再也不是刪除了,它們是被改名了。

  在圖29-1中,你可以看到這個表,OLD_NAME,占據的空間范圍是64KB,從文件6的第17個塊開始。在修改名字為NEW_NAME之後,存儲空間還是如此;因此,表是一樣的。查看DBA_OBJECTS視圖,你可以看到表的對象號沒有發生改變。10g版本中關於DROP TABLE命令的實現在內部映射到了RENAME命令,它會對標和所有相關的索引、觸發器和約束產生影響,除了外鍵約束,它已經被刪除了。外鍵約束實際上必須要刪除。如果它們保留了的話,即使是換了一個名字,在沒有被刪除的父表上的數據管理語言就會被已經刪除的表的目錄所約束,這是荒謬的。

  表上的許可沒有名字,所以它們不能被改名。但是即使是當你給對象指定了某個名字的許可權限,後台存儲的對象的許可參考仍然是靠著數字。因為對象號沒有被RENAME操作修改,許可也就失效了。

  說到一般的SELECT和數據管理語言語句,一個被刪除的表確實就是被刪除了。這與其它任何命令都沒有區別,你所有的軟件都會假定那個被刪除的表是真的沒有了。但是現在,DROP實際上是RENAME,這就有可能取消刪除,通過把這個表的名字再改回來到最初的名字。然而,這不能保證成功。被刪除的表的空間有可能被再次使用。並且如果在這個時間段裡面有另外一個表被創建了,重新使用了被刪除表的名字,那麼情況就復雜了。

     

  被刪除的對象可以查詢到,通過查看“回收箱”可以得到它們的新名字。這是一個所有被刪除對象的列表,映射到原來的表,索引投射到系統給被刪除對象生成的名字上。每個用戶都有一個回收箱,在USER_RECYCLEBIN數據字典視圖中可以看到,或者是一個全局的畫面,你可以查詢DBA_RECYCLEBIN。回收箱對象占用的空間可以在表空間遇到空間壓力的時候自動重用(之後對象就無法恢復了),或者你可以手工地強制Oracle真正地刪除對象,使用PURGE命令。

  貼士:回閃刪除不能保證成功,但是它也可以工作良好。你越早執行它,成功的可能性越大。

查詢示范:

  刪除表之後,你如何才能訪問到其中的行呢?(選擇最好的答案)

  5、使用AS OF語法查詢表

  6、使用BEFORE DROP語法查詢表

  7、使用回收箱名字查詢表

  8、不能查詢,直到恢復

  如果表已經被刪除了,另外一個表用同樣的名字創建,以下哪句話是正確的?(單選)

  5、你必須在你回閃被刪除的表之前把這個新表改名

  6、如果你為那個被刪除的表指定一個新的名字的話,可以回閃這個表。

  7、你可以在不同的計劃中回閃這個被刪除的表

  8、你必須在回閃原來的表之前刪除這個新表。

  以下那個環境中回閃會起作用?(單選)

  6、當表被截斷的時候

  7、當表被清除的時候

  8、當用戶被刪除的時候

  9、當索引被刪除的時候

  10、以上都不是

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved