ORACLE—閃回

閃回技術:使用與用戶的DDL操做,並且沒有發生結構變化
依賴undo表空間,因此將undo表空間設爲自動增加,並且設置爲auto自動管理
閃回不適用的狀況:
1>
2>
3>

1.flashback database 100m--shrink
閃回功能
閃回日誌
閃迴路徑,大小

alter database flashback on; //打開閃回功能 ,閃回功能會產生閃回日誌,保證閃回日誌的保存,影響數據庫性能,佔用數據庫7%-10
alter database flashback off ;//關閉閃回功能
select flashback_on from v$database ;//查詢閃回功能是否打開
在數據庫mount狀態下打開閃回功能

歸檔打開後:rvwr---recover write ---- //rvwr進程將歸檔緩衝區中的全部內容寫到歸檔日誌中
show parameter flashback_ // 決定了閃回日誌保存的時間,默認是1440分鐘(一天)sql

SQL> show parameter flashback_

NAME      TYPE  VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target      integer  1440
SQL>


閃回技術必須在mount狀態下執行
flashback database to scn <>;
flashbach database to timestamp<>; //將數據庫閃回到某個時間

alter database open read only; //閃回scn號之後的操做,咱們還能夠經過一次次閃回回去
alter database open resetlogs ; //閃回scn號之後的操做都丟失

2.flashback drop //只針對drop功能
drop table<> ;// 保證回收站功能打開
show recyclebin ;//查看回收站
select object_name,type from user_recyclebin;
flashback table <> to before drop ;//主鍵

3.flashback query----undo---dml //針對dml操做
1> flashbazk query :閃回查詢
update emp set sal=sal+1 where empno=7788;
select * from <> as of scn|timestamp <>;
 數據庫

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    2274480
SQL> update scott.emp set sal=sal+50 where empno=7788;

1 row updated.

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    2274546

SQL> select sal  from scott.emp  as of scn 2274480 where empno=7788;

       SAL
----------
       202
SQL> select sal  from scott.emp   where empno=7788;

       SAL
----------
       252


2> flashback verisons query:閃回版本查詢,前面所作的無論全部操做,最後用一個commit操做,那麼commit以前的全部操做都是一個版本,每一個版本中的每個操做咱們稱之爲一個事務oracle

   select * from <>versions between scn minvalue and maxvalue;  //經過SCN號找到版本信息
   select * from <> versions between timestamp minvalue and maxvalue; //經過時間戳來找版本信息
   verdions_startscn :表示事務開始的scn號
   versions_starttime:表示作這個事務開始的時間
   versions_endscn:   表示事務結束的scn號
   versions_endtime:表示事務結束的時間
   versions_operation:(i,u,d):表示對應相應的操做insert,update,delete
   verdions_xid:每一個事務的id號
   v$flashback_transaction_query    //閃回事務查詢
select



3> flashback table: 閃回表
update,delete------忘了加where子句 //對整個表都作了誤操做,咱們使用閃表技術,將咱們的類從新插回表中
alter table <> enable row movement; //打開行移動
flashback table <> to scn <> |timestamp<>;
alter table <> disable row movement;


 ide

>>>show parameter undo_


SQL> show parameter undo_

NAME      TYPE  VALUE
------------------------------------ ----------- ------------------------------
undo_management       string  AUTO        //undo表空間必須爲auto
undo_retention      integer  900    //表示存放的時間
undo_tablespace       string  UNDOTBS2



1.閃回數據庫
a.建立一個用戶---建立對象----插入數據
drop user
b.emp---sal+100---commit;性能

SQL> create tablespace test datafile '/opt/u01/oracle/oradata/maxdb/test01.dbf' size 20m;

Tablespace created.
SQL> create user test1 identified by oracle default tablespace test;


User created.
SQL> grant connect ,resource to test1;
SQL> create table test1.test1 as select * from scott.emp;
SQL> create table test1.test2 as select * from scott.AA;


SQL> select current_scn from v$database; //查找到當前的scn號

CURRENT_SCN
-----------
    2183527
    

SQL> drop user test1 cascade;

