Ubuntu 上 Oracle 备份与恢复实用技巧
一 备份策略与准备
二 物理备份 RMAN 常用命令
sqlplus / as sysdba
ARCHIVE LOG LIST;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
rman target /
BACKUP DATABASE PLUS ARCHIVELOG;
-- 累积增量(自上次0级或1级以来变化)
BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;
-- 差异增量(自上次同级以来变化)
BACKUP DIFFERENTIAL LEVEL 1 DATABASE PLUS ARCHIVELOG;
BACKUP ARCHIVELOG ALL;
BACKUP CURRENT CONTROLFILE;
BACKUP SPFILE;
LIST BACKUP;
RESTORE DATABASE VALIDATE;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/plm_backup/physical_backup/%d_full_%s_%p_%t';
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
以上命令覆盖全量/增量/差异、归档日志、控制文件/SPFILE与校验/清单等核心场景。
三 物理恢复 RMAN 常用流程
rman target /
STARTUP MOUNT;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN;
-- 从自动备份恢复控制文件
STARTUP NOMOUNT;
RESTORE CONTROLFILE FROM AUTOBACKUP;
ALTER DATABASE MOUNT;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
-- 或指定备份文件
RESTORE CONTROLFILE FROM '/path/controlfile.bkp';
rman target /
SQL 'ALTER DATABASE DATAFILE ''/u01/app/oracle/oradata/ORCL/system01.dbf'' OFFLINE';
RESTORE DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf';
RECOVER DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf';
SQL 'ALTER DATABASE DATAFILE ''/u01/app/oracle/oradata/ORCL/system01.dbf'' ONLINE';
RESTORE ARCHIVELOG FROM '/backup/arch/';
SELECT COUNT(*) FROM dba_objects;
以上流程覆盖整库恢复、控制文件/SPFILE 恢复、单数据文件恢复与归档日志恢复等常见场景。
四 逻辑备份与恢复 Data Pump
mkdir -p /data/exp_dir
chmod 775 /data/exp_dir
chown oracle:oinstall /data/exp_dir
sqlplus / as sysdba
CREATE DIRECTORY dpump_dir AS '/data/exp_dir';
GRANT READ, WRITE ON DIRECTORY dpump_dir TO system;
expdp system/oracle@ORCL DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp LOGFILE=expdp_full.log FULL=Y PARALLEL=4
expdp system/oracle@ORCL DIRECTORY=dpump_dir DUMPFILE=scott.dmp LOGFILE=expdp_scott.log SCHEMAS=SCOTT
expdp system/oracle@ORCL DIRECTORY=dpump_dir DUMPFILE=emp.dmp LOGFILE=expdp_emp.log TABLES=SCOTT.EMP
impdp system/oracle@ORCL DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp LOGFILE=impdp_full.log FULL=Y PARALLEL=4
impdp system/oracle@ORCL DIRECTORY=dpump_dir DUMPFILE=scott.dmp LOGFILE=impdp_scott.log SCHEMAS=SCOTT REMAP_SCHEMA=SCOTT:SCOTT_NEW
impdp system/oracle@ORCL DIRECTORY=dpump_dir DUMPFILE=emp.dmp LOGFILE=impdp_emp.log TABLES=SCOTT.EMP REMAP_TABLESPACE=USERS:USERS_NEW
五 误删与时间点恢复技巧
-- 查询30分钟前的数据
SELECT * FROM scott.emp AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE);
-- 将库闪回到指定时间点
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2025-04-01 00:00:00','YYYY-MM-DD HH24:MI:SS');
ALTER DATABASE OPEN RESETLOGS;
-- 基本流程:添加日志文件、启动挖掘、查询 V$LOGMNR_CONTENTS
EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/app/oracle/fast_recovery_area/ORCL/archivelog/...', OPTIONS => DBMS_LOGMNR.NEW);
EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
SELECT * FROM V$LOGMNR_CONTENTS WHERE SEG_NAME='EMP' AND SEG_OWNER='SCOTT';
EXEC DBMS_LOGMNR.END_LOGMNR;
-- 场景:库无法启动但 SYSTEM 字典基本可用
unload dict
list user
list table scott
unload table scott.emp
以上方法覆盖行级回退、库级时间点回退与日志挖掘/文件级卸载等应急手段。