ITPub博客

首页 > 数据库 > Oracle > flashback database 将数据库闪回到某一时间点

flashback database 将数据库闪回到某一时间点

原创 Oracle 作者:彩伦 时间:2016-05-18 18:00:49 0 删除 编辑

利用flashback database 将数据库闪回到某一时间点

1与flashback database相关的几个视图

(1)v$flashback_database_log

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

 

(2)v$flashback_database_stat

用来对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

 

(3)v$flashback_database_logfile

记录闪回日志的详细信息,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

2 启用flashback database模式

数据库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

 

3与flashback database相关的几个参数

(1)db_recovery_file_dest_size和db_recovery_file_dest

要使用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

 

(2)db_flashback_retention_target

用来控制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.

 

4 利用flashback database恢复到过去时间点

(1)查看当前时间点

SQL> select sysdate from dual;

SYSDATE

-------------------

2016-05-15 11:39:27

 

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

     877451

(2)误操作,删除HR用户

SQL> select table_name from dba_tables where owner='SHALL';

TABLE_NAME

------------------------------------------------------------------------------------------

ZHONG

T1

 

SQL> drop user shall cascade;

User dropped.

 

(3)闪回数据库,及打开数据库方式

执行完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

 

5闪回数据库需要注意的几点

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-02-06

  • 博文量
    138
  • 访问量
    892099