oracle數據庫表恢復到特定時間點


  某一張表被應用軟件里誤操作把數據都清空了,現在想恢復到清空之間,比如2013年8月13日14點以前,應該怎樣操作?

  通過這個問題可以引發一系列的知識點串聯。

  1、如果開啟閃回可以使用閃回表。

  

怎樣查看我的數據庫有沒有開啟flashback

  flashback database要求數據庫必須處於歸檔模式,且閃回之后必須使用resetlogs打開數據庫
  查看數據庫的歸檔模式及閃回是否啟用
  SQL> select log_mode,open_mode,flashback_on from v$database;

  LOG_MODE   OPEN_MODE    FLASHBACK_ON
  -------------------    -----------------     ------------------------
  ARCHIVELOG      READ WRITE       NO         

  

  FLASHBACK_ON為NO,則表示閃回特性尚未啟用

 

 

oracle數據庫歸檔模式

Oracle數據庫有聯機重做日志,這個日志是記錄對數據庫所做的修改,比如插入,刪除,更新數據等,對這些操作都會記錄在聯機重做日志里。

模式介紹

Oracle數據庫有聯機重做日志,這個日志是記錄對數據庫所做的修改,比如插入,刪除,更新數據等,對這些操作都會記錄在聯機重做日志里。一般數據庫至少要有2個聯機 重做日志組。當一個聯機重做日志組被寫滿的時候,就會發生日志切換,這時聯機重做日志組2成為當前使用的日志,當聯機重做日志組2寫滿的時候,又會發生日志切換,去寫聯機重做日志組1,就這樣反復進行。
如果數據庫處於非歸檔模式,聯機日志在切換時就會丟棄. 而在歸檔模式下,當發生日志切換的時候,被切換的日志會進行歸檔。比如,當前在使用聯機重做日志1,當1寫滿的時候,發生日志切換,開始寫聯機重做日志2,這時聯機重做日志1的內容會被拷貝到另外一個指定的目錄下。這個目錄叫做歸檔目錄,拷貝的文件叫歸檔重做日志。
數據庫使用歸檔方式運行時才可以進行災難性恢復。
1. 歸檔日志模式和 非歸檔日志模式的區別
非歸檔模式只能做 冷備份,並且恢復時只能做 完全備份.最近一次完全備份到系統出錯期間的數據不能恢復.
歸檔模式可以做 熱備份,並且可以做 增量備份,可以做部分恢復.
用ARCHIVE LOG LIST 可以查看當前模式狀態是歸檔模式還是非歸檔模式.

如何查看oracle當前處於歸檔模式還是非歸檔模式

1、

selectname,log_mode,open_mode from v$database;

NAME   LOG_MODE   OPEN_MODE
---------   ------------     -----------------
CKDB   ARCHIVELOG  READ WRITE

若是歸檔模式,則LOG_MODE=ARCHIVELOG
若是非歸檔模式,則LOG_MODE=NOARCHIVELOG

 

2、

輸入:archive log list 回車,可以查看是否是歸檔模式

SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 31
Current log sequence 33

oracle數據庫如何打開歸檔

oracle數據庫如果不開啟歸檔模式,對於誤操作來說將是災難性的,無法進行恢復操作。下面介紹oracle如何核實是否開啟歸檔模式和如何開啟歸檔模式的方法。

  1. 開啟歸檔模式

    1>首先打開cmd命令窗口輸入:sqlplus / as sysdba登錄數據庫

    2>成功登錄數據庫后,輸入命令:select log_mode from v$database用來查看歸檔模式

    3>查詢后可以看到log_ mode是noarchivelog說明歸檔模式是不歸檔模式

    4>用shutdown immediate或shutdown normal關閉數據庫

    5>等待數據庫正常關閉

    6>數據庫關閉后,用startup mount啟動數據庫、加載實例但數據庫關閉

    7>使用命令:alter database archivelog;打開歸檔日志,執行命令成功后返回數據庫已更改的消息

    8>使用命令:alter database open;打開數據庫即可完成整體操作

    9>alter system archive log start; (啟用自動歸檔)

    10>exit (退出)

    11>驗證歸檔日志。重復第一步驟,執行命令:select log_mode v$database,看到執行結果為archivelog

  做一次完全備份,因為非歸檔日志模式下產生的備份日志對於歸檔模式已經不可用了.這一步非非常重要!

  2.改變歸檔模式到非歸檔模式:

    1)SQL>SHUTDOWN NORMAL/IMMEDIATE;
    2)SQL>STARTUP MOUNT;
    3)SQL>ALTER DATABASE NOARCHIVELOG;
    4)SQL>ALTER DATABASE OPEN;
  3.啟用自動歸檔: LOG_ARCHIVE_START=TRUE
    歸檔模式下,日志文件組不允許被覆蓋(重寫),當日志文件寫滿之后,如果沒有進行手動歸檔,那么系統將掛起,直到歸檔完成為止.
    這時只能讀而不能寫.
    運行過程中關閉和重啟歸檔日志進程
    SQL>ARCHIVE LOG STOP
    SQL>ARCHIVE LOG START
  4.手動歸檔: LOG_ARCHIVE_START=FALSE
    歸檔當前日志文件
    SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
    歸檔序號為052的日志文件
    SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE 052;
    歸檔所有日志文件
    SQL>ALTER SYSTEM ARCHIVE LOG ALL;
    改變歸檔日志目標
    SQL>ALTER SYSTEM ARCHIVE LOG CURRENT TO '&PATH';
  5.歸檔模式和非歸檔模式的轉換
    第4步的逆過程.
  6.配置多個歸檔進程
    Q:什么時候需要使用多個歸檔進程?
    A:如果歸檔過程會消耗大量的時間,那么可以啟動多個歸檔進程,這是個動態參數,可以用ALTER SYSTEM動態修改.
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=10;
    Oracle9i中最多可以指定10個歸檔進程
    與歸檔進程有關的動態性能視圖
    v$bgprocess,v$archive_processes
  7.配置歸檔目標,多歸檔目標,遠程歸檔目標,歸檔日志格式
    歸檔目標 LOG_ARCHIVE_DEST_n
    本地歸檔目標:
    SQL>LOG_ARCHIVE_DEST_1 = "LOCATION=D:ORACLEARCHIVEDLOG";
    遠程歸檔目標:
    SQL>LOG_ARCHIVE_DEST_2 = "SERVICE=STANDBY_DB1";
    強制的歸檔目標,如果出錯,600秒后重試:
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_4 = "LOCATION=E:ORACLEARCHIVEDLOG MANDATORY REOPEN=600";
    可選的歸檔目標,如果出錯,放棄歸檔:
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_3 = "LOCATION=E:ORACLEARCHIVEDLOG OPTIONAL";
    歸檔目標狀態:關閉歸檔目標和打開歸檔目標
    關閉歸檔目標1
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = DEFER
    打開歸檔目標2
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = ENABLE
    歸檔日志格式
    LOG_ARCHIVE_FORMAT
  8.獲取歸檔日志信息
    V$ARCHIVED_LOG
    V$ARCHIVE_DEST
    V$LOG_HISTORY
    V$DATABASE
    V$ARCHIVE_PROCESSES
    ARCHIVE LOG LIST;

