閃回技術:使用與用戶的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';