闪回数据库(Flashback Database)

闪回整个数据库在功能上等价于不完整数据库恢复,但是采用的方法和支持技术完全不同。

一旦启用了闪回数据库,修改的块映像会不时地从数据库缓冲区的缓存中复制到 SGA 内的一个新的存储区域中,即闪回缓冲区。通过一个新的后台进程恢复写入器(Recovery Writer, RVWR)将此闪回缓冲区(内容)刷新到磁盘和闪回日志。这没有改变向日志缓冲区写入更改的常规程序,LGWR(日志写入器)然后将日志缓冲区刷新到磁盘,闪回日志记录是此操作的附属物。与重做日志不同的是,闪回日志记录不是记录变化的日志,而是记录完整块映像的日志。

由于不是将每个变化的块的所有版本都复制到闪回缓冲区和随后的闪回日志中,因此不可能闪回到某个精确的时间点

当执行闪回时,Oracle 会使用闪回日志将数据库及时回退到期望的时间之前的某个时间点,然后按照不完整恢复中的常规方式应用重做日志(使用任何必需的归档重做日志文件和联机重做日志文件),以便将数据文件前滚到希望的确切时间。然后可以按照与普通的不完整恢复采用的相同方式,使用新的化身(incarnation)打开数据库。

闪回数据库要求归档日志模式并使用 ALTER DATABASE OPEN RESETLOGS 来创建数据库的一个新化身。

闪回数据库要求归档日志模式,因为如果归档日志数据流不可用,则无法将应用闪回日志得到的不一致数据库版本转换到能够打开的一致的数据库版本。闪回数据库既然还要求归档日志模式,那么它相对于不完整恢复的优势体现在哪里呢?优点体现在回滚数据库将更加方便和快捷

配置闪回数据库

1. 确保数据库处于归档日志模式

归档日志模式是启用闪回数据库的先决条件,通过查询 V$DATABASE 视图来确认此模式:

SQL> SELECT log_mode FROM V$DATABASE;

LOG_MODE
------------
ARCHIVELOG
2. 创建闪回恢复区

闪回恢复区是存放闪回日志的场所。除了设置闪回恢复区目录并限定其大小外,不能施加其他控制。可以使用两个实例参数来控制:

DB_RECOVERY_FILE_DEST -- 指定目的目录

DB_RECOVERY_FILE_DEST_SIZE -- 限制它占用的最大空间量(单位是字节)

SQL> ALTER SYSTEM SET db_recovery_file_dest='/flash_recovery_area';

System altered.

SQL> ALTER SYSTEM SET db_recovery_file_dest_size=4G;

System altered.
SQL> SHOW PARAMETER db_recovery;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest		     string	 /flash_recovery_area
db_recovery_file_dest_size	     big integer 4G
3. 设置闪回保留目标时间

该时间通过 DB_FLASHBACK_RETENTION_TARGET 实例参数来控制,单位是分钟,其默认值是 1 天。闪回日志空间以循环的方式重用,更新的数据将覆盖旧的数据。该参数指示 Oracle 在重写它之前保存闪回数据的分钟数:

SQL> SHOW PARAMETER db_flashback;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target	     integer	 1440
SQL> ALTER SYSTEM SET db_flashback_retention_target=240;

System altered.

SQL> SHOW PARAMETER db_flashback;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target	     integer	 240
4. 干净地关闭并加载数据库

SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP MOUNT;
ORACLE instance started.

Total System Global Area  626327552 bytes
Fixed Size		    2215944 bytes
Variable Size		  222302200 bytes
Database Buffers	  398458880 bytes
Redo Buffers		    3350528 bytes
Database mounted.

5. 启用闪回日志记录

在加载模式下执行

SQL> ALTER DATABASE FLASHBACK ON;

Database altered.

将启动 RVWR 进程并在 SGA 中分配闪回缓冲区,从现在起该进程启动将是自动的。

[oracle@jwlnx1 /]$ ps -ef | grep rvwr | grep -v grep
oracle   12555     1  0 09:39 ?        00:00:00 ora_rvwr_orcl11g

6. 打开数据库

SQL> ALTER DATABASE OPEN;

Database altered.

SQL> SELECT flashback_on FROM V$DATABASE;

FLASHBACK_ON
------------------
YES

从现在起将会启用从数据库缓冲区缓存到闪回缓冲区的数据块映像日志记录功能

监视闪回数据库

闪回保留时间只是一个目标时间,实际上并不保证闪回到其内的某个时间。相反,甚至可能闪回到该目标时间之外。可获得的闪回期限是每秒钟生成的闪回日志信息量和在使用更新的数据重写它们之前可工存储这些信息的空间量的一个函数。

确认是否启用闪回:

SQL> SELECT flashback_on FROM V$DATABASE;

