Oracle闪回技术之闪回数据库
前言:各种不同的闪回技术
Oracle有4种可提供使用的不同闪回技术,每种技术的实现采用不同的底层体系结构,并且能力和限制各异,但他们之间有重叠功能。使用任何一种闪回技术的原因通常是为了纠错-了解哪种闪回技术适用于纠正那些不同类型的错误是非常重要的。
- 闪回数据库
- 闪回查询、事务和表
- 闪回删除
- Flashback Data Archive
闪回数据库-概述
闪回数据库就像按下数据库上的倒带按钮,将当前数据库视为起始点,然后在时间上回退,逐步回退完成所有工作。最终的结果就行执行了不完整恢复:将丢失在闪回点之后的所有工作,并使用RESETLOGS打开数据库。值得注意的是,闪回数据库不能撤销物理损坏,而只能恢复用户错误造成的逻辑错误。如果遇到物理损坏或介质丢失,闪回数据库就无能为力-对此,必须使用传统的完整的恢复方法。闪回数据库是在用户操作错误后代替不完整恢复的一种手段-很可能是一种更灵活、更快捷的替换方法。
闪回数据库-体系
闪回数据库实际上是多个进程和数据结构的组合。首先,必须在SGA中分配一些内存(这是自动进行的-无法控制缓冲区大小)并在磁盘上分配一些空间来存储闪回数据,同时启动(Recovery Writer,RVWR)进程来支持闪回日志记录。此进程会将闪回缓冲区内容刷新到磁盘和闪回日志,注意,这没有改变向日志缓冲区写入更改的常规程序,LGWR会将日志缓冲区刷新到磁盘。闪回日志记录是此操作的附属物。与重做日志不同的是,闪回日志记录不是记录变化的日志,而是记录完整块映像的日志。闪回日志不同于重做日志,它不能多路复用和归档闪回日志,它们是自动创建和管理的。当执行闪回时,Oracle会使用闪回日志将数据库及时回退到期望的时间之前的某个时间点,然后按照不完整恢复中的常规方式应用重做日志(最大限度的使用归档重做日志文件和联机重做日志文件),以便将数据文件前滚到希望的确切时间。然后按照不完整恢复采用的相同方式,使用新前身/化身(incarnation)打开数据库。
闪回数据库要求是归档日志模式,并要使用 ALTER DATABASE OPEN RESETLOGS 来创建数据库的一个新前身/化身。如果数据库为非归档模式,那么归档日志数据流就不可用,则无法将应用闪回日志得到的不一致数据库版本转换到能够打开的一致数据库版本。既然闪回数据库要求使用归档日志模式,那么它相对于常规的不完整恢复的优势体现在哪里?那就是回滚数据库将更加方便和快捷。
不完整恢复总是耗时的,因为部分过程是完全还原。不完整恢复的时间在很大程度上与数据库的大小成正比。与此相反,数据库闪回所需的时间主要取决于需要撤销更改的数量。在任何的常规情况下,与数据库的总数据量相比,更改的数据量微不足道,因此闪回操作会快很多倍。
闪回数据库-配置(命令)
配置一个数据库以启用闪回数据库确实需要停机时间:只有在数据库处于加载模式下才能发出这样一条命令。为了配置闪回数据库请遵循以下步骤:
(1)确保数据库处于归档日志模式。归档日志模式是启用闪回数据库的先决条件,可通过查询V$DATABASE视图或ARCHIVE LOG LIST命令来确认。
(2)创建闪回恢复区。闪回恢复区是存放闪回日志的场所。除了设置闪回恢复区目录并限定其大小外,不能施加其它控制。可以使用两个实例参数来控制:DB_RECOVERY_FILE_DEST 和 DB_RECOVERY_FILE_DEST_SIZE,前者指定目录(下图目录为手工创建),后者指定最大空间量(单位是字节)。切记,闪回恢复区的用途不同于闪回日志,并且它需要正确地设定大小。例如:
(3)设置闪回保留目标时间。该时间通过DB_FLASHBACK_RETENTION_TARGET 实例参数来控制,单位是分钟,其默认值是1天。闪回日志空间以循环方式重用,更新的数据将覆盖旧数据。该参数指示Oracle在重新它之前保存闪回数据的分钟数。
上面更改的这个是目标时间(4小时),如果闪回恢复区的大小不足,则Oracle可能无法保存该目标。
(4)干净地关闭并加载数据库。
(5)启用闪回日志记录。数据库闪回状态是否启用可从 V$DATABASE 视图中查询。
闪回状态启用后,将启动RVWR进程并在SGA中分配闪回缓冲区。从现在起该进程的启动将是自动的。
(6)最后打开数据库。
从现在开始,会启用从数据缓冲区缓存到闪回缓冲区的数据块映像日志记录功能。
闪回数据库-配置(Database Control)
使用sys用户连接数据库;在数据库主页,选取Maintenance(可用性)选项卡,然后单击Backup/Recovery(备份恢复)部分中的Configure Recovery Settings(恢复设置)链接;在Flash Recovery Area(快速恢复)部分中,为闪回恢复区指定一个目录和最大尺寸,勾选Enable Flashback Database(启用闪回数据库)复选框,并指定闪回保留时间。最后保存重启。
闪回数据库-监视
闪回保留时间只是一个目标时间-实际上并不能保证闪回到其中的某个时间,相反,甚至可能闪回到该目标时间之外。闪回监视最基本的原则是确认确实启用了它:
为了监视当前闪回能力并估计为满足目标时间闪回日志所需的空间,可直接查询 V$FLASHBACK_DATABASE_LOG 视图。该视图将显示由 DB_FLASHBACK_RETENTION_TARGET 实例参数指定的保留目标时间的设置值(单位是分钟),默认值1天。(之前改为了4小时)然后显示闪回日志文件占用的实际空间和闪回日志可以将数据库回退到的确切时间。
视图V$FLASHBACK_DATABASE_STAT提供了一个有关数据文件、联机重做日志文件和闪回日志文件占用磁盘I/O比例的历史视图。显示为启用闪回数据库而付出的代价,计量单位是每小时必须的I/O字节数。在下面例子中,数据库每小时会产生大约7-11M不等的闪回数据,晚上数据量更大。这些数据量对性能的影响要与系统管理员进行沟通讨论,同时记住系统是否有I/O约束。为了比较,该视图还显示了与正常数据库活动有关的I/O。该视图每小时显示一行数据。
注意:闪回缓冲区大小不受DBA控制,如果要查看它的大小,可通过查询V$SGASTAT视图:
闪��数据库-使用(实操)
使用闪回数据库的三种途径:SQL*Plus、RMAN 和 Database Control (不管选择那种工具方法都是相同的)
- 关闭数据库
- 加载数据库
- 闪回到某个时间点、SCN或日志切换序列号
- 使用RESETLOGS打开数据库
只要有所需的归档日志,闪回操作将能够完全自动运行。
- 使用SQL*Plus执行闪回操作
SQL*Plus的闪回语法可接受时间戳或系统变更号(SCN)参数-与RMAN不同的是,它不接受日期或日志切换序列号。
如果不确定需要回退的确切时间,可以结合闪回和恢复多尝试几次。考虑以下应用场景:
在2016年08月13日早上10:56分左右,一名DBA因误操作删除主营业务数据库上一个重要的模式,在10分钟内发现了该错误。第一步关闭数据库:
使用其它任何类型的关闭是毫无意义的-无论怎样都会丢失正在进行的所有工作,并且需要最小化停机时间。然后将数据库回退到10:52,如下所示:
注意,与 RECOVER DATABASE UNTIL TIME 不同的是改命令对时间戳格式的 NLS 设置很敏感。当在 READ ONLY 模式下时,可以针对删除的模式进行查询。如果发现该模式仍可用,那么或许能够恢复更多一些用户数据:
重新运行查询,发现在56分的数据又不见了:它必定是在52分到56分之间出的问题。尝试回退到55分:
如果发现模式还不可用,就往前闪回几秒。如果发现模式可用,就往后执行几秒的恢复,最大限度的靠近事发时间点。
可以重复执行闪回和恢复命令,直至找到希望的时间点,在此期间通过在只读模式下运行查询来测试。当找到满意的时间点时,执行最后一次数据库关闭并使用 RESETLOGS 打开来创建数据库第一个新前身/化身,最后就可以打开并正常使用数据库了。
这种方法可以最小化数据损失,并且仅花费几分钟。不完整恢复则可能会花费几个小时,尤其是需要多次尝试才能找到正确的时间点。
闪回数据库-限制闪回数据量
Oracle限制写到闪回日志中的数据量的算法是精心设计的,以便尽量减小对性能的影响。在一些环境中,可能发现生成的闪回数据量过大,可以在闪回日志中不记录表空间,但这样恢复过程复杂些。
默认情况下,如果启用的闪回数据库,那么会记录所有表空间的闪回数据,但可用下面命令关闭表空间闪回属性:
为了查看闪回状态,V$TABLESPACE视图中提供这样一个列:
该信息显示在一个动态性能视图中,而非数据字典视图 DBA_TABLESPACES 中,因为是通过控制文件而非数据字典启用闪回功能的。
使用如下命令重新开启:
注意,该命令只有数据库处于加载模式的时候才能执行
如果一个或多个表空间不生成闪回数据,那么在执行闪回操作之前必须使构成表空间的文件脱机。然后闪回才可以正常进行。要记住 RECOVER 将忽略脱机数据文件-这与 FLASHBACK 是相同的。
/*摘抄总结于《认证考试指南全册》*/