oracle數據庫drop表后如何恢復,oracle如何查找誰刪除了數據_一文看懂Oracle是如何閃回數據庫的?

 2023-12-25 阅读 27 评论 0

摘要:概述之前其實有提到閃回的一些概念,里面比較重要的其實是閃回數據庫、閃回查詢、閃回drop,今天單獨對閃回數據庫做一下介紹,幫助大家理解下這塊內容。01閃回數據庫的特性Flashback Database 功能非常類似與RMAN的不完全恢復, 它可以把整個數據庫回

概述

之前其實有提到閃回的一些概念,里面比較重要的其實是閃回數據庫、閃回查詢、閃回drop,今天單獨對閃回數據庫做一下介紹,幫助大家理解下這塊內容。


01

閃回數據庫的特性

Flashback Database 功能非常類似與RMAN的不完全恢復, 它可以把整個數據庫回退到過去的某個時點的狀態, 這個功能依賴于Flashback log 日志,而且比RMAN更快速、高效。 因此Flashback Database 可以看作是不完全恢復的替代技術。 但它也有某些限制:

1. Flashback Database 不能解決Media Failure, 這種錯誤RMAN恢復仍是唯一選擇

2. 如果刪除了數據文件或者利用Shrink技術縮小數據文件大小,這時不能用Flashback Database技術回退到改變之前的狀態,這時候就必須先利用RMAN把刪除之前或者縮小之前的文件備份restore 出來, 然后利用Flashback Database 執行剩下的Flashback Datbase。

oracle數據庫drop表后如何恢復?3. 如果控制文件是從備份中恢復出來的,或者是重建的控制文件,也不能使用Flashback Database。

4. 使用Flashback Database鎖能恢復到的最早的SCN, 取決于Flashback Log中記錄的最早SCN。


02

閃回數據庫 的架構

Flashback Database 整個架構包括一個進程Recover Writer(RVWR)后臺進程,Flashback Database Log日志和Flash Recovery Area。一旦數據庫啟用了Flashback Database, 則RVWR進程會啟動,該進程會向Flash Recovery Area中寫入Flashback Database Log, 這些日志包括的是數據塊的 " 前鏡像(before image)", 這也是Flashback Database 技術不完全恢復塊的原因。RVWR進程寫入的是閃回數據庫日志。

bf153aacb690da0f40951f999bee6657.png
$ ps -ef|grep rvw|grep -v grep
16fd9290760ca7b6761518df7d3386ae.png

03

RVWR和LGWR的區別

假設T表C1列默認值為null,并進行了如下操作

752237e0cfd6ebc7a1ec8a4627a0a278.png

閃回日志和聯機重做日志雖然作用相似 ,但他們還是有不少差異。 閃回日志不是循環使用的,聯機重做日志是循環使用的。當事務修改了buffer cache中的數據塊時,會將改變前的值和改變后的值以重做記錄的形式保存在log buffer中,然后通過LGWR將重做記錄寫入聯機重做日志中。但是在記錄閃回日志時,只會將改變前的值保存在flashback buffer中,再由RVWR寫入閃回日志中。

oracle查詢刪除記錄數據。閃回時,從閃回日志的尾部向頭部方向,依次取出閃回日志中的記錄并應用在數據庫上。而應用重做日志在進行實例恢復時,從閃回日志的頭部向尾部方向依次取出重做記錄并應用到數據庫上。

比如當前時間 09:20:00表T中C1列的值為4,當需要閃回到 09:10:00表T中C1為2的時候。從尾部應用日志開始,先取出C1=3這個值覆蓋C1=4,之后繼續取出C1=2覆蓋C1=3。發現已經滿足條件,故停止應用閃回日志。


04

與閃回數據庫相關的幾個視圖

1.v$flashback_database_log

Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少,該視圖就可以查看許多有用的信息。

Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點

oracle刪除一條數據?Fashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小

Retention_target: 目標保存的實際(分鐘)

Estimated_flashback_size: 根據策略對需要的空間大小的估計值

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';SQL> select OLDEST_FLASHBACK_SCN os,OLDEST_FLASHBACK_TIME ot,RETENTION_TARGET rt ,FLASHBACK_SIZE fs,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_log;
cec7f1c63cac8ff6ec62891328c0924c.png

2.v$flashback_database_stat

這個視圖用來對Flashback log 空間情況進行更細粒度的記錄和估計。 這個視圖以小時為單位記錄單位時間內數據庫的活動量, Flashback_Data 代表 Flashback log 產生數量, DB_Date 代表數據改變數量, Redo_Date 代表日志數量,通過這 3 個數量可以反映出數據的活動特點,更準確的預計 Flash Recovery Area 的空間需求

SQL> select BEGIN_TIME bt,END_TIME et,FLASHBACK_DATA fd,DB_DATA dd,REDO_DATA rd,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_stat; 
eee79550a42e3135464cc3b1bb7eca5a.png

3.v$flashback_database_logfile

