ORACLE閃回機制分析與研究應用

来源:https://www.cnblogs.com/DataArt/archive/2018/10/29/9873070.html
-Advertisement-
Play Games

1.查看資料庫歸檔和閃回狀態,及環境準備SQL> archive log list;SQL> select flashback_on from v$database;關閉資料庫,啟動歸檔和閃回SQL> shutdown immediate;啟動到mount模式SQL> startup mount;開 ...


1.查看資料庫歸檔和閃回狀態,及環境準備
SQL> archive log list;
SQL> select flashback_on from v$database;
關閉資料庫,啟動歸檔和閃回
SQL> shutdown immediate;
啟動到mount模式
SQL> startup mount;
開啟歸檔
SQL> alter database archivelog;
如果歸檔沒有打開,打開歸檔[因為flashback依賴Media recovery,所以在打開flashback之前必須先啟用歸檔]
SQL> alter database flashback on;
SQL> alter database open;
SQL> archive log start;
SQL> archive log list;
啟用閃回資料庫
要想使用Flashback Database, 必須使用Flash Recovery Area。 要配置的2個參數如下,一個是大小,一個是位置。如果資料庫是RAC,flash recovery area 必須位於共用存儲中。資料庫必須處於archivelog 模式.參數db_flashback_retention_target控制閃回日誌的保留時間,預設是1440,即24小時。

SQL>alter system set db_flashback_retention_target=2880;設置歸檔時間:(預設的是一天1440分鐘)
SQL> show parameter db_flashback_retention_target;(查詢歸檔時間)
設置撤銷表信息:
alter system set undo_managerment=auto;設置為auto才可以使用閃回查詢
alter system set undo_retention=900 SCOPE=BOTH;最長保留時間(單位秒)
alter system set undo_tablespace=undotbs1;

SQL> show parameter undo;(查詢undo撤銷時間)

關於Oracle閃回的打開和關閉,主要就是需要註意以下幾點:
1、閃回打開的前提是資料庫歸檔必須打開
2、閃回打開/關閉和歸檔打開/關閉一樣,都是在mount模式下
3、如果要在打開閃回的資料庫上關閉歸檔則必須先關閉依賴於歸檔的閃回功能

關於V$flashback_database_log
Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少, 該視圖就可以查看許多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點
Flashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小
Retention_target: 可以恢復的時間長度
Estimated_flashback_size: 根據恢復時間長度對需要的空間大小的估計值

SQL> select Oldest_flashback_time,Oldest_flashback_scn,Flashback_size,Retention_target,Estimated_flashback_size from V$flashback_database_log;

 

關於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;


v$flashback_database_logfile
該視圖主要記錄閃回日誌的詳細信息,NAME閃回日誌的位置,FIRST_CHANGE#閃回日誌中記錄的最早的SCN,FIRST_TIME閃回日誌中記錄的最早時間
SQL> select * from v$flashback_database_logfile;


2.Flashback Query閃回時間點查詢
閃回時間點查詢的另一種方法是首先用PL/SQL包dbms_flashback的enable_at_time或enable_at_scn存儲過程鎖定一個會話級別的閃回時間目標,即進入閃回模式,隨後的查詢命令就可以省略“as of”,但也能達到使用“as of”的閃回效果,直到調用dbms_flashback. disable存儲過程關閉閃回模式為止。
比如,將閃回模式會話定格在15分鐘前:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);

現在,雖然沒有“as of”子句,以下查詢命令的含義就是查看15分鐘前的hr.employees表:
需要註意此時若訪問SYSDATE、SYSTIMESTAMP等日期函數,它們的返回值還是正常的當前的值,而不是靜止在15分鐘以前。另外,處於閃回會話模式時,執行dml和ddl將報錯:
還有,SYS用戶不能調用enable_at_time和enable_at_scn


在回到過去對所有感興趣的表查詢一番後,再調用disable存儲過程關閉閃回會話模式回到正常狀態:
SQL> exec dbms_flashback.disable

Flashback Version Query(閃回版本查詢)
閃回版本查詢可以貫穿一定長度的時間視窗,通過只使用一條查尋命令就能返回該時間視窗內的不同時間點上的數據,其語法是在表名之後加“versions between”子句。


