网站建设的威胁如何进行网站制作
配置和测试了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,巡检第一位。
 
