通过引入闪回日志和归档日志将数据库还原到某个历史时间点,但有几种误操作是无法还原的:删除表空间、删除数据文件、对数据文件进行resize、重建控制文件、使用nologing子句、resetlog等
首先查看数据库是否开启闪回功能
SYS@ orcl>select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
Elapsed: 00:00:00.01
SYS@ orcl>alter database flashback on;
Database altered.
Elapsed: 00:00:00.35
开启闪回功能后会有闪回日志
[oracle@RHEL6 ~]$ su - grid
Password:
[grid@RHEL6 ~]$ asmcmd -p
ASMCMD [+] > cd flash
ASMCMD [+flash] > cd orcl
ASMCMD [+flash/orcl] > cd flashback
ASMCMD [+flash/orcl/flashback] > ls
log_1.298.982857115
ASMCMD [+flash/orcl/flashback] >
查看日志信息
SYS@ orcl>alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
Session altered.
Elapsed: 00:00:00.00
SYS@ orcl>select OLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME from v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1255671 2018-07-30 15:51:55
Elapsed: 00:00:00.07
SYS@ orcl>
查看允许闪回的时间限制
SYS@ orcl>show parameter flashback
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
SYS@ orcl>
我们也可以创建还原点
SYS@ orcl>create restore point before_drop_emp;
Restore point created.
Elapsed: 00:00:00.04
查看还原点信息
SYS@ orcl>col name for a20
SYS@ orcl>select NAME,SCN,TIME from v$restore_point;
NAME SCN TIME
-------------------- ---------- ---------------------------------------------------------------------------
BEFORE_DROP_EMP 1256695 30-JUL-18 04.31.47.000000000 PM
Elapsed: 00:00:00.01
模拟DML语句误操作
SYS@ orcl>drop table scott.e1 purge;
Table dropped.
Elapsed: 00:00:00.11
我们利用闪回数据库修复数据,需要数据库在mount状态下
SYS@ orcl>shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@ orcl>startup mount
ORACLE instance started.
Total System Global Area 784998400 bytes
Fixed Size 2217464 bytes
Variable Size 528484872 bytes
Database Buffers 251658240 bytes
Redo Buffers 2637824 bytes
Database mounted.
SYS@ orcl>flashback database to restore point before_drop_emp;
Flashback complete.
Elapsed: 00:00:00.73
闪回后我们使用只读打开数据库
SYS@ orcl>alter database open read only;
Database altered.
Elapsed: 00:00:02.12
SYS@ orcl>select * from scott.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.02
数据库闪回后必须用resetlog方式打开
SYS@ orcl>shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@ orcl>startup
ORACLE instance started.
Total System Global Area 784998400 bytes
Fixed Size 2217464 bytes
Variable Size 528484872 bytes
Database Buffers 251658240 bytes
Redo Buffers 2637824 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SYS@ orcl>alter database open resetlogs;
Database altered.
Elapsed: 00:00:07.58