1.Flashback
在oracle 9i中引入flashback查询,以便能在需要的时候查到过去某个时刻的一致性数据,依赖于undo表空间存储的信息来闪回查询以前的版本,当然这个受限于undo表空间的大小,以及保留策略。如果undo 被覆盖了就不能进行查询。oracle10g中增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的。flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将数据库往后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area),这个区域默认创建在oracle_base目录下。可以将所有恢复相关的文件,比如flashbacklog,archive log,backup set等,放到这个区域集中管理。
1.1 查看数据库flashback是否打开(select t.FLASHBACK_ON from v$database t)
要打开flashback技术,数据库必须处于归档模式(archivelog:alter database archivelog),否则数据库会出现一下错误:
SQL> alter database flashback on; alter database flashback on * 第 1 行出现错误: ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。 ORA-38707: 尚未启用介质恢复。 |
1.1.2.查看oracle是否处于归档模式:archive log list
SQL> archive log list; 数据库日志模式 存档模式 自动存档 启用 存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 13 下一个存档日志序列 15 当前日志序列 15 |
1.2 更改数据库为mount状态,alter database mount;
打开flashback:
SQL> alter database flashback on;
1.3.闪回恢复区
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash log。所以这个参数要和db_recovery_file_dest_size配合修改。
SQL> show parameter db_recover NAME TYPE VALUE SQL> show parameter db_flash NAME TYPE VALUE |
我们看到db_flashback_retention_target 默认是1440分钟,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。
1.4.检查恢复区的使用情况
SQL> select * from v$flash_recovery_area_usage; FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES 已选择6行。 |
1.5.数据库的恢复(Flashback Database:数据库必须处于归档模式并且flashback必须打开)
flashback技术可以以两种模式恢复,timestamp 或者SCN
Flashback Database操作示例 :
1.5.1.查看当前scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE; CURRENT_SCN |
1.5.2.查看当前时间
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual; TIME |
1.5.3.Flashback Database实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态
SQL> shutdown immediate; SQL> startup mount; Total System Global Area 293601280 bytes
|
1.5.4执行恢复(timestamp)
SQL> Flashback database to timestamp to_timestamp('12-07-30 14:10:33','yy-mm-dd 闪回完成。 或则 Flashback database to scn 1005205; |
1.5.5.打开数据库
在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
1). 直接alter database open resetlogs打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only命令,以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
这里演示,就以resetlogs方式打开:
1.5.6.打开数据库
SQL> alter database open resetlogs; 数据库已更改。 |