
Flashback Database
闪回数据库用的是闪回日志和日志,不用备份集
闪回数据库不执行restore,所以比不完全恢复快
前提条件:
◇ flashback log(闪回日志)
◇ FRA存储
◇ redo log 归档模式
检查数据库是否处于归档模式,闪回数据库是否开启
SQL> select DBID, NAME, LOG_MODE,FLASHBACK_ON from v$database;
DBID NAME LOG_MODE FLASHBACK_ON
---------- --------- ------------ ------------------
1380804050 ORCL NOARCHIVELOG NO
从上可知:数据库是非归档模式 ,闪回数据库没有打开
要使闪回数据库可用,需开启归档模式,开启闪回数据库。
确保是归档模式
SQL> archive log list ;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 7
Next log sequence to archive 9
Current log sequence 9
如何启用归档模式请参见前文:如何启用归档模式
检查是否数据是否是归档
SQL> select DBID , NAME , LOG_MODE ,FLASHBACK_ON from v$database ;
DBID NAME LOG_MODE FLASHBACK_ON
---------- --------------------------- ------------------
1356322301 ORCL ARCHIVELOG YES
开启闪回数据库
检查数据库是否开启闪回日志
SQL> select FLASHBACK_ON from v$database ;
FLASHBACK_ON
------------------
NO #没启用数据闪回
开启数据库闪回 (必须在mount模式下)
SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440 SCOPE=BOTH;
SQL> ALTER DATABASE FLASHBACK ON; #启用数据闪回
SQL> ALTER DATABASE OPEN;
依赖:闪回日志和日志
闪回日志存在快速恢复区
SQL> show parameter recovery;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string +FRA
db_recovery_file_dest_size big integer 3882M
recovery_parallelism integer 0
闪回数据库的时间依赖于闪回日志保留多久
闪回日志存在fra 存多久,参数DB_FLASHBACK_RETENTION_TARGET设置,单位分钟。
SQL> show parameter flashback;
NAME TYPE VALUE
----------------------- ----------- -------
db_flashback_retention_target integer 1440 #分钟
以上设置闪回日志在闪回恢复区保留1天,数据库可以闪回1天内任何时刻
alter system set db_flashback_retention_target=2880; #保留2天
SQL> show parameter flashback;
NAME TYPE VALUE
----------------------- ----------- -------
db_flashback_retention_target integer 2880 #闪回存储2天
SQL> select to_char(sysdate ,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2017-09-28 02:43:36
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1089651
日志序列
SQL> select group#,SEQUENCE#, STATUS from v$log ;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 7 CURRENT
2 5 INACTIVE
3 6 INACTIVE
创建还原点
create restore point a;
SQL> create table scott.sw(id number) ;
Table created.
SQL> insert into scott.sw values(1);
1 row created.
SQL> commit;
Commit complete.
select * from scott.sw;
ID
----------
1
truncate table scott.emp ; #模拟故障点
QL> select count(*) from scott.emp ;
COUNT(*)
----------
0
SQL> select count(*) from scott.emp as of timestamp(sysdate -1/1440);
select count(*) from scott.emp as of timestamp(sysdate -1/1440)
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
不能成功,闪回查询不能跨越DDL ,truncate 是一个ddl语句。
使用闪回数据库恢复flashback database
1. 找到要闪回的点
先找一个大概是时间点 scn: 1089651 ,timestmap :2017-09-28 02:43:36,还原点 a
SQL> SELECT oldest_flashback_scn,to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss') FROM V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN TO_CHAR(OLDEST_FLAS
-------------------- -------------------
1089215 2017-09-28 02:41:28
scn 1089651 > 1089215
时间 2017-09-28 02:43:36 >2017-09-28 02:41:28
还原点a
SQL> select name ,SCN ,to_char( TIME ,'yyyy-mm-dd hh24:mi:ss') from V$RESTORE_POINT;
NAME SCN TO_CHAR(TIME,'YYYY-
----------- ---------- -------------------
A 1089663 2017-09-28 02:44:06
这里选择scn 时间 还原点都是对 都在可闪回的范围内 可以实施数据库闪回.
2. 开始实施闪回
a. 关闭数据库到mount
shutdown immediate ;
startup mount ;
b. flashback database to 选择的点
flashback database to timestamp to_timestamp('2017-09-28 02:43:36', 'YYYY-MM-DD HH24:MI:SS');
或
FLASHBACK DATABASE TO SCN 1089651;
或
FLASHBACK DATABASE TO SEQUENCE 7 THREAD=1;
或
FLASHBACK DATABASE TO RESTORE POINT a;
c. read only打开数据库去确认是否是要的还原点,如果不是,重复a、b、c直到你要的还原点
alter database open read only;
查看scott.emp是否找回
SQL> select * from scott.emp ;
EMPNO JOB MGR HIREDATE SAL COMM DEPTNO
---------- --------- ---------- --------- ---------- ---------- ----------
7839 PRESIDENT 17-NOV-81 5000 10
7844 SALESMAN 7698 08-SEP-81 1500 0 30
7876 CLERK 7788 23-MAY-87 1100 20
7900 CLERK 7698 03-DEC-81 950 30
7902 ANALYST 7566 03-DEC-81 3000 20
7934 CLERK 7782 23-JAN-82 1300 10
6 rows selected.
SQL> select * from scott.sw;
select * from scott.sw #闪回点后的数据都丢失
*
ERROR at line 1:
ORA-00942: table or view does not exist
3. 最后resetlogs打开数据库
shutdown immediate ;
startup mount;
alter database open resetlogs;
一般在测试库上做,把数据找回后导处来,再导入生产库。
建立强制还原点,和你的保留策略无关,一定能够把数据库闪回到你创建的还原点
CREATE RESTORE POINT 还原点名 GUARANTEE FLASHBACK DATABASE;
如:
CREATE RESTORE POINT before_upgrade GUARANTEE FLASHBACK DATABASE;
select name ,SCN ,to_char( TIME ,'yyyy-mm-dd hh24:mi:ss'), GUARANTEE_FLASHBACK_DATABASE from V$RESTORE_POINT;
NAME SCN TO_CHAR(TIME,'YYYY- GUA
--------------- ---------- ------------------- ---
BEFORE_UPGRADE 1186403 2017-09-28 19:22:11 YES
A 1185964 2017-09-28 19:08:58 NO
删除强制还原点:
drop restore point BEFORE_UPGRADE





