闪回技术:使用与用户的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';