查看oracle是否開啟閃回,查看刪除記錄

  

  查看oracle是否開啟閃回功能,
  --FLASHBACK_ON為NO,則表示閃回特性尚未啟用

   select log_mode,open_mode,flashback_on from v$database;


  查看oracle刪除記錄

   select * from user_recyclebin;

  

 

 

 經過上述一段艱難的過程,下面來操作閃回:

  (一)

  如果開啟閃回可以使用閃回表。
  select log_mode,flashback_on from v$database;
  如果是下面結果則開了閃回
  LOG_MODE   FLASHBACK_ON
  ------------     ------------------
  ARCHIVELOG   YES


  可以執行以下命令
  alter table 表名 enable row movement; --開啟表行移動
  flashback table 表名 to timestamp to_timestamp('20130813 14:00:00','yyyymmdd hh24:mi:ss');
  --閃回到2013年8月13日14點


  你要是沒開啟,有邏輯備份可以使用imp命令導入數據。
  如果沒用邏輯備份,開啟歸檔模式,有物理備份,能夠停機、數據丟失的話,可以采用不完全恢復
  用rman登陸
  rman target /
  執行以下命令
  run{shutdown immediate;
  startup mount;
  set until time = "to_date('20130813 14:00:00','yyyymmdd hh24:mi:ss')";
  restore database;
  recover database;
  alter database open resetlogs;}
  切記!做以上任何操作前做好備份,否則出了問題后悔莫及。
  而且建議你聯系你們數據庫管理員處理這個問題。

 

  (二)

  

如果只是1個表的話, 還是比較簡單的。

 

下面是一個例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SQL>  CREATE  TABLE  test_fb_table (
   2    ID    int ,
   3    VAL  VARCHAR2(10)
   4  );
Table  created.
SQL>  INSERT  INTO  test_fb_table   VALUES  (1,  'TEST' );
1 row created.
SQL>  commit ;
Commit  complete.
 
假如 數據被錯誤的刪除/更新
需要檢索某個時間點上,表原有的數據。
SQL>  SELECT  TO_CHAR(sysdate,  'yyyy-mm-dd hh24:mi:ss' FROM  dual;
TO_CHAR(SYSDATE, 'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2010-11-07 13:01:37
 
這里刪除掉數據。
SQL>  delete  from  test_fb_table;
1 row deleted.
SQL>  commit ;
Commit  complete.
 
確認數據已經被刪除。
SQL>  select  from  test_fb_table;
no  rows  selected

 

1
2
3
4
5
6
7
這里檢索出,指定時間點上,指定表的數據情況。
SQL>  select  from  test_fb_table
   2     AS  OF  TIMESTAMP  TO_TIMESTAMP( '2010-11-07 13:01:37' ,
   3       'yyyy-mm-dd hh24:mi:ss' );
         ID VAL
---------- --------------------
          1 TEST

 

 

 

對於你來說, 也就是你需要先

 

CREATE TABLE  臨時表  AS

select * from   你的那個數據被刪除的表   

AS OF TIMESTAMP TO_TIMESTAMP('2013-08-13 14:00:00',  'yyyy-mm-dd hh24:mi:ss');

 

 

這樣, 就把當初那個時間點上的,  那個表的數據,  復制到一個   臨時表  里面去了。

然后再

INSERT  INTO  你的那個數據被刪除的表    SELECT  *  FROM  臨時表;

 

 

注: 你需要確定一下, 那個  數據被刪除的表  上面, 有沒有觸發器什么的。

有的話, 可能需要暫時 禁用掉, 數據插入完了再恢復。

  (三)(沒有dba權限)

  如果有數據庫備份和日志備份,才能解決你的問題,將數據恢復到某個時間點。

否則無法實現。

如果有備份,可以讓DBA幫忙恢復一個新數據庫,然后你將此表的數據copy出來到原先的數據庫中。

  (四)(沒有dba權限)

需要用閃回表flashback table,你是做不了的,找dba吧

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM