Debian 上 Oracle 备份与恢复实战指南
一 备份方式总览
二 RMAN 物理备份与恢复步骤
rman target /
RUN {
ALLOCATE CHANNEL c1 TYPE DISK;
ALLOCATE CHANNEL c2 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG DELETE INPUT;
BACKUP CURRENT CONTROLFILE FORMAT '/backup/rman/ctl_%d_%T_%U.bkp';
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
}
rman target /
STARTUP NOMOUNT;
RESTORE CONTROLFILE FROM '/backup/rman/ctl_ORCL_20250325_...bak';
ALTER DATABASE MOUNT;
CATALOG START WITH '/backup/rman/'; -- 让RMAN识别新备份片
RUN {
SET UNTIL TIME '2025-03-25 10:00:00';
RESTORE DATABASE;
RECOVER DATABASE;
}
ALTER DATABASE OPEN RESETLOGS;
rman target /
STARTUP NOMOUNT;
RESTORE CONTROLFILE FROM '/backup/rman/ctl_ORCL_20250325_...bak';
ALTER DATABASE MOUNT;
CATALOG START WITH '/backup/rman/';
RUN {
SET NEWNAME FOR DATABASE TO '/u01/app/oracle/oradata/NEWORCL/%U';
RESTORE DATABASE;
SWITCH DATAFILE ALL;
SWITCH TEMPFILE ALL;
RECOVER DATABASE;
}
-- 如日志文件路径变化,执行重命名
ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/ORCL/redo01.log'
TO '/u01/app/oracle/oradata/NEWORCL/redo01.log';
ALTER DATABASE OPEN RESETLOGS;
三 Data Pump 逻辑备份与恢复步骤
# 1) 创建目录对象(在数据库中)
sqlplus / as sysdba
CREATE OR REPLACE DIRECTORY backup_dir AS '/backup/dp';
GRANT READ, WRITE ON DIRECTORY backup_dir TO system;
# 2) 导出全库
expdp system/password@ORCL DIRECTORY=backup_dir \
DUMPFILE=full_$(date +%F).dmp LOGFILE=full_$(date +%F).log FULL=Y
# 1) 目标库创建同名目录对象
sqlplus / as sysdba
CREATE OR REPLACE DIRECTORY restore_dir AS '/backup/dp';
GRANT READ, WRITE ON DIRECTORY restore_dir TO system;
# 2) 导入全库(可按需加 REMAP_SCHEMA、REMAP_TABLESPACE 等)
impdp system/password@ORCL DIRECTORY=restore_dir \
DUMPFILE=full_2025-03-25.dmp LOGFILE=imp_$(date +%F).log FULL=Y
四 备份策略与自动化
# /u01/scripts/rman_full.sh
#!/bin/bash
. /home/oracle/.bash_profile
export ORACLE_SID=ORCL
BACKUP_DIR=/backup/rman
LOG_DIR=/u01/backup_log
DT=$(date +%F_%H%M)
mkdir -p $BACKUP_DIR $LOG_DIR
$ORACLE_HOME/bin/rman target / log $LOG_DIR/rman_full_${ORCL}_${DT}.log <<'EOF'
RUN {
ALLOCATE CHANNEL c1 TYPE DISK;
ALLOCATE CHANNEL c2 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG DELETE INPUT;
BACKUP CURRENT CONTROLFILE FORMAT '${BACKUP_DIR}/ctl_%d_%T_%U.bkp';
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
}
EOF
# 清理7天前日志
find $LOG_DIR -name "RMAN*.log" -mtime +7 -delete
# 定时任务
# crontab -e
0 2 * * * /u01/scripts/rman_full.sh
五 常见问题与排错要点