一种快速恢复数据库的方法——Flashback DB
在工作中有同事这样的场景:在一些特定的情况下在时间点t1需要对我们的产品升级,升级需要在数据库中执行了一系列脚本,而随后我们又希望放弃本次变更,使数据库能恢复到执行升级前时间点t1时的状态,这是我们可以有两种选择,一种是进行数据库的不完全恢复(DBPITR,这种方式需要先对数据库所有文件进行一次恢复);而另一种则是使用数据库的Flashback Database特性,直接利用数据块的前镜像使数据库进行回滚,使数据库恢复到之前的一个时间点的状态。
Flashback Database的主要原理是数据库首先在被修改过的数据块上应用相应需要恢复的时间点上的对应被修改过的数据块的前镜像(Flashback logs),然后应用归档日志及重做日志将数据库恢复到这个时间点的一致性状态,可见Flashback Database主要依赖的信息为Flashback logs和归档日志。由于这种方式没有恢复数据文件的过程,因此相比DBPITR方式的效率会更高。
在使用Flashback Database的过程中有一个非常重要的观念就是RESTORE POINT,它可以简单认为就是数据库可以闪回的一个时间点,RESTORE POINT分为两种:Normal Restore Points和Guaranteed Restore Points,其中使用Normal Restore Points需要注意开启数据库的flashback模式:ALTER DATABASE FLASHBACK ON;使用Guaranteed Restore Points不需要开启flashback模式。
在配置和执行一个Flashback Database前必要了解这样几个概念:
1) Flash recover area 包含的内容(主要为Online redo log files、Archived redo log files、Backup pieces、Flashback logs),如何设置(DB_RECOVERY_FILE_DEST_SIZE和DB_RECOVERY_FILE_DEST),大小评估(即考虑Flash recover area 包含的内容的预计总和大小)
2) Flashback logs包含的内容(所有被修改的数据块的block images),如何设置(ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=4320; ALTER DATABASE FLASHBACK ON;)
在配置和执行一个Flashback Database的过程非常简单,步骤如下:
1、设置数据库快速恢复区Flash recover area
SYS@test 2013-12-08 18:18:38> alter system set db_recovery_file_dest_size=1G scope=both;
系统已更改。
SYS@test 2013-12-08 18:18:48> alter system set db_recovery_file_dest='D:\oracle\flash_recovery_area' scope=both;
系统已更改。
SYS@test 2013-12-08 18:18:57> show parameter recover
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:\oracle\flash_recovery_area
db_recovery_file_dest_size big integer 1G
recovery_parallelism integer 0
2、设置恢复点
SYS@test 2013-12-08 18:19:55> select *from yb.t1;
A B
---------- --------------------
1 aaaaa
2 dfdsaf
SYS@test 2013-12-08 18:19:58> create restore point yb_before_upgrade guarantee flashback database ;
还原点已创建。
SYS@test 2013-12-08 18:20:13> SELECT * FROM V$RECOVERY_AREA_USAGE;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 18.57 0 5
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG .76 0 1
FOREIGN ARCHIVED LOG 0 0 0
已选择7行。
3、执行数据修改
SYS@test 2013-12-08 18:21:07> truncate table yb.t1;
表被截断。
SYS@test 2013-12-08 18:21:11> select *from yb.t1;
未选定行
SYS@test 2013-12-08 18:25:08> select name, scn, time, database_incarnation#, guarantee_flashback_database from v$restore_point;
NAME SCN TIME DATABASE_INCARNATION# GUAR
-------------------- --------- ---------------------------------------- --------------------- ----
YB_BEFORE_UPGRADE 1322444 08-12月-13 06.20.12.000000000 下午 2 YES
4、使用Flashback闪回数据库
SYS@test 2013-12-08 18:26:41> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SYS@test 2013-12-08 18:27:17> startup mount
ORACLE 例程已经启动。
Total System Global Area 534462464 bytes
Fixed Size 2177456 bytes
Variable Size 398460496 bytes
Database Buffers 125829120 bytes
Redo Buffers 7995392 bytes
数据库装载完毕。
SYS@test 08-12月-13> flashback database to restore point yb_before_upgrade ;
闪回完成。
5、将数据库打开到只读模式下进行数据验证(说明:可以查询核心表来确认数据库是否恢复到希望的时间,如果需要可以进行多次闪回)
SYS@test 08-12月-13> alter database open read only;
数据库已更改。
SYS@test 08-12月-13> select *from yb.t1;
A B
---------- --------------------
1 aaaaa
2 dfdsaf
6、打开数据库,提供正常服务
SYS@test 08-12月-13> shutdown immeidate;
SP2-0717: 非法的 SHUTDOWN 选项
SYS@test 08-12月-13> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SYS@test 08-12月-13> startup mount;
ORACLE 例程已经启动。
Total System Global Area 534462464 bytes
Fixed Size 2177456 bytes
Variable Size 398460496 bytes
Database Buffers 125829120 bytes
Redo Buffers 7995392 bytes
数据库装载完毕。
SYS@test 08-12月-13>
SYS@test 08-12月-13> alter database open resetlogs;
数据库已更改。
SYS@test 08-12月-13> select *from yb.t1 ;
A B
---------- --------------------
1 aaaaa
2 dfdsaf
7、清理不再需要的闪回点,使得flashback log日志被数据库自动回收
SYS@test 08-12月-13> select flashback_on from v$database ;
FLASHBACK_ON
------------------
RESTORE POINT ONLY
SYS@test 08-12月-13> DROP RESTORE POINT yb_before_upgrade;
还原点已删除。
SYS@test 08-12月-13> select name, scn, time, database_incarnation#, guarantee_flashback_database from v$restore_point;
未选定行
SYS@test 08-12月-13> select flashback_on from v$database ;
FLASHBACK_ON
------------------
NO
SYS@test 08-12月-13> SELECT * FROM V$RECOVERY_AREA_USAGE;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 27.54 0 8
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
已选择7行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7913676/viewspace-1062717/ ,如需转载,请注明出处,否则将追究法律责任。