flashback database 所能回退到的最早时间,取决与保留的flashback database log多少。
oldest_flashback_scn/oldest_flashback_time ----记录可恢复最早时间点
flashback_size ----记录使用了多少flash recovery area空间
retention_target ----目标保存的时间(分)
estimated_flashback_size ----根据策略对需要的空间大小的估计值
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select * from v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
874900 2016-05-15 10:30:54 1440 15941632 0
用来对flashback log空间情况进行更细粒度的记录和估计。这个视图以小时为单位记录单位时间内数据库的活动量,flashback_data代表flashback log产生的数量,db_date代表数据改变数量,redo_date代表日志数量,通过这3个数量可以反映出数据的活动特点,更准确预计flash recovery area的空间需求。
SQL> select * from v$flashback_database_stat;
BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
------------------- ------------------- -------------- ---------- ---------- ------------------------
2016-05-15 10:30:54 2016-05-15 10:37:58 884736 417792 106496 0
记录闪回日志的详细信息,name闪回日志位置,first_change#闪回日志中记录的最早的scn,first_time闪回日志中记录的最早时间
SQL> col name for a40
SQL> select * from v$flashback_database_logfile;
NAME LOG# THREAD# SEQUENCE# BYTES FIRST_CHANGE# FIRST_TIME
---------------------------------------- ---------- ---------- ---------- ---------- ------------- -------------------
/u01/app/oracle/flash_recovery_area/ORCL 1 1 1 15941632 874980 2016-05-15 10:30:54
/flashback/o1_mf_cmhqtxcx_.flb
数据库flashback database功能默认是关闭的,需要手动启用该功能
SQL> select flashback_on,log_mode from v$database;
FLASHBACK_ON LOG_MODE
------------------------------------------------------ ------------------------------------
NO NOARCHIVELOG
SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 922750012 bytes
Database Buffers 335544320 bytes
Redo Buffers 12582912 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select flashback_on,log_mode from v$database;
FLASHBACK_ON LOG_MODE
------------------------------------------------------ ------------------------------------
YES ARCHIVELOG
要使用flashback database 必须使用flash recovery area,因为flashback database log只能保存在这里,需要配置两个参数,一个是大小,一个是位置。如果是rac,flash recovery area必须位于共享存储中。数据库必须处于archivelog模式。
SQL> show parameter db_recover
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery
_area
db_recovery_file_dest_size big integer 3852M
修改参数
(scope=spfile 修改参数,下次启动生效
scope=memory 修改参数,只在内存上修改,立即生效,重启后不再生效
scope=both 修改参数,立即生效)
SQL> alter system set db_recovery_file_dest_size=3g scope=both;
System altered.
SQL> alter system set db_recovery_file_dest='/home/oracle/' scope=both;
System altered.
SQL> show parameter db_recover
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
db_recovery_file_dest string /home/oracle/
db_recovery_file_dest_size big integer 3G
用来控制flashback log保留时间,即flashback database能够恢复的最早时间点。默认1440,单位minute,即24小时。注意:虽然该参数未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。
SQL> show parameter db_flashback
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
db_flashback_retention_target integer 1440
修改参数
SQL> alter system set db_flashback_retention_target=1500 scope=both;
System altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2016-05-15 11:39:27
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
877451
SQL> select table_name from dba_tables where owner='SHALL';
TABLE_NAME
------------------------------------------------------------------------------------------
ZHONG
T1
SQL> drop user shall cascade;
User dropped.
执行完flashback database后,oracle提供两种方式打开数据库。
1)alter database open resetlogs; ---该方式打开数据库后,指定的恢复时间点之后产生的数据统统丢失。
2)alter database open read only; ----只读打开数据库,推荐先用该方式打开,确定恢复了在重新resetlogs打开数据库
在闪回数据库后,先用该方式打开数据库,查看是否是我们需要恢复的时间点,如果不是,在关闭数据库进行重新定位到恢复时间点。如下:
SQL> shut abort
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 922750012 bytes
Database Buffers 335544320 bytes
Redo Buffers 12582912 bytes
Database mounted.
----闪回数据库到误操作之后
SQL> flashback database to timestamp to_timestamp('2016-05-15 11:41:00','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
SQL> alter database open read only;
Database altered.
----打开数据库后发现在误操作之后,重新闪回时间点
SQL> select table_name from dba_tables where owner='SHALL';
no rows selected
SQL> shut abort
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 922750012 bytes
Database Buffers 335544320 bytes
Redo Buffers 12582912 bytes
Database mounted.
SQL> flashback database to timestamp to_timestamp('2016-05-15 11:39:27','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
----当然上面闪回数据库语句也可以这样写哦, flashback database to scn 877451;
SQL> alter database open read only;
Database altered.
-----确定是在误操作之前
SQL> select table_name from dba_tables where owner='SHALL';
TABLE_NAME
------------------------------------------------------------------------------------------
ZHONG
T1
----关闭数据库,resetlogs方式打开
SQL> shut abort
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 922750012 bytes
Database Buffers 335544320 bytes
Redo Buffers 12582912 bytes
Database mounted.
SQL> alter database open resetlogs;
Database altered.
SQL> select table_name from dba_tables where owner='SHALL';
TABLE_NAME
------------------------------------------------------------------------------------------
ZHONG
T1
1)一旦关闭闪回数据库,flashback recovery area中的闪回日志将自动全部删除。
2)即便以resetlogs打开数据库,当前闪回日志里的内容仍然保留,仍然可以继续进行闪回以restlogs方式打开数据库。之所以考虑以read only放是打开数据库,主要是因为以resetlog方式打开数据库后,用户即可操作数据库,无法校验闪回的准确性。另外,当闪回数据库与DATA GUARD结合后,当主库发生逻辑损坏,我们可以闪回备库,然后以read only方式打开备库,将数据从备库中导出后导入到主库中,这样将对数据和业务的影响减小到最小。
3)如果闪回数据库的时间点之间进行了控制文件的恢复或重建,数据文件的收缩,或删除了某个表空间,则闪回将失败。
4)闪回日志在出现空间压力的情况下,oracle会自动删除闪回日志,则有可能导致无法闪回到指定的时间点。如果希望闪回到指定的时间点,可进行如下操作
SQL> create restore point flashback_20160515 guarantee flashback database;
Restore point created.
SQL> select name from v$restore_point;
NAME
----------------------------------------
FLASHBACK_20160515
SQL> shut abort
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 922750012 bytes
Database Buffers 335544320 bytes
Redo Buffers 12582912 bytes
Database mounted.
SQL> flashback database to restore point flashback_20160515;
Flashback complete.
SQL> alter database open resetlogs;
Database altered.
SQL> select name from v$restore_point;
NAME
----------------------------------------
FLASHBACK_20160515
SQL> drop restore point flashback_20160515;
Restore point dropped.
SQL> select name from v$restore_point;
no rows selected
5)闪回删除,只能用于非系统表空间和本地管理的表空间。
6)对象的参考约束、索引不会被恢复,指向该对象的外键约束需要重建。
7)对象能否恢复成功,取决与对象空间是否被覆盖重用。
8)当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。
9)对于Recycle Bin中的对象,只支持查询。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30130773/viewspace-2102634/ ,如需转载,请注明出处,否则将追究法律责任。