Linux环境下Oracle备份实操指南
一 备份方式总览
二 RMAN物理备份与自动化
rman target /
RUN {
ALLOCATE CHANNEL c1 TYPE DISK;
ALLOCATE CHANNEL c2 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET DATABASE FORMAT '/backup/rman/full_%d_%T_%s_%p.BKP' TAG 'FULL_L0';
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL FORMAT '/backup/rman/arch_%d_%T_%s_%p.BKP' DELETE INPUT;
BACKUP CURRENT CONTROLFILE FORMAT '/backup/rman/ctl_%d_%T_%s_%p.CTL';
BACKUP SPFILE FORMAT '/backup/rman/spfile_%d_%T_%s_%p.SPF';
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
}
rman target /
RUN {
ALLOCATE CHANNEL c1 TYPE DISK;
ALLOCATE CHANNEL c2 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 1 DATABASE FORMAT '/backup/rman/incr_l1_%d_%T_%s_%p.BKP' TAG 'INC_L1';
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL FORMAT '/backup/rman/arch_%d_%T_%s_%p.BKP' DELETE INPUT;
BACKUP CURRENT CONTROLFILE FORMAT '/backup/rman/ctl_%d_%T_%s_%p.CTL';
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
}
rman target /
RUN {
CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
DELETE NOPROMPT OBSOLETE;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-1';
}
#!/bin/bash
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
BACKUP_DIR=/backup/rman
LOG_DIR=$BACKUP_DIR/logs
mkdir -p $LOG_DIR
TS=$(date +%F_%H%M%S)
if [ $(date +%u) -eq 7 ]; then
# Level 0
$ORACLE_HOME/bin/rman target / log=$LOG_DIR/rman_l0_$TS.log <<'EOF'
RUN {
ALLOCATE CHANNEL c1 TYPE DISK;
ALLOCATE CHANNEL c2 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 0 DATABASE FORMAT '${BACKUP_DIR}/full_l0_%d_%T_%s_%p.BKP' TAG 'FULL_L0';
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL FORMAT '${BACKUP_DIR}/arch_%d_%T_%s_%p.BKP' DELETE INPUT;
BACKUP CURRENT CONTROLFILE FORMAT '${BACKUP_DIR}/ctl_%d_%T_%s_%p.CTL';
BACKUP SPFILE FORMAT '${BACKUP_DIR}/spfile_%d_%T_%s_%p.SPF';
RELEASE CHANNEL c1; RELEASE CHANNEL c2;
}
EOF
else
# Level 1
$ORACLE_HOME/bin/rman target / log=$LOG_DIR/rman_l1_$TS.log <<'EOF'
RUN {
ALLOCATE CHANNEL c1 TYPE DISK;
ALLOCATE CHANNEL c2 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 1 DATABASE FORMAT '${BACKUP_DIR}/incr_l1_%d_%T_%s_%p.BKP' TAG 'INC_L1';
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL FORMAT '${BACKUP_DIR}/arch_%d_%T_%s_%p.BKP' DELETE INPUT;
BACKUP CURRENT CONTROLFILE FORMAT '${BACKUP_DIR}/ctl_%d_%T_%s_%p.CTL';
RELEASE CHANNEL c1; RELEASE CHANNEL c2;
}
EOF
fi
# 清理15天前日志
find $LOG_DIR -name "rman_*.log" -mtime +15 -delete
crontab -e
# 每周日 02:00 全量
0 2 * * 0 /home/oracle/scripts/rman_backup.sh
# 每日 02:00 增量
0 2 * * 1-6 /home/oracle/scripts/rman_backup.sh
三 Data Pump逻辑备份与自动化
sqlplus / as sysdba
CREATE OR REPLACE DIRECTORY dpump AS '/backup/dpump';
GRANT READ, WRITE ON DIRECTORY dpump TO system;
EXIT
expdp system/password@orcl DIRECTORY=dpump DUMPFILE=full_%U.dmp LOGFILE=full_$(date +%F).log FULL=Y PARALLEL=4
expdp system/password@orcl DIRECTORY=dpump DUMPFILE=scott_%U.dmp LOGFILE=scott_$(date +%F).log SCHEMAS=SCOTT PARALLEL=2
impdp system/password@orcl DIRECTORY=dpump DUMPFILE=full_01.dmp LOGFILE=imp_full_$(date +%F).log FULL=Y
impdp system/password@orcl DIRECTORY=dpump DUMPFILE=scott.dmp LOGFILE=imp_scott.log \
REMAP_SCHEMA=SCOTT:SCOTT_NEW TABLE_EXISTS_ACTION=TRUNCATE
#!/bin/bash
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
DP_DIR=/backup/dpump
TS=$(date +%F_%H%M%S)
USER=SCOTT
mkdir -p $DP_DIR
$ORACLE_HOME/bin/expdp $USER/password@orcl DIRECTORY=dpump \
DUMPFILE=${USER}_${TS}.dmp LOGFILE=${USER}_${TS}.log SCHEMAS=$USER PARALLEL=2
# 清理7天前
find $DP_DIR -name "${USER}_*.dmp" -mtime +7 -delete
find $DP_DIR -name "${USER}_*.log" -mtime +7 -delete
crontab -e
0 22 * * * /home/oracle/scripts/dpump_backup.sh
四 恢复要点与快速命令
rman target /
STARTUP NOMOUNT;
RESTORE CONTROLFILE FROM '/backup/rman/ctl_ORCL_2025...CTL';
ALTER DATABASE MOUNT;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
rman target /
SQL 'ALTER DATABASE DATAFILE 5 OFFLINE';
RESTORE DATAFILE 5;
RECOVER DATAFILE 5;
SQL 'ALTER DATABASE DATAFILE 5 ONLINE';
impdp system/password@orcl DIRECTORY=dpump DUMPFILE=scott_2025...dmp LOGFILE=imp_scott.log SCHEMAS=SCOTT
五 备份策略与运维建议