30-Oracle 23ai-回顾从前的Flashback设置
配置和测试了Oracle 23 ai的Flashback Log Placement后,
刚好身边11g,19c的环境都在,还是把从前的flashback整理下,温故知新,循序渐进。
一、闪回技术
Flashback Database 允许将整个数据库回退到过去的某个时间点/SCN,基于以下核心机制:
闪回日志 (Flashback Logs)
- 专用后台进程 RVWR 记录数据块在修改前的完整镜像。
- 存储位置:闪回恢复区(DB_RECOVERY_FILE_DEST)。
- 不同于重做日志:重做日志记录变化量,闪回日志记录完整块。
- 循环覆盖写入,空间不足时自动删除旧日志。如果空间不足,即使设置保留时间也会被删除。
闪回恢复区 (Flash Recovery Area)
- 集中管理闪回日志、归档日志、RMAN 备份。
- 需配置路径 (DB_RECOVERY_FILE_DEST) 和大小 (DB_RECOVERY_FILE_DEST_SIZE)。
- 由 DB_FLASHBACK_RETENTION_TARGET 控制(单位:分钟),默认 1440 分钟(1天)。
闪回分级:闪回技术用于快速恢复人为误操作等逻辑错误,分为多种级别:
-
- 数据库级,慎重-闪回数据库会丢失目标时间点后的所有数据变更
- 表级别闪回
- 事务级别闪回
- 闪回查询(不修改数据)
特性:
- 本质:将数据库回退到历史时间点,闪回点之后的所有数据变更将丢失。
- RESETLOGS: 闪回后必须使用 ALTER DATABASE OPEN RESETLOGS;,从此(生成新分身)。
- 依赖闪回日志: 核心机制依赖于闪回日志(Flashback Log),依赖闪回日志(存储数据块完整映像)。
- 前提条件: 数据库必须处于归档模式且配置了闪回恢复区。
- 快速恢复:比传统时间点恢复更快(直接应用闪回日志)。
四、开启Flashback
开启归档模式:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;-- 1. 设置闪回恢复区
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/u01/app/oracle/flash_recovery_area' SCOPE=BOTH;
-- 根据磁盘空间调整
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 50G SCOPE=BOTH;-- 2. 设置闪回保留时间(默认 1440 分钟)
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440;-- 3. 启用闪回(MOUNT 状态下执行)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;-- 4. 验证状态
SELECT LOG_MODE, FLASHBACK_ON FROM V$DATABASE;
LOG_MODE FLASHBACK_ON
_____________ _______________
ARCHIVELOG YES
五、数据库、表、行、事务、闪回的脚本
1)、数据库级闪回 (FLASHBACK DATABASE)
1. 基于时间点闪回
-- 步骤1: 强制日志切换并记录当前时间点
ALTER SYSTEM ARCHIVE LOG CURRENT;
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT SYSTIMESTAMP AS current_time FROM DUAL; -- 记录此时间-- 步骤2: 关闭并挂载数据库
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;-- 步骤3: 执行闪回 (RMAN环境)
RMAN> RUN {SET UNTIL TIME "TO_DATE('2025-06-13 14:30:00', 'YYYY-MM-DD HH24:MI:SS')";FLASHBACK DATABASE;ALTER DATABASE OPEN RESETLOGS;
}
2. 基于 SCN 闪回
-- 获取当前SCN并记录,示例: 7654321
SELECT CURRENT_SCN FROM V$DATABASE;-- 执行闪回 (SQL*Plus)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO SCN 7654321;
ALTER DATABASE OPEN RESETLOGS;
3. 基于还原点闪回
-- 创建担保还原点
CREATE RESTORE POINT b_migration GUARANTEE FLASHBACK DATABASE;-- 执行闪回
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO RESTORE POINT b_migration;
ALTER DATABASE OPEN RESETLOGS;
2)、表级闪回 (FLASHBACK TABLE)
1. 恢复误删表
-- 查看回收站
SELECT object_name, original_name, droptime
FROM user_recyclebin
WHERE original_name = 'test_EMP';-- 恢复表到删除前状态
FLASHBACK TABLE test_EMP TO BEFORE DROP;-- 重命名恢复的表
FLASHBACK TABLE "BIN$skjdsf93jksdf$" TO BEFORE DROP RENAME TO test_EMP_recovered;
2. 回滚表数据到指定时间点
-- 启用行移动
ALTER TABLE test_ORDERS ENABLE ROW MOVEMENT;-- 闪回到特定时间
FLASHBACK TABLE test_ORDERS TO TIMESTAMP TO_TIMESTAMP('2025-06-13 09:00:00', 'YYYY-MM-DD HH24:MI:SS');-- 验证数据
SELECT COUNT(*) FROM test_ORDERS AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
3. 恢复表到指定SCN
-- 获取当前SCN
SELECT CURRENT_SCN FROM V$DATABASE; -- 示例: 2345678-- 执行闪回
FLASHBACK TABLE test_ORDERS TO SCN 2345678;
3)、行级闪回 (FLASHBACK QUERY)
1. 查询历史数据
-- 查询1小时前的数据
SELECT * FROM test_EMP
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE)
WHERE department_id = 50;-- 查询特定SCN的数据
SELECT * FROM test_EMP
AS OF SCN 1234567
WHERE employee_id = 100;
2. 恢复误删数据
-- 恢复1小时内删除的数据
INSERT INTO test_EMP
SELECT * FROM test_EMP
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR)
WHERE employee_id NOT IN (SELECT employee_id FROM test_EMP
);
3. 恢复误更新数据
-- 恢复被误更新的薪资
UPDATE test_EMP e
SET salary = (SELECT salary FROM test_EMP AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE)WHERE employee_id = e.employee_id
)
WHERE department_id = 60;
4)、事务级闪回 (FLASHBACK TRANSACTION)
1. 查询事务历史
-- 查找最近2小时的事务
SELECT xid, start_scn, commit_scn, operation, table_name
FROM flashback_transaction_query
WHERE TABLE_NAME = 'test_ORDERS'
AND START_TIMESTAMP > SYSTIMESTAMP - INTERVAL '120' MINUTE
ORDER BY start_scn DESC;
2. 撤销特定事务
BEGINDBMS_FLASHBACK.TRANSACTION_BACKOUT(numtxns => 1,txnnames => SYS.ANYDATA.MAKEVARCHAR2('08000F00A8030000'), -- 替换为实际XIDoptions => DBMS_FLASHBACK.CASCADE);
END;
/
3. 增补SQL
SELECT undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('08000F00A8030000');
六、RMAN 空间竞争与清理脚本
闪回恢复区存储:
- 闪回日志
- 归档日志
- RMAN 备份空间不足时会导致数据库挂起(ORA-19815 告警)。
空间清理策略
- 自动清理Oracle 会在空间不足时按以下顺序删除:
- 过期的 RMAN 备份
- 已备份到磁带的归档日志
- 早于 DB_FLASHBACK_RETENTION_TARGET 的闪回日志。
手动强制清理
#!/bin/bash
export ORACLE_SID=your_sid
export ORACLE_HOME=/u01/app/oracle/product/19.3/dbhome_1# 使用 RMAN 删除过期备份和归档
--可以将命令在sqlplus单独执行
rman target / << EOF
CROSSCHECK BACKUP; -- 校验备份有效性
DELETE NOPROMPT OBSOLETE; -- 删除过期的备份
--脚本中的 SYSDATE-7 可根据需求调整归档保留天数。
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
EXIT;
EOF# 释放操作系统空间(清理残留文件)定期执行(如每天)避免空间不足。
find ${ORACLE_BASE}/flash_recovery_area -name "*.bak" -mtime +7 -exec rm {} \;
七、监控与优化建议
-- 闪回恢复区使用情况
SELECT * FROM V$RECOVERY_FILE_DEST; -- 空间占用明细(按文件类型)
SELECT FILE_TYPE, PERCENT_SPACE_USED, PERCENT_SPACE_RECLAIMABLE
FROM V$FLASH_RECOVERY_AREA_USAGE;-- 减少闪回保留时间(按需)调整保留策略
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=720; -- 12小时-- 停止记录 users 表空间的闪回日志排除非关键表空间
ALTER TABLESPACE users FLASHBACK OFF;-- 扩容至100GB扩展闪回恢复区
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=100G;
TIPS:
- Flashback Database 是应对逻辑错误的利器,但依赖闪回恢复区。
- 定期清理归档和备份是避免空间竞争的关键(结合 RMAN 和cron脚本)。
- 经常监控 V$FLASH_RECOVERY_AREA_USAGE,巡检第一位。