4.閃回數據歸檔(Flashback Data Archive)
閃回查詢對撤銷數據及參數undo_retention的依賴註定了它們在大事務量的情況下閃回時間視窗將會很小,想要查詢數月之前的“舊”數據絕對不可能,但在閃回數據歸檔面前這並不是不可能的。
閃回數據歸檔的工作原理
將原本只能保存在UNDO表空間的撤銷數據額外的以一種歷史表的形式保存在指定的普通表空間(permanent類型的表空間)中。並且不像undo_retention參數那樣是個影響整個資料庫的設置,閃回數據歸檔可以只為特定的表服務,這樣就可以長時間地保存感興趣的“舊”數據了。
閃回數據歸檔區
閃回數據歸檔區是閃回數據歸檔的歷史數據存儲區域,在一個系統中,可以有一個預設的閃回數據歸檔區,也可以創建其他許多的閃回數據歸檔區域。每一個閃回數據歸檔區都可以有一個唯一的名稱。同時,每一個閃回數據歸檔區都對應了一定的數據保留策略。例如可以配置歸檔區FLASHBACK_DATA_ARCHIVE_1中的數據保留期為1年,而歸檔區FLASHBACK_DATA_ARCHIVE_2的數據保留期為2天或者更短。  以後如果將表放到對應的閃回數據歸檔區,則就按照該歸檔區的保留策略來保存歷史數據。閃回數據歸檔區是一個邏輯概念,是從一個或者多個表空間中拿出一定的空間,來保存表的修改歷史,這樣就擺脫了對Undo撤銷數據的依賴,不利用undo就可以閃回到歸檔策略內的任何一個時間點上。
Flashback archive相關數據字典

* 代表DBA 或者User。

比如,在USERS表空間中創建一個能夠將“舊”數據保存1年的數據歸檔,取名為“FDA1”,操作者必須擁有“flashback archive administer”系統許可權:
SQL> create flashback archive fda1 tablespace users retention 1 year;
有了歸檔,就可以使用“flashback archive”子句在特定的表上啟用閃回數據歸檔功能了。比如,讓hr.employees使用fda1,從此該表的修改歷史將保留1年:
SQL> alter table t_dealer flashback archive fda1;

或新建一個歸檔閃回區給一個表空間或指定一個表空間
SQL>create flashback archive default fbar_1 tablespace "USERS" quota 100M
SQL>CREATE FLASHBACK ARCHIVE fbar_1 TABLESPACE "TBS_DATA1"
一個歸檔區可以不僅僅對應一個表空間,可以採用如下的命令增加或者刪除該歸檔區的表空間的個數,這樣也達到了增加或者減少該歸檔區空間的目的。
SQL>ALTER FLASHBACK ARCHIVE fbar_1 ADD TABLESPACE "TBS_DATA2" quota 20M;

也可以從歸檔區中刪除表空間。註意:這個刪除僅僅是表示從數據歸檔區刪除,並不是刪除該表空間。
4.刪除數據歸檔區fbar_2的表空間TBS_DATA2
SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2";

若執行以上命令的是個普通賬號,比如HR用戶,那麼其在執行命令前必須被授予“flashback archive”對象許可權,比如:
SQL> grant flashback archive on fda1 to hr;

使用“no flashback archive”子句可以關閉特定表上的閃回數據歸檔功能。執行該命令需要“flashback archive administer”系統許可權:
SQL> alter table t_dealer no flashback archive;
刪除整個數據歸檔區
SQL> drop flashback archive fla2;

Flashback Table
當一張表被修改後(非刪除)需要恢復指定表,需在修改表是記錄時間戳以便恢復。
SQL> select sysdate,timestamp_to_scn(sysdate) from dual; (修改數據時要記錄時間戳)
SYSDATE TIMESTAMP_TO_SCN(SYSDATE)

2017-08-16-16:17:52 196349262

使用數據歸檔前需要開啟表上的行遷移:
SQL> Alter table t_dealer enable row movement;
SQL> flashback table t_dealer to scn 196349262;
SQL> Alter table t_dealer disable row movement;(完成歸檔後關閉表上的行遷移)

若沒有記錄時間戳,這可以查詢指定時間內數據量來判斷數據是佛完整,來恢複數據。
SQL> select count(*) from T_T_THIRDPAY_ORDER_H as of timestamp to_timestamp('20170816 18:00:00','yyyy-mm-dd hh24:mi:ss');

COUNT(*)
325
使用數據歸檔前需要開啟表上的行遷移:
SQL> Alter table t_dealer enable row movement; 
開始閃回
SQL> flashback table T_T_THIRDPAY_ORDER_H to timestamp to_timestamp('2011-5-9 13:00:00','yyyy-mm-dd hh24:mi:ss');
SQL> Alter table t_dealer disable row movement;(完成歸檔後關閉表上的行遷移)