SQL> update scott.emp set sal=sal+10;

SQL> update scott.emp set sal=sal+100;

SQL> select * from scott.emp as of scn 2183527 where deptno=10;//咱們能夠經過scn號的查找到未作操做時候的狀態

     EMPNO ENAME      JOB        MGR HIREDATE     SAL       COMM
---------- ---------- --------- ---------- --------- ---------- ----------
    DEPTNO DENAME   LOC
---------- -------------- -------------
      7782 CLARK      MANAGER       7839 09-JUN-81     202
10 ACCOUNTING   NEW YORK

      7839 KING       PRESIDENT     17-NOV-81     202
10 ACCOUNTING   NEW YORK

      7934 MILLER     CLERK       7782 23-JAN-82     202
10 ACCOUNTING   NEW YORK


SQL> select * from scott.emp where deptno=10;  //當前狀態表的狀況

     EMPNO ENAME      JOB        MGR HIREDATE     SAL       COMM
---------- ---------- --------- ---------- --------- ---------- ----------
    DEPTNO DENAME   LOC
---------- -------------- -------------
      7782 CLARK      MANAGER       7839 09-JUN-81     312
10 ACCOUNTING   NEW YORK

      7839 KING       PRESIDENT     17-NOV-81     312
10 ACCOUNTING   NEW YORK

      7934 MILLER     CLERK       7782 23-JAN-82     312
10 ACCOUNTING   NEW YORK

SQL> startup mount;
SQL> flashback database to scn 2183527;
SQL> alter database open read only;
SQL> conn test1/oracle
Connected.
SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
TEST1
TEST2

[oracle@up12 ~]$ exp \'/ as sysdba\' file=/tmp/testuser1.dmp owner=test1 grant=n log=/tmp/test1.log   //導出用戶
再用當前的SCN閃回到當前的狀態

在打開的數據庫中從新將user test1建回去,再導入剛纔導出的用戶
[oracle@up12 ~]$ imp \'/ as sysdba\' file=/tmp/testuser1.dmp fromuser=test1 touser=test1


 




2.使用閃回查詢
更新dept表中dname---
insert -- dept ---deptno=11,12,13,14
update----emp----sal+1,sal+2,sal+3
commit;
撤銷insert ,撤銷10部門的update

 spa

SQL> insert into scott.dept(deptno) values(11);

1 row created.

SQL> update scott.emp set sal=sal+1 where deptno=10;

3 rows updated.

SQL> update scott.emp set sal=sal+2 where deptno=20;

4 rows updated.

SQL> update scott.emp set sal=sal+3 where deptno=30;

6 rows updated.


SQL>commit 

SQL> select versions_xid ,versions_operation,versions_startscn from scott.dept versions between scn minvalue and maxvalue;  //查看閃回版本

VERSIONS_XID	 V VERSIONS_STARTSCN
---------------- - -----------------
0D0001009E000000 I	     2333545
0D0001009E000000 I	     2333545
0D0001009E000000 I	     2333545

SQL> select undo_sql from flashback_transaction_query where xid='0D0001009E000000';   //經過事務版本,找到咱們的每個操做,想要撤回哪條命令,就直接將undo_sql裏的命令執行就能夠了

UNDO_SQL
--------------------------------------------------------------------------------
update "SCOTT"."EMP" set "SAL" = '203' where ROWID ='AAAS0SAAEAAAAILAAM';
update "SCOTT"."EMP" set "SAL" = '205' where ROWID ='AAAS0SAAEAAAAILAAL';
update "SCOTT"."EMP" set "SAL" = '204' where ROWID ='AAAS0SAAEAAAAILAAK';
update "SCOTT"."EMP" set "SAL" = '205' where ROWID = 'AAAS0SAAEAAAAILAAJ';
update "SCOTT"."EMP" set "SAL" = '203' where ROWID = 'AAAS0SAAEAAAAILAAI';
update "SCOTT"."EMP" set "SAL" = '254' where ROWID ='AAAS0SAAEAAAAILAAH';
相關文章
相關標籤/搜索