在 Linux + Oracle 环境下,“误删”可能指多种情况,恢复方式差别很大。下面按常见场景分别说明,你可以对号入座。
✅ 最佳方案:闪回(Flashback)
-- 查看过去某时间点的数据
SELECT * FROM table_name
AS OF TIMESTAMP TO_TIMESTAMP('2024-01-01 10:00:00','YYYY-MM-DD HH24:MI:SS');
-- 恢复
INSERT INTO table_name
SELECT * FROM table_name
AS OF TIMESTAMP TO_TIMESTAMP('2024-01-01 10:00:00','YYYY-MM-DD HH24:MI:SS');
⚠️ 条件:
undo_retention✅ 闪回表(Flashback Table)
FLASHBACK TABLE table_name TO TIMESTAMP
TO_TIMESTAMP('2024-01-01 10:00:00','YYYY-MM-DD HH24:MI:SS');
⚠️ 需要:
ALTER TABLE table_name ENABLE ROW MOVEMENT;
✅ 回收站恢复
-- 查看回收站
SELECT * FROM user_recyclebin;
-- 恢复
FLASHBACK TABLE table_name TO BEFORE DROP;
✅ 使用 RMAN 恢复
rman target /
RUN {
SET UNTIL TIME "TO_DATE('2024-01-01 10:00:00','YYYY-MM-DD HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
}
⚠️ 通常需要:
✅ 从 RMAN 恢复
RESTORE DATAFILE '/u01/oradata/orcl/users01.dbf';
RECOVER DATAFILE '/u01/oradata/orcl/users01.dbf';
✅ Linux 进程未释放,可抢救
ls -l /proc/$ORACLE_PID/fd | grep deleted
复制文件:
cp /proc/$PID/fd/xxx /u01/oradata/orcl/users01.dbf
然后:
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf' ONLINE;
✅ 从备份恢复:
RESTORE CONTROLFILE FROM '/backup/ctl.bak';
RECOVER DATABASE;
或如果有镜像:
ALTER DATABASE MOUNT;
ALTER DATABASE RECOVER;
✅ 只能:
impdp system/pwd DIRECTORY=dp_dir DUMPFILE=schema.dmp
extundeletetestdiskphotorecextundelete /dev/sdb1 --restore-all
✅ 开启闪回
ALTER DATABASE FLASHBACK ON;
✅ 定期 RMAN 备份
BACKUP DATABASE PLUS ARCHIVELOG;
✅ 逻辑备份
expdp system/pwd FULL=y DIRECTORY=dp_dir DUMPFILE=full.dmp
✅ Linux 使用别名防误删
alias rm='rm -i'
| 误删内容 | 恢复方式 |
|---|---|
| DELETE | 闪回查询 |
| TRUNCATE | FLASHBACK TABLE |
| DROP TABLE | 回收站 |
| 数据文件 | RMAN / proc fd |
| 控制文件 | RMAN |
| 无备份 | 很难恢复 |
如果你能告诉我:
我可以给你精确到命令级别的恢复方案。