Oracle 闪回技术可将恢复时间从数小时缩短至数分钟。
任何预防措施都无法避免人为失误的发生。Oracle数据库闪回技术是一组独特而丰富的数据恢复解决方案,能够有选择性地高效撤销一个错误的影响,从人为错误中恢复。在采用闪回技术之前,损坏数据库只需数分钟,而要恢复它则需要数小时。有了闪回技术,纠正错误只需要数分钟的时间。此外,从错误中恢复所需的时间与数据库大小无关,这是Oracle 数据库独有的功能。闪回技术支持在所有层面上进行恢复,包括行、事务、表和整个数据库。
闪回功能的前提
打开闪回功能
-- 需要先把数据库切到Mount模式
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG
ALTER DATABASE FLASHBACK ON
ALTER DATABASE OPEN
-- 对于多租户PDB,打开数据库操作
SHOW PDBS
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ORCLPDB1 OPEN;
-- 闪回功能状态查询
SELECT flashback_on FROM v$database;- 配置闪回区: 确保
db_recovery_file_dest和db_flashback_retention_target设置合理(例如保留 24 小时) - 其他相关的配置项目可参考官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/21/refrn/DB_RECOVERY_FILE_DEST.html
开启表回收站
ALTER SYSTEM SET RECYCLEBIN = ON SCOPE=BOTH;
-- SCOPE 指定操作的配置文件的类型,可以是MEMORY、SPFILE、BOTH。
-- 查看当前回收站配置
SHOW PARAMETER recyclebin;
-- 查看回收站中的对象
SELECT * FROM DBA_RECYCLEBIN;
-- 类似的,用户回收站视图
SELECT * FROM USER_RECYCLEBIN
-- 恢复回收站中的对象
FLASHBACK TABLE table_name TO BEFORE DROP;
-- 清空回收站
PURGE DBA_RECYCLEBIN;
-- 类似的
PURGE RECYCLEBIN;
-- 删除回收站中的特定对象
PURGE TABLE table_name;- 特别注意,该功能对 SYS 用户和 SYSTEM 表空间无效。
闪回操作选择与常见场景
闪回查询
核对历史数据,想看看误删前的数据长什么样。或审计需要。
-- 查询 1 小时前的数据
SELECT * FROM schema.表名 AS OF TIMESTAMP (SYSDATE - 1/24);
-- 或者查询两个 SCN 之间的版本变化
SELECT * FROM schema.表名 VERSIONS BETWEEN SCN 1000 AND 2000;闪回删除
就像 Windows 的回收站功能。当执行 DROP TABLE 时,Oracle 默认会将其重命名放入回收站。
-- 1. 查看回收站里的表(原表名已变更为BIN$开头)
SHOW RECYCLEBIN;
-- 2. 执行闪回(恢复原名)
FLASHBACK TABLE schema.表名 TO BEFORE DROP;
-- 3. 如果有重名冲突,恢复并重命名
FLASHBACK TABLE schema.表名 TO BEFORE DROP RENAME TO 表名_old;闪回表
针对错误的 DELETE/UPDATE,由于数据库原理原因,需要打开行移动功能。
-- 0. 开启行移动(必须步骤)
ALTER TABLE schema.表名 ENABLE ROW MOVEMENT;
-- 1. 闪回到 10 分钟前
FLASHBACK TABLE schema.表名 TO TIMESTAMP (SYSDATE - 10/1440);
-- 2. 或者闪回到具体的 SCN
FLASHBACK TABLE schema.表名 TO SCN 12345678;
-- 3. 恢复完成后,建议关闭行移动(除非业务需要)
ALTER TABLE schema.表名 DISABLE ROW MOVEMENT;闪回数据库
针对一些无法挽回的重大错误,需要关闭数据库
-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;
-- 2. 启动到 Mount 状态(不要 Open)
STARTUP MOUNT;
-- 3. 执行闪回(例如闪回到昨天 10:00)
FLASHBACK DATABASE TO TIMESTAMP TO_DATE('2023-10-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- 4. 打开数据库(必须使用 resetlogs,这会重置日志序列)
ALTER DATABASE OPEN RESETLOGS;
-- 这是因为闪回后,REDO、UNDO相关日志编号有可能会大于闪回点的日志编号。
-- 不进行该操作可能导致闪回失败(REDO重新生效、或报错拒绝启动)常见错误
- ORA-08189:需要启动行移动
- ORA-38754:需要启用闪回功能
闪回功能的内部实现机制
关键概念澄清:
- SCN:System Change Number 系统变更号
- CKPT:CHECK POINT 检查点
- DBWn:DB Writer 数据库写入进程
- LGWR:Log Writer 日志写入进程(Redo、Undo)
所有对数据库的变更都会触发记录下不同的SCN,包括一般业务读写、数据库DDL变更、Redo块写满创建新块操作等。在集群环境下,多节点之间的协调也会触发SCN增量。可以这么理解,SCN如实记录了数据库层面所有变更。
CKPT一般包含多个SCN,但CKPT只是触发DBWn将脏数据块做落盘操作。但数据库实际上存储的是数据块 + 日志。为了保证操作可以被安全地撤销,因此,日志的写入需要先于CKPT触发DBWn。
在理清上述数据库写入逻辑之后,不难理解。闪回功能的核心在于SCN。只要确定了SCN编号,就能确定数据库操作在逻辑上的时序。
闪回还原点的区别
有两种闪回还原点,Normal(普通)和Guarantee(保证)。他们启用后都会占用FRA区。FRA区主要存储的是数据变更时的前快照。
根据资料,对于(a->b),(b->c)的变更,可能存储了2份前快照,分别是a和b。从逻辑上来讲,只用存a就行了,但从性能角度,不做判断,直接多存一份b在高并发情况下效率显然更高。
Guarantee点启用后,若FRA区满了,则导致会导致数据库进入挂起不可用的状态。
Normal点启用后,若FRA满了,则该Normal点就会失效
-- 创建一个名为 'BEFORE_UPGRADE' 的普通还原点
CREATE RESTORE POINT BEFORE_UPGRADE;
-- 创建一个名为 'GUARANTEED_BACKUP' 的保证还原点
CREATE RESTORE POINT GUARANTEED_BACKUP GUARANTEE FLASHBACK DATABASE;
-- 查看所有还原点及其类型(是否保证)
SELECT NAME, SCN, TIME, DATABASE_INCARNATION#, GUARANTEE_FLASHBACK_DATABASE
FROM V$RESTORE_POINT;
-- 删除还原点(如果是保证还原点,删除后其占用的闪回日志会被自动清理)
DROP RESTORE POINT GUARANTEED_BACKUP; 本文标题:ORACLE 闪回功能学习备忘
本文连接:https://blog.dextercai.com/archives/238.html
除另行说明,本站文字内容采用创作共用版权 CC-BY-NC-ND 4.0 许可协议,版权归本人所有。
除另行说明,本站图片内容版权归本人所有,未经许可前,严禁以任何形式的使用。
即日起视情况关闭全站评论区,您可以通过关于页面的电邮地址和我取得联系,谢谢