Oracle DB闪回(Flashback database)开启笔记
为测试部门搭建一台Oracle DB,需满足可以经常将整个数据库回退到某时间点的需求。比较简单的方法是使用Oracle的闪回特性之一"闪回数据库"。
预备知识:闪回数据库需要使用两种日志:闪回日志和重做日志。重做日志的概念不需多谈,所谓的闪回日志的记录正好与重做日志的记录相反。可以简单的这样认为:比如重做日志记录了一条insert命令,那么闪回日志就记录这条记录相关的delete命令,当然实际上这是非常复杂的过程。
这里并不会介绍“闪回数据库”的原理,因为已经有太多的资料来阐明它,也不会介绍“闪回数据库”的操作方法,因为它非常简单(在进入MOUNT状态后执行"flashback database to scn …"或"flashback database to timestamp …")。
1. 开启DB闪回之前需确保启用了归档模式
SQL> archive log list
Database
log mode Archive Mode
Automatic archival Enabled
……
2. 查看闪回日志是否已启用
SQL>
select
LOG_MODE,FLASHBACK_ON
from
v$
Database
;
LOG_MODE FLASHBACK_ON
---------- ---------------
ARCHIVELOG
NO
3. 启用闪回日志,即闪回数据库功能
SQL>
alter
Database
flashback
on
;
alter
Database
flashback
on
*
ERROR
at
line 1:
ORA-38706: Cannot turn
on
flashback
Database
logging.
ORA-38709: Recovery Area
is
not
enabled.
报错,无法开启闪回功能。到这里本文的主角--"oerr"命令君隆重登场。
4. 根据上文中提示的错误号使用oerr命令排错
$ oerr ORA 38709
38709, 00000,
"Recovery Area is not enabled."
//
*Cause: An ALTER DATABASE FLASHBACK ON
command
failed because the
//
Recovery Area was not enabled.
//
*Action: Set DB_RECOVERY_FILE_DEST to a location and retry.
5. 从上述的提示中找到错误原因:DB_RECOVERY_FILE_DEST 没有预设
SQL> show parameter DB_RECOVERY_FILE_DEST
NAME
TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big
integer
0
6. 设置DB_RECOVERY_FILE_DEST
SQL>
alter
system
set
db_recovery_file_dest=
'/opt/oracle/fast_recovery_area'
;
alter
system
set
db_recovery_file_dest=
'/opt/oracle/fast_recovery_area'
*
ERROR
at
line 1:
ORA-02097: parameter cannot be modified because specified value
is
invalid
ORA-19802: cannot use DB_RECOVERY_FILE_DEST without DB_RECOVERY_FILE_DEST_SIZE
7. 使用oerr命令排错
$ oerr ORA 19802
19802, 00000,
"cannot use DB_RECOVERY_FILE_DEST without DB_RECOVERY_FILE_DEST_SIZE"
//
*Cause: There are two possible cause
for
this error:
//
1) The DB_RECOVERY_FILE_DEST parameter was
in
use when no
//
DB_RECOVERY_FILE_DEST_SIZE parameter was encountered
while
//
fetching initialization parameter.
//
2) An attempt was made to
set
DB_RECOVERY_FILE_DEST with the
//
ALTER SYSTEM
command
when no DB_RECOVERY_FILE_DEST_SIZE
//
was
in
use.
//
*Action: Correct the dependency parameter definitions and retry the
command
.
8. 从上述错误原因与解决方案提示中得知需要先设置DB_RECOVERY_FILE_DEST_SIZE
SQL>
alter
system
set
DB_RECOVERY_FILE_DEST_SIZE=20G scope=both;
System altered.
SQL> show parameter db_recovery
NAME
TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big
integer
20G
9. 设置DB_RECOVERY_FILE_DEST
SQL>
alter
system
set
db_recovery_file_dest=
'/opt/oracle/fast_recovery_area'
scope=both;
System altered.
10. 启用闪回日志,即闪回数据库功能
SQL>
alter
Database
flashback
on
;
Database
altered.
此时可以在'db_recovery_file_dest'设定的目录中看到扩展名为.flb的文件,它们就是闪回日志。
$
ls
o1_mf_98mpkdl6_.flb o1_mf_98okkcs9_.flb
11. 闪存日志的保存期限由参数db_flashback_ retention_target控制(单位为分钟),凡是超出保存期限的闪回日志将会在快速恢复区空间吃紧时被自动删除。
SQL> show parameter db_flashback_retention_target
NAME
TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target
integer
10080