FLASHBACK_ON
------------------
YES
为了监视当前的闪回能力并估计为满足目标时间闪回日志所需的空间,可查询 V$FLASHBACK_DATABASE_LOG 视图。

V$FLASHBACK_DATABASE_STAT 提供了一个有关数据文件、联机重做日志文件和闪回日志文件占用磁盘 I/O 比例的历史视图。

SQL> SELECT retention_target,flashback_size,oldest_flashback_time
  2  FROM v$flashback_database_log;

RETENTION_TARGET FLASHBACK_SIZE OLDEST_FLASHBACK_TIME
---------------- -------------- ---------------------
	     240	8192000 2013-09-02 09:39:38

SQL> SELECT end_time,flashback_data,db_data,redo_data
  2  FROM v$flashback_database_stat;

END_TIME	    FLASHBACK_DATA    DB_DATA  REDO_DATA
------------------- -------------- ---------- ----------
2013-09-02 10:38:14	   5693440    8650752	 3262976

闪回缓冲区的大小不受 DBA 控制,但是要查看当前的大小,可以查询 V$SGASTAT 视图:

SQL> SELECT * FROM v$sgastat WHERE NAME='flashback generation buff';

POOL	     NAME			     BYTES
------------ -------------------------- ----------
shared pool  flashback generation buff	   3981120

使用闪回数据库

使用闪回数据库有三种途径:SQL*Plus、RMAN 和 Database Control

不管选择使用哪种工具,方法都是相同的:

  1. 关闭数据库
  2. 加载数据库
  3. 闪回到某个时间点、SCN 或 日志切换序列号
  4. 使用 RESETLOGS 打开数据库

只要拥有需要的所有归档日志,闪回操作将能够完全自动地运行。

1. 使用 SQL*Plus 执行闪回

SQL*Plus 的闪回语法可以接受时间戳或系统变更号(SCN)参数,与 RMAN 不同的是,它不接受日期或日志切换序列号。

2. 使用 RMAN 执行闪回

在 RMAN 环境中,有三种选择:可以闪回到某个时间点、SCN 或 日志切换序列号

3. 使用 Database Control 执行闪回

采用 Database Control 的基于时间的闪回粒度只能是分钟,而 RMAN 可以闪回到秒,SQL*Plus 则可以闪回到时间戳 -- 它可以是 1 秒的百万分之一。

 配置闪回数据库

1. 作为用户 SYSTEM 使用 SQL*Plus 连接数据库。

2. 创建一个表并列出表内的行数:

SQL> CREATE TABLE test AS SELECT * FROM all_users;

Table created.

SQL> SELECT COUNT(*) FROM test;

  COUNT(*)
----------
	36

3. 记录当前的系统时间,并删除表中所有行。

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

Session altered.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2013-09-02 12:14:31

SQL> DELETE FROM test;

36 rows deleted.

SQL> COMMIT;

Commit complete.

4. 关闭数据库

SQL> SHUTDOWN ABORT;
ORACLE instance shut down.
5. 启动数据库至 MOUNT 模式

SQL> STARTUP MOUNT;
ORACLE instance started.

Total System Global Area  626327552 bytes
Fixed Size		    2215944 bytes
Variable Size		  222302200 bytes
Database Buffers	  398458880 bytes
Redo Buffers		    3350528 bytes
Database mounted.
6. 闪回数据库到过去某个时间点

SQL> FLASHBACK DATABASE TO TIMESTAMP
  2  TO_TIMESTAMP('2013-09-02 12:14:31','YYYY-MM-DD HH24:MI:SS');

Flashback complete.
7. 打开数据库

SQL> ALTER DATABASE OPEN RESETLOGS;

Database altered.
8. 检查删除的表

SQL> SELECT COUNT(*) FROM test;

  COUNT(*)
----------
	36
限制生成的闪回数据量

默认情况下,如果启用了闪回数据库,那么会记录所有表空间的闪回数据,可使用如下命令关闭表空间闪回属性:

ALTER TABLESPACE <tablespace_name> flashback off; -- 关闭表空间闪回属性

ALTER TABLESPACE <tablespace_name> flashback on; -- 开启表空间闪回属性

该命令只有当数据库处于加载模式时才能执行。

SELECT name,flashback_on FROM v$tablespace;

SQL> SELECT name,flashback_on FROM v$tablespace;

NAME			       FLA
------------------------------ ---
SYSTEM			       YES
SYSAUX			       YES
UNDOTBS1		       YES
USERS			       YES
TEMP			       YES
EXAMPLE 		       YES

6 rows selected.
如果一个或多个表空间不生成闪回数据,那么在执行闪回操作之前必须使构成表空间的文件脱机,然后闪回(包括隐式的恢复)可以正常进行。要记住 RECOVER 将忽略脱机数据文件 -- 这与 FLASHBACK 是相同的。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值