Oracle expdp 全量 + 增量备份 impdp 恢复 Shell 脚本模板
2026/8/6 22:33:16 网站建设 项目流程

目录

1、备份脚本 expdp_backup.sh

使用

2、恢复脚本 impdp_restore.sh

完整恢复实操示例

3、生产注意点

4、累积增量版本(CUMULATIVE)


环境前提

  1. 已创建 DIRECTORY,示例名DUMP_DIR,操作系统用户对目录有读写权限
  2. 数据库用户拥有EXP_FULL_DATABASE、IMP_FULL_DATABASE权限
  3. 备份文件命名规则:full_${date}.dmpincr_${date}.dmp
  4. 日志和 dmp 放同一目录;必须维护备份清单记录备份顺序,恢复严格按时间顺序

1、备份脚本 expdp_backup.sh

#!/bin/bash ######################################################## # Oracle expdp 全量/增量备份脚本 # 使用方式: # 首次全量:sh expdp_backup.sh full # 后续增量:sh expdp_backup.sh incr ######################################################## # 数据库连接信息 ORACLE_SID=ORCL DB_USER="/ as sysdba" DUMP_DIR=DUMP_DIR BACKUP_DIR="/u01/oracle/dump" DATE=$(date +%Y%m%d_%H%M%S) export ORACLE_SID=${ORACLE_SID} export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK BACKUP_TYPE=$1 if [ "${BACKUP_TYPE}"x != "full"x ] && [ "${BACKUP_TYPE}"x != "incr"x ];then echo "用法:$0 [full|incr]" echo "示例:" echo " 初次全量备份: sh $0 full" echo " 后续增量备份: sh $0 incr" exit 1 fi if [ "${BACKUP_TYPE}" = "full" ];then DUMP_FILE="full_${DATE}.dmp" LOG_FILE="full_${DATE}.log" echo "===== 执行全量备份 ${DUMP_FILE} =====" expdp ${DB_USER} directory=${DUMP_DIR} dumpfile=${DUMP_FILE} logfile=${LOG_FILE} full=y else DUMP_FILE="incr_${DATE}.dmp" LOG_FILE="incr_${DATE}.log" echo "===== 执行增量备份 ${DUMP_FILE} =====" expdp ${DB_USER} directory=${DUMP_DIR} dumpfile=${DUMP_FILE} logfile=${LOG_FILE} full=y INCREMENTAL=y fi #记录备份清单,恢复时以此为准 echo "${DATE},${BACKUP_TYPE},${DUMP_FILE}" >> ${BACKUP_DIR}/backup_list.txt echo "备份完成,dmp:${DUMP_FILE}, log:${LOG_FILE}"

使用

#第一次执行,全量 sh expdp_backup.sh full #后续定时执行增量,可以配置crontab sh expdp_backup.sh incr

crontab 示例,每日凌晨 2 点做增量

0 2 * * * /bin/bash /u01/oracle/scripts/expdp_backup.sh incr >> /u01/oracle/dump/cron_backup.log 2>&1

backup_list.txt示例内容

20260806_020000,full,full_20260806_020000.dmp 20260807_020000,incr,incr_20260807_020000.dmp 20260808_020000,incr,incr_20260808_020000.dmp

2、恢复脚本 impdp_restore.sh

⚠️重要:必须严格按照 backup_list.txt 里备份时间顺序执行;先全量,再逐个增量,不能跳过。 整库恢复建议目标库实例已建好,表空间提前创建,清空业务用户。

#!/bin/bash ######################################################## # expdp dmp恢复脚本 # 参数1:dmp文件名,参数2:是否增量[yes|no] # 示例: # sh impdp_restore.sh full_20260806_020000.dmp no # sh impdp_restore.sh incr_20260807_020000.dmp yes # sh impdp_restore.sh incr_20260808_020000.dmp yes ######################################################## ORACLE_SID=ORCL DB_USER="/ as sysdba" DUMP_DIR=DUMP_DIR DUMP_FILE=$1 IS_INCREMENTAL=$2 DATE=$(date +%Y%m%d_%H%M%S) LOG_FILE="imp_${DUMP_FILE%.dmp}_${DATE}.log" export ORACLE_SID=${ORACLE_SID} export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK if [ $# -ne 2 ];then echo "用法: $0 dmp文件名 yes|no" echo "全量恢复示例: $0 full_xxx.dmp no" echo "增量恢复示例: $0 incr_xxx.dmp yes" exit 1 fi IMP_CMD="impdp ${DB_USER} directory=${DUMP_DIR} dumpfile=${DUMP_FILE} logfile=${LOG_FILE} full=y" if [ "${IS_INCREMENTAL}"x = "yes"x ];then IMP_CMD="${IMP_CMD} INCREMENTAL=y" fi echo "=====开始导入 ${DUMP_FILE}, INCREMENTAL=${IS_INCREMENTAL} =====" echo "执行命令:${IMP_CMD}" ${IMP_CMD} if [ $? -eq 0 ];then echo "=====导入 ${DUMP_FILE} SUCCESS =====" else echo "=====导入 ${DUMP_FILE} FAILED,请查看日志 ${LOG_FILE} =====" exit 1 fi

完整恢复实操示例

#1.恢复基础全量 sh impdp_restore.sh full_20260806_020000.dmp no #2.恢复第1个增量 sh impdp_restore.sh incr_20260807_020000.dmp yes #3.恢复第2个最新增量 sh impdp_restore.sh incr_20260808_020000.dmp yes

3、生产注意点

  1. 不要跳过中间增量 dmp,必须链式顺序导入;中间任意一个 dmp 损坏,恢复链断裂,只能恢复到上一个完好备份。
  2. 如果业务对象存在,可增加参数TABLE_EXISTS_ACTION=TRUNCATE,根据业务取舍。
  3. expdp 逻辑增量不支持精确时间点恢复,只能恢复备份完成时刻;需要时间点恢复建议 RMAN + 归档。
  4. 备份的 dmp 文件定期异地拷贝,磁盘损坏会全部丢失。
  5. 定期做恢复演练,验证备份可用。

4、累积增量版本(CUMULATIVE)

累积增量:每次导出自上次全量以来全部变更,只保留一份累积增量,恢复:全量→一份 cum 增量即可。 备份脚本只需把备份类型 incr 分支参数改为CUMULATIVE=y

expdp ${DB_USER} directory=${DUMP_DIR} dumpfile=${DUMP_FILE} logfile=${LOG_FILE} full=y CUMULATIVE=y

恢复同样:INCREMENTAL=y

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询