基于时间点的闪回
1、 模拟用户误删除数据
SQL> select count(*) from kel; COUNT(*) ---------- 1 SQL> truncate table kel; Table truncated. SQL> select count(*) from kel; COUNT(*) ---------- 0
2、查看当前时间--(根据此时间来进行数据库闪回操作)
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY-MM-DDHH24:MI:S ---------------------------------- 14-07-22 19:24:23
3、确认能恢复的时间点
根据视图v$flashback_database_log或者v$flashback_database_logfile中的内容来确定能恢复的时间
SQL> col oldest_flashback_scn format 999999 heading 'oldest|flashback|scn #';--表示数据库能回退到最早的SCN号 SQL> col oldest_flashback_time format a20 heading 'oldest|flashback|time';--表示数据库能回退到最早的时间 SQL> col retention_target format 999999 heading 'retention|target';--表示当前系统参数值的设定 SQL> col flashback_size format 9999999 heading 'flashback|size'; --表示目前flashback日志的大小 SQL> col estimated_flashback_size format 999999 heading 'estimated|flashback|size'; --表示为了达到retention target,预计需要多大的日志空间,可以用来参考设置flash recover area的大小
SQL> select oldest_flashback_scn,to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') oldest_flashback_time,retention_target,flashback_size,estimated_flashback_size from v$flashback_database_log; oldest oldest estimated flashback flashback retention flashback flashback scn # time target size size --------- -------------------- --------- --------- --------- 759066 14-07-22 00:24:49 1440 8192000 0
flashback database 能回退的最早的时间,取决于保留在flashback recover area中的flashback database 日志的多少。
在另外一个试图中叶可以查看到相关的信息:
SQL> col log# format 9999 heading 'flashback|log #'; SQL> col bytes format 9999999 heading 'flashback|log size'; SQL> col first_change# format 9999999 heading 'flashback|scn #'; SQL> col first_time format a24 heading 'flashback start time'; SQL> select log#,bytes,first_change#,first_time from v$flashback_database_logfile; flashback flashback flashback log # log size scn # flashback start time --------- --------- --------- ------------------------ 1 8192000 759120 22-JUL-14
4、重新启动数据库到mount阶段
闪回数据库实际上是一个不完全恢复数据库的过程,因此需要关闭数据库,重启数据库到mount阶段,闪回数据库与不完全恢复数据库不同的是,闪回不需要进行restore的操作
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount; ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 2019320 bytes Variable Size 113246216 bytes Database Buffers 50331648 bytes Redo Buffers 2174976 bytes Database mounted.
5、 进行闪回数据库
基于时间的恢复,参考的时间点为查询的时间点
SQL> flashback database to timestamp to_timestamp('14-07-22 19:53:04','yy-mm-dd hh24:mi:ss'); --此时间点是根据第二步来的 Flashback complete.
6、 查看是否恢复成功
SQL> alter database open read only; Database altered. SQL> select count(*) from kel.kel; COUNT(*) ---------- 0在查看恢复是否成功的时候,将数据库打开到只读的状态,这样如果未完全恢复,还是可以进行第二次基于时间点的恢复,从上可以看到数据并未恢复,从而选择一个靠前的时间来进行恢复。
7、 第二次基于时间点的恢复
SQL> flashback database to timestamp to_timestamp('14-07-22 19:50:00','yy-mm-dd hh24:mi:ss'); Flashback complete. SQL> alter database open read only; Database altered. SQL> select count(*) from kel.kel; COUNT(*) ---------- 1
数据恢复之后,关闭数据库,打开数据库的时候用resetlog打开
8.、打开数据库
SQL> alter database open resetlogs; Database altered.
在数据库打开之后,最好对数据库做一个全备,从而防止数据丢失。
9、相关视图
SQL> select flashback_on from v$database; FLASHBACK_ON ------------------------------------ YES
SQL> select * from v$flashback_database_stat; BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE -------- -------- -------------- ---------- ---------- ------------------------ 21:12:52 21:54:34 843776 2326528 411136 0 20:05:44 21:12:52 5939200 8683520 2643456 127377408
10、相关命令
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] SCN <system_change_number> --基于SCN闪回 FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回 FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回 下面的示例: SQL> flashback database to timestamp('2014-07-23 13:04:30','yyyy-mm-dd hh24:mi:ss'); SQL> flashback database to scn 8190000; SQL> flashback database to restore point kel; 备注:创建闪回点语法:create restore point 闪回点名称;
for linux and python