該視圖主要記錄閃回日志的詳細信息,NAME閃回日志的位置,FIRST_CHANGE#閃回日志中記錄的最早的SCN,FIRST_TIME閃回日志中記錄的最早時間

SQL> select * from v$flashback_database_logfile;
e1df310263ee2629e3328b5eb64e5a2c.png

05

啟用數據庫閃回模式

oracle查看sql執行記錄、如果想啟動FLASHBACK DATABASE的功能,您必須在MOUNT模式下,將數據庫通過如下命令至于歸檔模式

SQL> alter database archivelog;Database altered.

開啟閃回模式

SQL> alter database flashback on;Database altered. 

關閉閃回執行可通過如下命令

SQL> alter database flashback off;Database altered.

確認閃回是否開啟

select name,current_scn,flashback_On from v$database;
a1fbc85139865b50f86ba75f93287fe9.png

06

與閃回數據庫相關的幾個參數

1. DB_RECOVERY_FILE_DEST_SIZE和 DB_RECOVERY_FILE_DEST

數據庫中怎么刪除數據,要想使用Flashback Database, 必須使用Flash Recovery Area,因為Flashback Database Log只能保存在這里。 要配置的2個參數如下,一個是大小,一個是位置。如果數據庫是RAC,flash recovery area 必須位于共享存儲中。數據庫必須處于archivelog 模式.

啟用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH; SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/XXX' SCOPE=BOTH; 

禁用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ; 

對于Flash Recovery Area,Oracle 是這樣建議的,flash recovery area 設置的越大,flashback database 的恢復能力就越強,因此建議flash recovery area 能夠放的下所有的數據文件,增量備份,以及所有尚未備份的歸檔文件,當然還有它自己產生的flashback logs。

在數據庫運行過程中,oracle 自動向該區域寫入文件,當剩余空間不足15%的時候,它就會在alert 中增加警告,提示你空間不足。但此時不會影響數據庫的正常運轉,直到所有空間統統被用掉之后,oracle 首先嘗試刪除尋些過期的文件,冗余文件或備份過的文件以及閃回日志,如果這些做完了,還是沒有空閑空間的話,數據庫就被hang住了。

數據庫里的數據刪除怎么恢復?2. DB_FLASHBACK_RETENTION_TARGET:

該參數用來控制flashback log 數據保留的時間,或者說,你希望flashback database 能夠恢復的最早的時間點。默認值是1440,單位是minute,即24 小時,需要注意的是該參數雖然未直接指定flash recovery area大小,但卻受其制約,舉個例子假如數據庫每天有10%左右的數據變動的話,如果該初始化參數值設置為1440,則flash recovery area 的大小至少要是當前數據庫實際容量的10%,如果該初始化參數設置為2880,則flash recovery area 的大小就至少是數據庫所占容量的20%。

SQL>alter system set db_flashback_retention_target=1440 scope=both; 
0d680b0f2f391dbabda20e254b705740.png

07

閃回數據庫需要注意的幾點

1.一旦關閉閃回數據庫,flashback recovery area中的閃回日志將自動全部刪除

2.即便以resetlogs打開數據庫,當前閃回日志里的內容仍然保留,仍然可以繼續進行閃回以restlogs方式打開數據庫。之所以考慮以read only放是打開數據庫,主要是因為以resetlog方式打開數據庫后,用戶即可操作數據庫,無法校驗閃回的準確性。另外,當閃回數據庫與DATA GUARD結合后,當主庫發生邏輯損壞,我們可以閃回備庫,然后以read only方式打開備庫,將數據從備庫中導出后導入到主庫中,這樣將對數據和業務的影響減小到最小。

3.如果閃回數據庫的時間點之間進行了控制文件的恢復或重建,數據文件的收縮,或刪除了某個表空間,則閃回將失敗。

oracle 查找重復數據、4.閃回日志在出現空間壓力的情況下,oracle會自動刪除閃回日志,則有可能導致無法閃回到指定的時間點。如果希望閃回到指定的時間點,可進行如下操作

SQL> create restore point must_to_flashback guarantee flashback database;

這樣我們就給當前時間點取 must_to_flashback這個名字,確保能閃回到該時間點上

5.閃回刪除 只能用于非系統表空間和本地管理的表空間

6. 對象的參考約束、索引不會被恢復,指向該對象的外鍵約束需要重建。

7. 對象能否恢復成功,取決與對象空間是否被覆蓋重用。

oracle查找相同數據?8. 當刪除表時,信賴于該表的物化視圖也會同時刪除,但是由于物化視圖并不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化視圖,需要dba 手工介入重新創建。

9. 對于Recycle Bin中的對象,只支持查詢.


當你開啟flashback_on后Oracle會自動在FRA目錄增加一個flash_recover_area的目錄,用來寫閃回日志,切記不能直接rm -rf刪除,只能通過關閉flashback_on來手動清理。后面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~

c8f6caba1c6be2535f12a4ac4de4fbb3.gif

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/194641.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息