Linux Oracle备份如何恢复
小樊
36
2025-12-24 09:58:00
Linux 上 Oracle 备份恢复实操指南
一 恢复方式概览
RMAN 物理恢复 :用于恢复数据文件、控制文件、归档日志、SPFILE ,支持整库、表空间、数据文件 级别恢复,可做时间点恢复 与异机恢复 ,适合生产环境。
Data Pump 逻辑恢复 :使用 expdp/impdp 导入用户、模式、表、表空间或全库 ,适合迁移、部分对象恢复、跨平台/跨版本 场景。
冷备份 :停库后拷贝数据文件、控制文件、联机重做日志、参数文件 ,再按原路径或新路径恢复,操作简单但停机时间长 。
二 RMAN 物理恢复步骤
准备
确认备份可用(含数据文件、归档日志、控制文件、SPFILE ),安装同版本 Oracle 软件,创建必要目录,设置环境变量:ORACLE_SID、ORACLE_HOME、PATH 。
异机或路径变更恢复
从 SPFILE 或 PFILE 启动到 NOMOUNT :SQL> startup nomount(如使用 PFILE:startup pfile=‘/u01/app/oracle/product/…/dbs/initORCL.ora’)。
恢复控制文件:RMAN> restore controlfile from ‘/backup/ctl_ORCL_20200311_19_1.bak’;
装载数据库:RMAN> alter database mount;
编目备份文件:RMAN> catalog start with ‘/u01/app/oracle/backup’;
设置新路径并重命名数据文件/临时文件(示例):
RMAN> run { set newname for database to ‘/u01/app/oracle/oradata/DEMO/%U’; restore database; switch datafile all; switch tempfile all; }
恢复数据库:RMAN> recover database;
若恢复到不同目录/实例 ,重命名在线重做日志:
SQL> alter database rename file ‘/u01/app/oracle/oradata/ORCL/redo01.log’ to ‘/u01/app/oracle/oradata/DEMO/redo01.log’;(对 redo02/redo03 同理)
必要时清空日志组:SQL> alter database clear logfile group 1;(对 group 2/3 同理)
打开数据库:SQL> alter database open resetlogs;
时间点恢复(不完全恢复)
RMAN> run { restore database; recover database until time “to_date(‘2025-12-24 10:00:00’,‘yyyy-mm-dd hh24:mi:ss’)”; }
SQL> alter database open resetlogs;
仅恢复部分对象
表空间:RMAN> restore tablespace users; RMAN> recover tablespace users; SQL> alter tablespace users online;
数据文件:RMAN> restore datafile ‘/u01/…/users01.dbf’; RMAN> recover datafile ‘/u01/…/users01.dbf’; SQL> alter database datafile ‘/u01/…/users01.dbf’ online;
常用备份命令(用于确认你手头备份是否齐全)
RMAN> backup database plus archivelog;
RMAN> backup current controlfile;
RMAN> backup spfile;
三 Data Pump 逻辑恢复步骤
准备
在目标库创建 Directory 对象 并赋权:
SQL> create or replace directory backup_dir as ‘/opt/oracle/bak_dir’;
SQL> grant read,write on directory backup_dir to system;
将 .dmp 文件上传至该目录,并修正属主:chown -R oracle:oinstall /opt/oracle/bak_dir
全库导入
impdp system/password@SID directory=backup_dir dumpfile=full_20241224.dmp logfile=impdp_full.log full=y
按模式/表导入
模式:impdp system/password@SID directory=backup_dir dumpfile=schema.dmp logfile=impdp_schema.log schemas=SCOTT
表:impdp system/password@SID directory=backup_dir dumpfile=tab.dmp logfile=impdp_tab.log tables=SCOTT.EMP,SCOTT.DEPT
常用选项
table_exists_action=replace/truncate/skip(已存在对象的处理策略)
若导入时触发器导致业务冲突,可先禁用再启用:
alter table SCHEMA.TAB disable all triggers; … impdp … ; alter table SCHEMA.TAB enable all triggers;
四 常见问题与要点
归档模式 :RMAN 热备/时间点恢复通常要求数据库处于ARCHIVELOG 模式;必要时先 shutdown immediate → startup mount → alter database archivelog → alter database open。
路径变更 :异机恢复务必使用 set newname/switch datafile/switch tempfile ,并在打开前 rename file 重做日志到新位置。
resetlogs :不完全恢复或异机恢复后使用 alter database open resetlogs 打开,之后尽快做一次全备 。
备份完整性 :定期做 catalog start with 编目、校验与恢复演练,确保备份可用。
权限与目录 :Data Pump 需正确创建 Directory 并赋权,导入前确认 .dmp 文件权限与属主正确。
五 快速命令清单
RMAN 整库恢复(异机示例)
startup nomount → restore controlfile from ‘/backup/ctl.bak’; → alter database mount; → catalog start with ‘/backup’; → run { set newname for database to ‘/u01/app/oracle/oradata/NEW/%U’; restore database; switch datafile all; switch tempfile all; } → recover database; → alter database rename file … → alter database open resetlogs;
RMAN 时间点恢复
run { restore database; recover database until time “to_date(‘2025-12-24 10:00:00’,‘yyyy-mm-dd hh24:mi:ss’)”; } → alter database open resetlogs;
Data Pump 全库导入
create or replace directory backup_dir as ‘/opt/oracle/bak_dir’; grant read,write on directory backup_dir to system; impdp system/password@SID directory=backup_dir dumpfile=full.dmp logfile=impdp.log full=y;