資料庫flashback

victorymoshui發表於2011-05-03

[oracle@rhel5 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Nov 30 22:56:46 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL>

檢視資料庫能閃回到的最早的scn,如果資料庫沒有開閃回功能是沒有記錄返回的。
SQL> select oldest_flashback_scn from v$flashback_database_log;

no rows selected

檢視資料庫是否開閃回
SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO

資料庫open狀態嘗試開啟資料庫的閃回功能,返回報錯資訊說明需要在mount狀態下來操作。
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38759: Database must be mounted by only one instance and not open.

關閉資料庫
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

開啟資料庫到mount狀態
SQL> startup mount
ORACLE instance started.

Total System Global Area 184549376 bytes
Fixed Size 1218412 bytes
Variable Size 83888276 bytes
Database Buffers 96468992 bytes
Redo Buffers 2973696 bytes
Database mounted.

資料庫在mount狀態下再次嘗試開啟資料庫的閃回功能,又返回錯誤資訊說明資料庫在非歸檔狀態下不支援資料庫的閃回。
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38707: Media recovery is not enabled.

開歸檔
SQL> alter database archivelog;

Database altered.

開閃回成功
SQL> alter database flashback on;

Database altered.

開啟資料庫
SQL> alter database open;

Database altered.

開啟歸檔,預設的歸檔目錄:USE_DB_RECOVERY_FILE_DEST ,與9i不同10g開啟歸檔很要簡單一些。以後可以自行修改歸檔目錄的位置,在此暫時保留預設。
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 59
Next log sequence to archive 61
Current log sequence 61

檢驗資料庫閃回是否開啟
SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

檢視閃回區資訊,預設安裝大小為2G,根據資料庫的具體情況作修改。
SQL> show parameter recover

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 20G
recovery_parallelism integer 0


資料庫可以恢復到多少分鐘以前,預設1440分鐘(一天)
SQL> show parameter flash

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440


檢視資料庫能恢復到最早的scn,和最早的時間
SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME
-------------------- ---------------------
1021372 20101130 23:07:18

===================oralce flashback 使用方法總結 ===================
 
oralce flashback 使用方法總結:
 
一,關鍵知識點
在oracle 10g中,如果是使用drop 把表物件刪除了,會把這個物件放在回收站裡
檢視回收站:select * from recyclebin;
然後恢復物件:flashback table TABLENAME to before drop;
刪除不放回回收站:drop table TABLENAME purge;
 
如果不小心誤刪除了某個表中的部分資料,需要恢復回來,可以利用oracle flashback閃回誤刪除的表數
據。但要注意:flashback table 需要下面幾個條件:
1. 需要有flashback any table的系統許可權或者是flashback這個表的物件許可權;
2. 需要有對這個表的基本的dml,alter操作許可權;
3. 必須保證該表row movement(這主要是讓flashback記住表的rowid)
擴充套件:oracle flashback閃回不僅可以誤刪除的表資料,還可以錯誤的修改也可以恢復過來;
注意:
ORA-08189: cannot flashback the table because row movement is not enabled
但是丟擲了8189錯誤,原因就是因為表沒有row movement,改變下表的屬性:
SQL> alter table test_tablename enable row movement;
再執行閃回操作;

二,例項
 
1.建立示例表:
CREATE TABLE TBL_TEST
(
ID    NUMBER,
NAME VARCHAR2(100 BYTE),
PID   NUMBER                                  DEFAULT 0
);

2.插入測試資料:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
 
3.恢復誤刪除的表資料
例如:
FlashBack table TBL_TEST to timestamp to_timestamp('2009-8-1 16:59:36','yyyy-mm-dd
hh24:mi:ss');
報錯:ORA-08189: cannot flashback the table because row movement is not enabled
錯誤解決,要執行:alter table TBL_TEST enable row movement;
FlashBack table TBL_TEST to timestamp to_timestamp('2009-8-1 16:59:36','yyyy-mm-dd
hh24:mi:ss');
 
4.恢復誤表資料錯誤的修改:
例如:
update TBL_TEST set pid=1 where id =5;
FlashBack table TBL_TEST to timestamp to_timestamp('2009-8-1 16:59:36','yyyy-mm-dd
hh24:mi:ss');
 
5.恢復被刪除表的步驟:
(1)顯示回收站資訊
select * from RECYCLEBIN;
(2)確定被刪除表存在後,可以恢復誒刪除表,此時可以指定表明或者回收站物件名
  flashback table TBL_TEST to before drop;
  或 flashback table "BIN$zgwx7wCsQ92JRcrAVpABQg==$0" to before drop
  
6.恢復被刪除表的同時可以改變被刪除表的名稱
flashback table TBL_TEST to before drop rename to test_TBL_TEST
或 flashback table "BIN$zgwx7wCsQ92JRcrAVpABQg==$0" to before drop rename to test_TBL_TEST
 
7.刪除不放回回收站:
drop table TBL_TEST purge;
 
目前只在pl/sql developer 上,實際操作了上面幾點,也是常用的知識點。可能還有其他的處理方法,如Flashback Database to time to_timestamp(xxx),這些有待繼續研究。
 

本文出自 “在路上” 部落格,請務必保留此出處http://yuwenhu.blog.**.com/672091/186601

 

 

 

================================flash back 閃回測試================================

 

--1. 開啟資料庫閃回功能
SQL> shutdown immediate
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             146803588 bytes
Database Buffers          457179136 bytes
Redo Buffers                7135232 bytes
資料庫裝載完畢。
SQL>alter database archivelog;
資料庫已更改。
SQL>alter database flashback on ;
資料庫已更改。
SQL> alter database open;
資料庫已更改。
 
--2. 檢視閃回模式下相關引數
 
SQL> archive log list
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列     773
下一個存檔日誌序列   775
當前日誌序列           775
SQL> show parameter db_recover
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      C:\oracle\product\10.2.0/flash_recovery_area
db_recovery_file_dest_size           big integer 2G
--閃回相關備份檔案及檔案大小
 
 
SQL> show parameter flashback
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440
--預設支援閃回的時間,單位為分。
 
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
 
--開啟閃回功能後,啟動RVWR(recover writer)程式。
SQL> col program format a18
SQL> col pid format 99
SQL> select program,pid,spid,background,pga_used_mem,pga_alloc_mem,pga_freeable_mem,pga_max_mem
  2  from v$process where program like '%RVWR%';
 
PROGRAM            PID SPID         B PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
------------------ --- ------------ - ------------ ------------- ---------------- -----------
ORACLE.EXE (RVWR)   16 2924         1       206881        623853                0      623853
 
SQL> select * from v$sgastat where name like '%flashback%';
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  flashback generation buff     3981204      
 
SQL> select * from v$sysstat where name like '%flashback log%';
STATISTIC# NAME                                                                  CLASS      VALUE    STAT_ID
---------- ---------------------------------------------------------------- ---------- ---------- ----------
       168 flashback log writes                                                      2         11 3123176560       
      
--3. 閃回資料庫測試
SQL> create table yangxl as select * from dba_objects;
表已建立。
 
SQL> select count(1) from yangxl;
  COUNT(1)
----------
     52511
 
SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
會話已更改。
 
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-06-04 11:06:12
  
SQL> truncate table yangxl;
表被截斷。
SQL> select * from yangxl;
 
未選定行 
 
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
 
SQL> startup mount;
ORACLE 例程已經啟動。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             150997892 bytes
Database Buffers          452984832 bytes
Redo Buffers                7135232 bytes
資料庫裝載完畢。
 
SQL> flashback database to timestamp to_timestamp('2009-06-04 11:06:12','yyyy-mm-dd hh24:mi:ss');
閃回完成。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項
 
SQL> alter database open resetlogs;
資料庫已更改。
 
SQL> select count(*) from yangxl;
  COUNT(*)
----------
     52511
 

--4. 閃回表測試

SQL> select object_name,original_name,type from user_recyclebin;
未選定行
 
SQL> drop table yangxl;
表已刪除。
 
SQL> select object_name,original_name,type from user_recyclebin where original_name = 'YANGXL';
 
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$93EgIpKgQb2UYDLGbvb7tQ==$0 YANGXL                           TABLE
BIN$9Bl7UGOgT36SmT9+7g7ijQ==$0 YANGXL                           TABLE
BIN$QlDzOZx8TWmM+YuaXYWIrA==$0 YANGXL                           TABLE
BIN$gr27sKM4T5imRUIE4Lu1eQ==$0 YANGXL                           TABLE
BIN$wSaMD+dxQxqEqR1RG/bJKA==$0 YANGXL                           TABLE
 
SQL> flashback table yangxl to before drop;
閃回完成。
 
SQL> select count(1) from yangxl;
  COUNT(1)
----------
         9
 
--5. 閃回表資料測試

--閃回表都可以,閃回資料肯定是沒有問題的了。
SQL> select count(1) from yangxl;
  COUNT(1)
----------
         9
SQL> delete from yangxl where rownum = 1;
已刪除 1 行。
 
SQL> commit;
提交完成。
 
SQL> flashback table yangxl to timestamp to_timestamp('2009-06-04 13:07:01','yyyy-mm-dd hh24:mi:ss');
flashback table yangxl to timestamp to_timestamp('2009-06-04 13:07:01','yyyy-mm-dd hh24:mi:ss')              *
第 1 行出現錯誤:
ORA-08189: 因為未啟用行移動功能, 不能閃回表
 
SQL> alter table yangxl enable row movement;
表已更改。
 
SQL> flashback table yangxl to timestamp to_timestamp('2009-06-04 13:07:01','yyyy-mm-dd hh24:mi:ss');
閃回完成。
 
SQL> select count(1) from yangxl;
  COUNT(1)
----------
         9
        
--6. 回收站

SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on       
 
SQL> alter system set recyclebin = off;
系統已更改。
 
SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      OFF
 
SQL> alter system set recyclebin = on;
系統已更改。
 
--清空回收站
purge user_recyclebin;
SQL> purge user_recyclebin;
回收站已清空。
 
SQL> select * from user_recyclebin;
未選定行
 
purge dba_recyclebin;
SQL> purge dba_recyclebin;
DBA 回收站已清空。

--清空本使用者回收站和所有使用者回收站(需SYS許可權)
purge table ;
SQL> purge table yangxl;
表已清除。
 
purge index ;
SQL> purge index ind_yxl;
索引已清除。
 
從回收站清除表和索引
注:如果清除的物件在回收站中有同名的,那麼會清除在回收站中時間更久的那個物件
 
purge tablespace ;
 
清除回收站中指定表空間的所有物件
 
drop table purge;
 
直接徹底刪除,不會放入回收站
 
--7. SYS 與閃回

1. 使用者 SYS、SYSTEM 不支援閃回
2. 說明預設SYSTEM表空間刪除物件不放入回收站

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9390331/viewspace-694380/,如需轉載,請註明出處,否則將追究法律責任。

相關文章