Flashback Data
若沒有記錄時間戳,則可恢復整個資料庫
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
*TO_CHAR(OLDEST_FLAS
2017-08-16 11:23:46*
這個日期為能回退的最早時間,取決於保留的Flashback database log的多少
恢複數據到指定時間點
SQL> shutdown immediate;
SQL> startup mount;
SQL> flashback database to timestamp to_timestamp('2017-08-16 16:00:46','yyyy-mm-dd hh24:mi:ss');
恢覆成功後,最好先以readonly的方式打開資料庫,以確認恢復達到預期,如果沒有達到預期,還可以再進行恢復
SQL> alter database open read only;
檢查恢復完成後打開資料庫
恢覆成功後,以resetlog方式打開資料庫:
SQL> shutdown immediate;
SQL> startup mount
SQL> alter database open resetlogs;


查哪些表已經啟用了閃回數據歸檔
SQL>select * from dba_flashback_archive_tables;
查資料庫中所有的閃回數據歸檔
SQL>select flashback_archive_name,retention_in_days from dba_flashback_archive;
查有關閃回數據歸檔所使用的表空間的信息
SQL>select flashback_archive_name,tablespace_name,quota_in_mb from dba_flashback_archive_ts;
刪除閃回歸檔數據
SQL>drop flashback archive flash1;

Flashback Drop
Flashback drop是從Oracle 10g開始才有的功能,原理是每個表空間都會有嚴格回收站的邏輯區域,當drop時,被刪除的表及其關聯對象不會被物理刪除,只是轉移到回收站中,給用戶提供一個恢復的可能。


註意事項
對system表空間無效, 只能用於非系統表空間和本地管理的表空間
資料庫的版本不能低於10g,否則很多命令無法使用
對象的參考約束不會被恢復,指向該對象的外鍵約束需要重建。
對象能否恢覆成功,取決與對象空間是否被覆蓋重用。
當刪除表時,信賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化視圖,需要dba 手工介入重新創建。
對於Recycle Bin中的對象,只支持查詢.
刪除幾張表,然後指定表恢復


Oracle11g則為flashback家族又帶來一個新的成員:flashback data archive。

初看起來,flashback data archive和flashback query沒有太大的不同,都是通過as of能夠查詢之前的數據,但是他們的實現機制是不一樣的。Flashback query是通過直接從undo中讀取信息來構造舊數據,這樣就有一個限制,就是undo中的信息不能被覆蓋。而undo段是迴圈使用的,只要事務提交,之前的undo信息就可能被覆蓋,雖然可以通過undo_retention等參數來延長undo的存活期,但這個參數會影響所有的事務,設置過大,可能導致undo tablespace快速膨脹。
Falshback data archive特性則通過將變化數據另外存儲到創建的flashback archive中,以和undo區別開來,這樣就可以通過為flashback archive單獨設置存活策略,使得可以閃回到指定時間之前的舊數據而不影響undo策略。並且可以根據需要指定哪些資料庫對象需要保存歷史變化數據,而不是將資料庫中所有對象的變化數據都保存下來,這樣可以極大的減少空間需求。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章主要講解了section header的定義,各欄位含義和可能的取值。然後介紹了系統預定義的一些section名稱。最後我們綜合運用第二章和第三章的知識,做了一個讀取section names的練習。 ...
  • Redis集群實現了較為完善的高可用方案。本文將詳細介紹集群,主要內容包括:集群的作用;集群的搭建以及設計方案;集群的基本原理;客戶端訪問集群的方法;以及其他實踐中需要的集群知識。 ...
  • 《大數據時代》是國外大數據研究的先河之作,本書作者維克托•邁爾•舍恩伯格被譽為“大數據商業應用第一人”,擁有在哈佛大學、牛津大學、耶魯大學和新加坡國立大學等多個互聯網研究重鎮任教的經歷,早在2010年就在《經濟學人》上發佈了長達14頁對大數據應用的前瞻性研究。 維克托•邁爾•舍恩伯格在書中前瞻性地指 ...
  • 下載mysql安裝程式 官方下載地址:http://dev.mysql.com/downloads/mysql/ 解壓下載文件,如圖 其中data和my.ini文件需要自己創建 my.ini 文件配置如下: 配置環境變數 電腦 屬性 高級系統屬性 環境變數 初始化data目錄 以管理員命令運行cmd ...
  • 1. 基礎知識 安裝mysql5.6資料庫Mysql binlog初步理解 2. 配置mysql 開啟binlog、修改binlog模式為Row Level模式 修改mysql配置文件,在[mysqld]下增加以下內容 3. 重啟mysql資料庫 binlog開啟 生成文件/var/lib/mysq ...
  • MySQL · 引擎特性 · InnoDB 崩潰恢復過程 innodb中的 3個lsn innodb的lsn和oracle的scn一樣,是一個重要的概念。比如 在flush list中正是是使用low lsn作為鏈表的條件參考buf_page_t中的lsn_t oldest_modification ...
  • Ref:https://www.aliyun.com/jiaocheng/1109809.html 摘要: 簡介 undrop-for-innodb 是針對 innodb 的一套數據恢復工具,可以從文件級別恢復諸如:DROP/TRUNCATE table, 刪除表中某些記錄,innodb 文件被刪除 ...
  • 原文鏈接:http://click.aliyun.com/m/42521/ 摘要: 本文主要通過一個bug來記錄一下如何分析一個MySQL bug的崩潰信息。 版本:Percona 5.7.17-11 一、資料庫重啟日誌分析 terminate called after throwing an in ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...