Oracle数据库的闪回分一下几类
回收站还原删除的表、闪回版本查询、闪回查询、闪回事务处理查询、闪回事务处理
回收站
连接到SCOTT用户,查看用户下的对象
[oracle@RHEL6 ~]$ sqlplus scott/scott
SQL*Plus: Release 11.2.0.1.0 Production on Sat Jul 28 22:51:51 2018
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
SCOTT@ orcl>select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
E1 TABLE
EMP TABLE
OB1 TABLE
OB2 TABLE
OB3 TABLE
SALGRADE TABLE
TEST TABLE
9 rows selected.
Elapsed: 00:00:00.03
我们用E1表模拟回收站,删除表
SCOTT@ orcl>drop table e1;
Table dropped.
Elapsed: 00:00:00.43
再次查看用户模式下的对象
SCOTT@ orcl>select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$chFkqSV+9BTgUAB/AQAK4w==$0 TABLE
BONUS TABLE
DEPT TABLE
EMP TABLE
OB1 TABLE
OB2 TABLE
OB3 TABLE
SALGRADE TABLE
TEST TABLE
9 rows selected.
Elapsed: 00:00:00.01
由于第一张表名字不符合命名规则,我们用双引号括起来查看对象的格式
SCOTT@ orcl>desc "BIN$chFkqSV+9BTgUAB/AQAK4w==$0"
Name Null? Type
----------------------------------------------------------------- -------- ---------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
发现这张表就是刚才删掉的e1
查看回收站信息
SCOTT@ orcl>show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E1 BIN$chFkqSV+9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:22:53:37
SCOTT@ orcl>
也可以
SQL> select * from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE TS_NAME CREATETIME DROPTIME DROPSCN PARTITION_NAME CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
BIN$chFkqSV+9BTgUAB/AQAK4w==$0 E1 DROP TABLE TEST 2018-07-24:18:49:35 2018-07-28:22:53:37 1241988 YES YES 75404 75404 75404 0
吧回收站里面的表还原
SCOTT@ orcl>flashback table e1 to before drop;
Flashback complete.
Elapsed: 00:00:00.02
查看对象
SCOTT@ orcl>select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
E1 TABLE
EMP TABLE
OB1 TABLE
OB2 TABLE
OB3 TABLE
SALGRADE TABLE
TEST TABLE
9 rows selected.
Elapsed: 00:00:00.00
如果回收站中有多个重名的对象
SCOTT@ orcl>drop table e1;
Table dropped.
Elapsed: 00:00:00.02
SCOTT@ orcl>create table e1 as select * from emp;
Table created.
Elapsed: 00:00:00.08
SCOTT@ orcl>drop table e1;
Table dropped.
Elapsed: 00:00:00.02
SCOTT@ orcl>show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E1 BIN$chFkqSWA9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:03:33
E1 BIN$chFkqSV/9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:02:50
SCOTT@ orcl>
用之前的命令还原,看下是还原的哪张表
SCOTT@ orcl>flashback table e1 to before drop;
Flashback complete.
Elapsed: 00:00:00.01
SCOTT@ orcl>show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E1 BIN$chFkqSV/9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:02:50
SCOTT@ orcl>
如果我们还想将之前的e1闪回,那么需要重新命名
SCOTT@ orcl>flashback table e1 to before drop;
flashback table e1 to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
Elapsed: 00:00:00.02
SCOTT@ orcl>flashback table e1 to before drop rename to e2;
Flashback complete.
Elapsed: 00:00:00.02
SCOTT@ orcl>select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
E1 TABLE
E2 TABLE
EMP TABLE
OB1 TABLE
OB2 TABLE
OB3 TABLE
SALGRADE TABLE
TEST TABLE
10 rows selected.
Elapsed: 00:00:00.00
如果要闪回指定的表,我们可以用回收站名称做闪回
SCOTT@ orcl>drop table e1;
Table dropped.
Elapsed: 00:00:00.01
SCOTT@ orcl>rename e2 to e1;
Table renamed.
Elapsed: 00:00:00.06
SCOTT@ orcl>drop table e1;
Table dropped.
Elapsed: 00:00:00.02
SCOTT@ orcl>show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E1 BIN$chFkqSWC9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:09:40
E1 BIN$chFkqSWB9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:09:03
SCOTT@ orcl>
SCOTT@ orcl>flashback table "BIN$chFkqSWB9BTgUAB/AQAK4w==$0" to before drop;
Flashback complete.
Elapsed: 00:00:00.01
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E1 BIN$chFkqSWC9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:09:40
SCOTT@ orcl>
如果要清理回收站的某张表
SCOTT@ orcl>drop table e1;
Table dropped.
Elapsed: 00:00:00.01
SCOTT@ orcl>show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E1 BIN$chFkqSWD9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:13:40
E1 BIN$chFkqSWC9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:09:40
SCOTT@ orcl>
SCOTT@ orcl>purge table "BIN$chFkqSWC9BTgUAB/AQAK4w==$0";
Table purged.
Elapsed: 00:00:00.08
SCOTT@ orcl>show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E1 BIN$chFkqSWD9BTgUAB/AQAK4w==$0 TABLE 2018-07-28:23:13:40
SCOTT@ orcl>
如果要清空回收站
SCOTT@ orcl>purge recyclebin;
Recyclebin purged.
Elapsed: 00:00:00.03
SCOTT@ orcl>show recyclebin
SCOTT@ orcl>
如果想删除的时候不进回收站
SCOTT@ orcl>select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
OB1 TABLE
OB2 TABLE
OB3 TABLE
SALGRADE TABLE
TEST TABLE
8 rows selected.
Elapsed: 00:00:00.00
SCOTT@ orcl>drop table ob3 purge;
Table dropped.
Elapsed: 00:00:00.01
SCOTT@ orcl>show recyclebin
SCOTT@ orcl>
闪回版本查询
连接SCOTT用户查看用户下的表
SYS@ orcl>conn scott/scott
Connected.
SCOTT@ orcl>select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
OB1 TABLE
OB2 TABLE
SALGRADE TABLE
TEST TABLE
7 rows selected.
Elapsed: 00:00:00.05
重新构建一张实验用表
SCOTT@ orcl>create table e1 as select * from emp;
Table created.
Elapsed: 00:00:00.94
查看表信息
SCOTT@ orcl>select * from e1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Elapsed: 00:00:00.01
修改其中数据
SCOTT@ orcl>update e1 set sal=sal*1.125 where empno=7369;
1 row updated.
Elapsed: 00:00:00.02
SCOTT@ orcl>select * from e1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 900 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Elapsed: 00:00:00.00
我们做提交
SCOTT@ orcl>commit;
Commit complete.
Elapsed: 00:00:00.00
这时我们可以用闪回版本查询找出更改表之前的数据
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V ENAME SAL
------------------------------ ------------------------------ ---------------- - ---------- ------
30-JUL-18 10.16.40 AM 0500210015040000 U SMITH 900
30-JUL-18 10.16.40 AM SMITH 800
Elapsed: 00:00:00.01
再次做修改
SCOTT@ orcl>update e1 set sal=sal*1.25 where empno=7369;
1 row updated.
Elapsed: 00:00:00.00
SCOTT@ orcl>commit;
Commit complete.
Elapsed: 00:00:00.01
SCOTT@ orcl>select * from e1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------ ------ ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1125 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Elapsed: 00:00:00.00
再看闪回版本查询
SCOTT@ orcl>select versions_starttime,
2 versions_endtime,
3 versions_xid,
4 versions_operation,
5 ename,sal
6 from e1
7 versions between scn minvalue and maxvalue
8 where empno=7369;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V ENAME SAL
------------------------------ ------------------------------ ---------------- - ---------- ------
30-JUL-18 10.25.11 AM 09000B0077030000 U SMITH 1125
30-JUL-18 10.16.40 AM 30-JUL-18 10.25.11 AM 0500210015040000 U SMITH 900
30-JUL-18 10.16.40 AM SMITH 800
Elapsed: 00:00:00.00
我们把参数换成scn来做闪回版本查询
SCOTT@ orcl>select versions_startscn,
2 versions_endscn,
3 versions_xid,
4 versions_operation,
5 ename,sal
6 from e1
7 versions between scn minvalue and maxvalue
8 where empno=7369;
VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID V ENAME SAL
----------------- --------------- ---------------- - ---------- ------
1245014 09000B0077030000 U SMITH 1125
1244498 1245014 0500210015040000 U SMITH 900
1244498 SMITH 800
Elapsed: 00:00:00.00
闪回查询
SCOTT@ orcl>select * from e1 as of scn 1244498;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------ ------ ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 900 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Elapsed: 00:00:00.00
闪回事务查询
要求数据库打开追加日志数据模式
SYS@ orcl>select supplemental_log_data_min from v$database;
SUPPLEME
--------
NO
Elapsed: 00:00:00.03
打开追加日志
SYS@ orcl>alter database add supplemental log data;
Database altered.
Elapsed: 00:00:00.10
SYS@ orcl>select supplemental_log_data_min from v$database;
SUPPLEME
--------
YES
Elapsed: 00:00:00.02
再次修改数据
SCOTT@ orcl>update e1 set sal=sal*1.25 where empno=7369;
1 row updated.
Elapsed: 00:00:00.01
SCOTT@ orcl>commit;
Commit complete.
Elapsed: 00:00:00.00
SCOTT@ orcl>select versions_startscn,
2 versions_endscn,
3 versions_xid,
4 versions_operation,
5 ename,sal
6 from e1
7 versions between scn minvalue and maxvalue
8 where empno=7369;
VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID V ENAME SAL
----------------- --------------- ---------------- - ---------- ------
1247683 02001B006C030000 U SMITH 1406
1245014 1247683 09000B0077030000 U SMITH 1125
1245014 SMITH 900
Elapsed: 00:00:00.01
SYS@ orcl>col UNDO_SQL for a80
SYS@ orcl>select undo_sql from flashback_transaction_query where xid='02001B006C030000';
UNDO_SQL
--------------------------------------------------------------------------------
update "SCOTT"."E1" set "SAL" = '1125' where ROWID = 'AAASbmAAEAAAAyjAAA';
Elapsed: 00:00:01.45
查询出的结果是修改数据时操作的反向操作SQL
我们利用反向SQL还原修改操作
SYS@ orcl>update "SCOTT"."E1" set "SAL" = '1125' where ROWID = 'AAASbmAAEAAAAyjAAA';
1 row updated.
Elapsed: 00:00:00.00
SYS@ orcl>commit;
Commit complete.
Elapsed: 00:00:00.00
SCOTT@ orcl>select * from e1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------ ------ ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1125 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Elapsed: 00:00:00.01