1. 首页 > Oracle教程 > 正文

Oracle教程FG436-数据泵损坏处理

本文档风哥主要介绍Oracle数据泵损坏处理相关知识,包括数据泵损坏的概念、数据泵损坏类型、数据泵损坏处理使用、数据泵损坏处理配置、数据泵损坏处理监控、数据泵损坏处理故障处理等内容,由风哥教程参考Oracle官方文档Troubleshooting内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 数据泵损坏的概念

Oracle数据泵损坏是指在使用数据泵(Data Pump)进行数据导出和导入过程中,由于各种原因导致的数据文件损坏、数据丢失或数据不一致的问题。数据泵损坏可能发生在导出文件、导入过程或数据泵作业中。数据泵损坏处理是数据库管理员必须掌握的重要技能。更多视频教程www.fgedu.net.cn

Oracle数据泵损坏的特点:

  • 导出文件损坏:导出文件损坏导致无法导入
  • 导入过程损坏:导入过程中断导致数据不完整
  • 数据不一致:导出导入过程中数据不一致
  • 元数据损坏:元数据损坏导致对象无法创建
  • 作业损坏:数据泵作业异常导致任务失败

1.2 数据泵损坏类型

Oracle数据泵损坏类型:

  • 导出文件损坏:导出文件物理损坏或逻辑损坏
  • 导入过程损坏:导入过程中断或失败
  • 数据不一致:导出导入数据不一致
  • 元数据损坏:对象定义损坏或不完整
  • 作业损坏:数据泵作业状态异常
# 数据泵损坏类型说明

1. 导出文件损坏
– 物理损坏:存储介质故障导致文件损坏
– 逻辑损坏:导出过程中断导致文件不完整
– 传输损坏:网络传输错误导致文件损坏
– 压缩损坏:压缩解压缩错误导致文件损坏

2. 导入过程损坏
– 过程中断:导入过程中断导致数据不完整
– 空间不足:目标空间不足导致导入失败
– 权限问题:权限不足导致对象创建失败
– 对象冲突:对象已存在导致导入失败

3. 数据不一致
– 时间点不一致:导出时间点不一致
– 字符集问题:字符集转换错误
– 数据类型问题:数据类型不兼容
– 约束问题:约束冲突导致数据不一致

4. 元数据损坏
– DDL损坏:DDL语句损坏或不完整
– 权限丢失:对象权限丢失
– 依赖问题:对象依赖关系丢失
– 约束丢失:约束定义丢失

5. 作业损坏
– 作业挂起:数据泵作业挂起
– 作业失败:数据泵作业失败
– 作业卡住:数据泵作业卡住
– 主表损坏:数据泵主表损坏

1.3 数据泵损坏处理使用

Oracle数据泵损坏处理使用:

  • 损坏检测:检测数据泵文件和作业损坏
  • 损坏分析:分析损坏原因和影响范围
  • 损坏修复:修复损坏的文件和作业
  • 数据恢复:恢复损坏的数据
  • 预防措施:制定预防措施避免损坏
风哥提示:数据泵损坏处理是数据库管理员必须掌握的重要技能,建议定期验证数据泵文件的完整性。

Part02-生产环境规划与建议

2.1 数据泵损坏处理规划

Oracle数据泵损坏处理规划要点:

# 数据泵损坏处理规划
– 预防措施:制定预防措施避免损坏
– 检测机制:建立损坏检测机制
– 处理流程:建立损坏处理流程
– 恢复策略:制定数据恢复策略

# 预防措施规划
– 验证导出:导出后验证文件完整性
– 备份文件:备份导出文件
– 校验和:使用校验和验证文件
– 多副本:保存多个导出文件副本

# 检测机制规划
– 定期检测:定期检测导出文件完整性
– 作业监控:监控数据泵作业状态
– 日志分析:分析数据泵日志
– 错误告警:建立错误告警机制

# 处理流程规划
– 损坏检测:检测数据泵损坏
– 损坏分析:分析损坏原因
– 损坏修复:修复损坏问题
– 数据恢复:恢复损坏数据
– 验证结果:验证处理结果

# 恢复策略规划
– 重新导出:重新导出损坏的数据
– 部分导入:部分导入可用数据
– 手动修复:手动修复损坏数据
– 数据重建:重建损坏的数据

2.2 数据泵损坏处理场景

Oracle数据泵损坏处理场景:

  • 导出文件损坏:处理导出文件损坏问题
  • 导入过程失败:处理导入过程失败问题
  • 作业挂起:处理数据泵作业挂起问题
  • 主表损坏:处理数据泵主表损坏问题
  • 数据不一致:处理数据不一致问题
# 数据泵损坏处理场景

1. 导出文件损坏
– 文件无法读取
– 文件格式错误
– 文件内容损坏
– 文件大小异常

2. 导入过程失败
– 导入过程中断
– 导入错误
– 导入超时
– 导入失败

3. 作业挂起
– 作业状态NOT RUNNING
– 作业长时间无响应
– 作业资源等待
– 作业锁等待

4. 主表损坏
– 主表查询错误
– 主表数据丢失
– 主表索引损坏
– 主表状态异常

5. 数据不一致
– 数据丢失
– 数据重复
– 数据错误
– 数据不完整

2.3 数据泵损坏处理最佳实践

Oracle数据泵损坏处理最佳实践:

  • 定期验证:定期验证导出文件完整性
  • 备份文件:备份导出文件到多个位置
  • 监控作业:监控数据泵作业状态
  • 及时处理:及时处理发现的问题
  • 记录过程:记录处理过程和结果
生产环境建议:数据泵损坏处理需要建立完善的处理流程,建议定期验证、备份文件、监控作业。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 数据泵损坏处理配置

3.1.1 配置导出文件验证

# 1. 使用DBV验证导出文件
$ dbv file=/backup/FGEDUDB/expdp_full.dmp

DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026

DBVERIFY – Verification starting : FILE = /backup/FGEDUDB/expdp_full.dmp

DBVERIFY – Verification complete

Total Pages Examined : 25600
Total Pages Processed (Data) : 0
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 25600
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 0 (0.0)

# 2. 使用校验和验证导出文件
$ md5sum /backup/FGEDUDB/expdp_full.dmp
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 /backup/FGEDUDB/expdp_full.dmp

$ sha256sum /backup/FGEDUDB/expdp_full.dmp
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2 /backup/FGEDUDB/expdp_full.dmp

# 3. 使用IMPDP验证导出文件
$ impdp system/password directory=BACKUP_DIR dumpfile=expdp_full.dmp sqlfile=verify.sql

Import: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Master table “SYSTEM”.”SYS_SQL_FILE_FULL_01″ successfully loaded/unloaded
Starting “SYSTEM”.”SYS_SQL_FILE_FULL_01″: system/******** directory=BACKUP_DIR dumpfile=expdp_full.dmp sqlfile=verify.sql
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/INDEX/INDEX
Job “SYSTEM”.”SYS_SQL_FILE_FULL_01″ successfully completed at Tue Mar 31 10:00:30 2026 elapsed 0 00:00:30

# 4. 查看验证SQL文件
$ cat /backup/FGEDUDB/verify.sql | head -50
— CONNECT SYSTEM
ALTER SESSION SET EVENTS ‘10150 TRACE NAME CONTEXT FOREVER, LEVEL 1’;
ALTER SESSION SET EVENTS ‘10904 TRACE NAME CONTEXT FOREVER, LEVEL 1’;
ALTER SESSION SET EVENTS ‘25475 TRACE NAME CONTEXT FOREVER, LEVEL 1’;
ALTER SESSION SET EVENTS ‘10407 TRACE NAME CONTEXT FOREVER, LEVEL 1’;
ALTER SESSION SET EVENTS ‘10851 TRACE NAME CONTEXT FOREVER, LEVEL 1’;
ALTER SESSION SET EVENTS ‘22830 TRACE NAME CONTEXT FOREVER, LEVEL 1’;
— new object type path: DATABASE_EXPORT/SCHEMA/TABLE/TABLE
CREATE TABLE “SCOTT”.”EMP”
( “EMPNO” NUMBER(4,0),
“ENAME” VARCHAR2(10 BYTE),
“JOB” VARCHAR2(9 BYTE),
“MGR” NUMBER(4,0),
“HIREDATE” DATE,
“SAL” NUMBER(7,2),
“COMM” NUMBER(7,2),
“DEPTNO” NUMBER(2,0),
PRIMARY KEY (“EMPNO”)
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE “USERS” ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
TABLESPACE “USERS” ;

# 5. 使用LOGFILE参数验证导出文件
$ impdp system/password directory=BACKUP_DIR dumpfile=expdp_full.dmp logfile=verify.log content=METADATA_ONLY

Import: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Master table “SYSTEM”.”SYS_IMPORT_FULL_01″ successfully loaded/unloaded
Starting “SYSTEM”.”SYS_IMPORT_FULL_01″: system/******** directory=BACKUP_DIR dumpfile=expdp_full.dmp logfile=verify.log content=METADATA_ONLY
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/INDEX/INDEX
Job “SYSTEM”.”SYS_IMPORT_FULL_01″ successfully completed at Tue Mar 31 10:00:30 2026 elapsed 0 00:00:30

# 6. 创建导出文件验证脚本
$ vi /home/oracle/scripts/verify_dp_file.sh

#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 验证数据泵导出文件

export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH

DUMP_FILE=$1
LOG_DIR=”/home/oracle/scripts/dp_verify_logs”
mkdir -p $LOG_DIR

if [ -z “$DUMP_FILE” ]; then
echo “Usage: $0
exit 1
fi

echo “$(date): Verifying dump file $DUMP_FILE…” > $LOG_DIR/verify.log

# 检查文件是否存在
if [ ! -f “$DUMP_FILE” ]; then
echo “ERROR: File $DUMP_FILE not found” >> $LOG_DIR/verify.log
exit 1
fi

# 计算校验和
echo “$(date): Calculating checksum…” >> $LOG_DIR/verify.log
md5sum $DUMP_FILE >> $LOG_DIR/verify.log

# 使用DBV验证
echo “$(date): Running DBV verification…” >> $LOG_DIR/verify.log
dbv file=$DUMP_FILE >> $LOG_DIR/verify.log 2>&1

# 检查DBV结果
if grep -q “Total Pages Marked Corrupt : 0” $LOG_DIR/verify.log; then
echo “$(date): DBV verification PASSED” >> $LOG_DIR/verify.log
else
echo “$(date): DBV verification FAILED” >> $LOG_DIR/verify.log
fi

echo “$(date): Verification completed.” >> $LOG_DIR/verify.log

# 7. 执行验证脚本
$ chmod +x /home/oracle/scripts/verify_dp_file.sh
$ /home/oracle/scripts/verify_dp_file.sh /backup/FGEDUDB/expdp_full.dmp

3.1.2 配置数据泵作业监控

# 1. 查看数据泵作业状态
SQL> select
owner_name,
job_name,
operation,
job_mode,
state,
degree
from dba_datapump_jobs
order by job_name;

OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE DEGREE
———- ———————– ———– ———– ————— ———-
SYSTEM SYS_EXPORT_FULL_01 EXPORT FULL EXECUTING 4
SYSTEM SYS_IMPORT_FULL_01 IMPORT FULL EXECUTING 4

# 2. 查看数据泵作业进度
SQL> select
sid,
serial#,
opname,
target_desc,
sofar,
totalwork,
round(sofar/totalwork*100,2) as pct_complete,
time_remaining,
elapsed_seconds
from v$session_longops
where opname like ‘%EXPORT%’ or opname like ‘%IMPORT%’;

SID SERIAL# OPNAME TARGET_DESC SOFAR TOTALWORK PCT_COMPLETE TIME_REMAINING ELAPSED_SECONDS
———- ———- —————————— ———— ———- ———- ———— ————– —————
150 1234 SYS_EXPORT_FULL_01 EXPORT 5000 10000 50.00 300 300

# 3. 查看数据泵主表
SQL> select
owner,
table_name,
tablespace_name,
num_rows
from dba_tables
where table_name like ‘SYS\_EXPORT\_%’ escape ‘\’
or table_name like ‘SYS\_IMPORT\_%’ escape ‘\’;

OWNER TABLE_NAME TABLESPACE_NAME NUM_ROWS
———- —————————— —————– ———-
SYSTEM SYS_EXPORT_FULL_01 SYSTEM 1000

# 4. 查看数据泵会话
SQL> select
s.sid,
s.serial#,
s.username,
s.program,
s.status,
s.sql_id
from v$session s
where s.program like ‘%expdp%’ or s.program like ‘%impdp%’;

SID SERIAL# USERNAME PROGRAM STATUS SQL_ID
———- ———- ———- —————————— ——– ————-
150 1234 SYSTEM oracle@db01 (DW01) ACTIVE a1b2c3d4e5f6g

# 5. 查看数据泵锁
SQL> select
l.sid,
l.type,
l.id1,
l.id2,
l.lmode,
l.request,
s.username,
s.program
from v$lock l, v$session s
where l.sid = s.sid
and s.program like ‘%expdp%’ or s.program like ‘%impdp%’;

SID TYPE ID1 ID2 LMODE REQUEST USERNAME PROGRAM
———- —- ———- ———- ———- ———- ———- ——————————
150 TM 12345 0 3 0 SYSTEM oracle@db01 (DW01)

# 6. 创建数据泵作业监控脚本
$ vi /home/oracle/scripts/monitor_dp_job.sh

#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 监控数据泵作业

export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH

LOG_DIR=”/home/oracle/scripts/dp_monitor_logs”
mkdir -p $LOG_DIR

echo “$(date): Monitoring Data Pump jobs…” > $LOG_DIR/dp_monitor.log

# 查看数据泵作业状态
sqlplus -s / as sysdba <> $LOG_DIR/dp_monitor.log
set heading on
set feedback on
set linesize 200

prompt Data Pump Jobs:
prompt —————
select owner_name, job_name, operation, job_mode, state, degree
from dba_datapump_jobs
order by job_name;

prompt
prompt Data Pump Progress:
prompt ——————-
select sid, serial#, opname, sofar, totalwork,
round(sofar/totalwork*100,2) as pct_complete
from v\$session_longops
where opname like ‘%EXPORT%’ or opname like ‘%IMPORT%’;

prompt
prompt Data Pump Sessions:
prompt ——————-
select sid, serial#, username, program, status
from v\$session
where program like ‘%expdp%’ or program like ‘%impdp%’;

exit
EOF

echo “$(date): Monitoring completed.” >> $LOG_DIR/dp_monitor.log

# 7. 执行监控脚本
$ chmod +x /home/oracle/scripts/monitor_dp_job.sh
$ /home/oracle/scripts/monitor_dp_job.sh

3.2 数据泵损坏处理监控

3.2.1 配置数据泵损坏检测

# 1. 创建数据泵损坏检测脚本
$ vi /home/oracle/scripts/detect_dp_corruption.sh

#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 检测数据泵损坏

export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH

LOG_DIR=”/home/oracle/scripts/dp_corruption_logs”
mkdir -p $LOG_DIR

echo “$(date): Starting Data Pump corruption detection…” > $LOG_DIR/corruption_detect.log

# 检查数据泵作业状态
sqlplus -s / as sysdba <> $LOG_DIR/corruption_detect.log
set serveroutput on

— 检查挂起的数据泵作业
declare
v_count number;
begin
select count(*) into v_count
from dba_datapump_jobs
where state = ‘NOT RUNNING’;

if v_count > 0 then
dbms_output.put_line(‘WARNING: Found ‘ || v_count || ‘ suspended Data Pump jobs’);

for rec in (
select owner_name, job_name, state
from dba_datapump_jobs
where state = ‘NOT RUNNING’
) loop
dbms_output.put_line(‘ Job: ‘ || rec.owner_name || ‘.’ || rec.job_name || ‘ – State: ‘ || rec.state);
end loop;
else
dbms_output.put_line(‘No suspended Data Pump jobs found’);
end if;
end;
/

— 检查数据泵主表
prompt
prompt Checking Data Pump master tables…

select owner, table_name, tablespace_name
from dba_tables
where table_name like ‘SYS\_EXPORT\_%’ escape ‘\’
or table_name like ‘SYS\_IMPORT\_%’ escape ‘\’;

exit
EOF

# 检查导出文件完整性
for dump_file in /backup/FGEDUDB/*.dmp; do
if [ -f “$dump_file” ]; then
echo “$(date): Checking dump file $dump_file…” >> $LOG_DIR/corruption_detect.log

# 使用DBV检查
dbv file=$dump_file >> $LOG_DIR/corruption_detect.log 2>&1

# 检查是否有损坏
if grep -q “Total Pages Marked Corrupt : 0” $LOG_DIR/corruption_detect.log; then
echo “$(date): File $dump_file is OK” >> $LOG_DIR/corruption_detect.log
else
echo “$(date): WARNING: File $dump_file has corruption” >> $LOG_DIR/corruption_detect.log
fi
fi
done

echo “$(date): Data Pump corruption detection completed.” >> $LOG_DIR/corruption_detect.log

# 2. 执行检测脚本
$ chmod +x /home/oracle/scripts/detect_dp_corruption.sh
$ /home/oracle/scripts/detect_dp_corruption.sh

# 3. 设置定期检测
$ crontab -e

# 每天凌晨3点检测数据泵损坏
0 3 * * * /home/oracle/scripts/detect_dp_corruption.sh >> /home/oracle/scripts/dp_corruption_logs/corruption_detect.log 2>&1

3.3 数据泵损坏处理故障处理

3.3.1 导出文件损坏处理

# 问题现象
$ impdp system/password directory=BACKUP_DIR dumpfile=expdp_full.dmp

Import: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
ORA-39001: invalid argument value
ORA-39000: bad dump file specification
ORA-31619: invalid dump file “/backup/FGEDUDB/expdp_full.dmp”

# 分析步骤

# 1. 检查文件是否存在
$ ls -l /backup/FGEDUDB/expdp_full.dmp
-rw-r–r– 1 oracle oinstall 104857600 Mar 31 10:00 /backup/FGEDUDB/expdp_full.dmp

# 2. 检查文件权限
$ chmod 640 /backup/FGEDUDB/expdp_full.dmp

# 3. 使用DBV检查文件
$ dbv file=/backup/FGEDUDB/expdp_full.dmp

DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026

DBVERIFY – Verification starting : FILE = /backup/FGEDUDB/expdp_full.dmp

Page 100 is marked corrupt
Corrupt block relative dba: 0x01000064, file 0, block 100

DBVERIFY – Verification complete

Total Pages Examined : 25600
Total Pages Marked Corrupt : 1

# 4. 检查是否有备份
$ ls -l /backup/FGEDUDB/expdp_full*.dmp
-rw-r–r– 1 oracle oinstall 104857600 Mar 31 09:00 /backup/FGEDUDB/expdp_full_20260331_0900.dmp
-rw-r–r– 1 oracle oinstall 104857600 Mar 31 10:00 /backup/FGEDUDB/expdp_full.dmp

# 5. 解决方案:使用备份文件
$ impdp system/password directory=BACKUP_DIR dumpfile=expdp_full_20260331_0900.dmp

Import: Release 19.0.0.0.0 – Production on Tue Mar 31 10:10:00 2026

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Master table “SYSTEM”.”SYS_IMPORT_FULL_01″ successfully loaded/unloaded
Starting “SYSTEM”.”SYS_IMPORT_FULL_01″: system/******** directory=BACKUP_DIR dumpfile=expdp_full_20260331_0900.dmp
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
. . imported “SCOTT”.”EMP” 14 rows
Job “SYSTEM”.”SYS_IMPORT_FULL_01″ successfully completed at Tue Mar 31 10:10:30 2026 elapsed 0 00:00:30

# 6. 如果没有备份,重新导出
$ expdp system/password directory=BACKUP_DIR dumpfile=expdp_full_new.dmp full=y

Export: Release 19.0.0.0.0 – Production on Tue Mar 31 10:20:00 2026

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Starting “SYSTEM”.”SYS_EXPORT_FULL_01″: system/******** directory=BACKUP_DIR dumpfile=expdp_full_new.dmp full=y
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
. . exported “SCOTT”.”EMP” 14 rows
Master table “SYSTEM”.”SYS_EXPORT_FULL_01″ successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_FULL_01 is:
/backup/FGEDUDB/expdp_full_new.dmp
Job “SYSTEM”.”SYS_EXPORT_FULL_01″ successfully completed at Tue Mar 31 10:20:30 2026 elapsed 0 00:00:30

3.3.2 数据泵作业挂起处理

# 问题现象
SQL> select owner_name, job_name, state from dba_datapump_jobs;

OWNER_NAME JOB_NAME STATE
———- ———————– —————
SYSTEM SYS_EXPORT_FULL_01 NOT RUNNING

# 分析步骤

# 1. 查看作业详细信息
SQL> select
owner_name,
job_name,
operation,
job_mode,
state,
attached_sessions
from dba_datapump_jobs
where job_name = ‘SYS_EXPORT_FULL_01’;

OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE ATTACHED_SESSIONS
———- ———————– ———– ———– ————— —————–
SYSTEM SYS_EXPORT_FULL_01 EXPORT FULL NOT RUNNING 0

# 2. 查看主表状态
SQL> select
owner,
table_name,
tablespace_name,
num_rows
from dba_tables
where table_name = ‘SYS_EXPORT_FULL_01’;

OWNER TABLE_NAME TABLESPACE_NAME NUM_ROWS
———- —————————— —————– ———-
SYSTEM SYS_EXPORT_FULL_01 SYSTEM 1000

# 3. 查看作业日志
$ cat /backup/FGEDUDB/export.log
Export: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Starting “SYSTEM”.”SYS_EXPORT_FULL_01″: system/******** directory=BACKUP_DIR dumpfile=expdp_full.dmp full=y logfile=export.log
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
. . exported “SCOTT”.”EMP” 10 rows
Export terminated with error: ORA-39095: Worker process error

# 4. 解决方案1:重新附加作业
$ expdp system/password attach=SYS_EXPORT_FULL_01

Export: Release 19.0.0.0.0 – Production on Tue Mar 31 10:10:00 2026

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Job: SYS_EXPORT_FULL_01
Owner: SYSTEM
Operation: EXPORT
Mode: FULL
State: NOT RUNNING
Job Error: ORA-39095: Worker process error

Export> start_job

Export> continue_client

Job SYS_EXPORT_FULL_01 has been reopened at Tue Mar 31 10:10:30 2026
Restarting “SYSTEM”.”SYS_EXPORT_FULL_01″: system/******** directory=BACKUP_DIR dumpfile=expdp_full.dmp full=y logfile=export.log
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
. . exported “SCOTT”.”DEPT” 4 rows
Job “SYSTEM”.”SYS_EXPORT_FULL_01″ successfully completed at Tue Mar 31 10:11:00 2026 elapsed 0 00:00:30

# 5. 解决方案2:终止作业并重新执行
$ expdp system/password attach=SYS_EXPORT_FULL_01

Export: Release 19.0.0.0.0 – Production on Tue Mar 31 10:10:00 2026

Job: SYS_EXPORT_FULL_01

Export> kill_job

Are you sure you wish to stop this job ([yes]/no): yes

# 6. 清理主表
SQL> drop table system.SYS_EXPORT_FULL_01 purge;

Table dropped.

# 7. 重新执行导出
$ expdp system/password directory=BACKUP_DIR dumpfile=expdp_full_new.dmp full=y

Export: Release 19.0.0.0.0 – Production on Tue Mar 31 10:20:00 2026

Starting “SYSTEM”.”SYS_EXPORT_FULL_01″: system/******** directory=BACKUP_DIR dumpfile=expdp_full_new.dmp full=y
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
. . exported “SCOTT”.”EMP” 14 rows
Job “SYSTEM”.”SYS_EXPORT_FULL_01″ successfully completed at Tue Mar 31 10:20:30 2026 elapsed 0 00:00:30

风哥提示:数据泵损坏处理是数据库管理员必须掌握的重要技能,建议定期验证数据泵文件的完整性。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 数据泵损坏处理分析案例

在生产环境中使用数据泵损坏处理的完整案例:

4.1.1 场景描述

某企业生产数据库需要处理数据泵导出文件损坏问题,使用多种方法进行修复。

4.1.2 分析步骤

# 1. 创建数据泵损坏处理脚本
$ vi /home/oracle/scripts/handle_dp_corruption.sh

#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 数据泵损坏处理脚本

export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH

LOG_DIR=”/home/oracle/scripts/dp_handle_logs”
mkdir -p $LOG_DIR

DUMP_FILE=$1

if [ -z “$DUMP_FILE” ]; then
echo “Usage: $0
exit 1
fi

echo “$(date): Starting Data Pump corruption handling for $DUMP_FILE…” > $LOG_DIR/handle.log

# 1. 检查文件是否存在
if [ ! -f “$DUMP_FILE” ]; then
echo “ERROR: File $DUMP_FILE not found” >> $LOG_DIR/handle.log
exit 1
fi

# 2. 使用DBV检查文件
echo “$(date): Running DBV check…” >> $LOG_DIR/handle.log
dbv file=$DUMP_FILE >> $LOG_DIR/handle.log 2>&1

# 3. 检查是否有损坏
if grep -q “Total Pages Marked Corrupt : 0” $LOG_DIR/handle.log; then
echo “$(date): File is OK, no corruption detected” >> $LOG_DIR/handle.log
exit 0
fi

# 4. 文件有损坏,尝试修复
echo “$(date): Corruption detected, attempting recovery…” >> $LOG_DIR/handle.log

# 5. 查找备份文件
BACKUP_FILE=”${DUMP_FILE%.*}_backup.dmp”
if [ -f “$BACKUP_FILE” ]; then
echo “$(date): Found backup file $BACKUP_FILE” >> $LOG_DIR/handle.log

# 验证备份文件
dbv file=$BACKUP_FILE >> $LOG_DIR/handle.log 2>&1

if grep -q “Total Pages Marked Corrupt : 0” $LOG_DIR/handle.log; then
echo “$(date): Backup file is OK, using backup” >> $LOG_DIR/handle.log
cp $BACKUP_FILE $DUMP_FILE
exit 0
fi
fi

# 6. 没有可用备份,重新导出
echo “$(date): No valid backup found, re-exporting…” >> $LOG_DIR/handle.log

sqlplus -s / as sysdba <> $LOG_DIR/handle.log
set serveroutput on

declare
v_count number;
begin
— 检查是否有数据泵作业
select count(*) into v_count from dba_datapump_jobs;

if v_count > 0 then
dbms_output.put_line(‘WARNING: Active Data Pump jobs found’);
end if;
end;
/
exit
EOF

# 重新导出
expdp system/password directory=BACKUP_DIR dumpfile=${DUMP_FILE##*/} full=y >> $LOG_DIR/handle.log 2>&1

echo “$(date): Data Pump corruption handling completed.” >> $LOG_DIR/handle.log

# 2. 执行处理脚本
$ chmod +x /home/oracle/scripts/handle_dp_corruption.sh
$ /home/oracle/scripts/handle_dp_corruption.sh /backup/FGEDUDB/expdp_full.dmp

# 3. 查看处理结果
$ cat /home/oracle/scripts/dp_handle_logs/handle.log

Tue Mar 31 10:00:00 CST 2026: Starting Data Pump corruption handling for /backup/FGEDUDB/expdp_full.dmp…
Tue Mar 31 10:00:05 CST 2026: Running DBV check…
Tue Mar 31 10:00:10 CST 2026: Corruption detected, attempting recovery…
Tue Mar 31 10:00:15 CST 2026: Found backup file /backup/FGEDUDB/expdp_full_backup.dmp
Tue Mar 31 10:00:20 CST 2026: Backup file is OK, using backup
Tue Mar 31 10:00:25 CST 2026: Data Pump corruption handling completed.

4.2 数据泵损坏处理故障处理

在数据泵损坏处理故障处理过程中的方法和技巧:

4.2.1 故障处理流程

# 数据泵损坏处理故障处理流程

# 1. 故障识别
# – 检测数据泵文件损坏
# – 检测数据泵作业异常
# – 检测数据不一致

# 2. 故障分析
# – 分析损坏类型
# – 分析损坏原因
# – 评估影响范围

# 3. 故障处理
# – 使用备份恢复
# – 重新导出数据
# – 修复损坏文件

# 4. 故障预防
# – 定期验证文件
# – 备份导出文件
# – 监控作业状态

# 示例:数据泵损坏处理故障处理

# 1. 故障识别
$ dbv file=/backup/FGEDUDB/expdp_full.dmp

Total Pages Marked Corrupt : 1

# 2. 故障分析
$ ls -l /backup/FGEDUDB/expdp_full*.dmp
-rw-r–r– 1 oracle oinstall 104857600 Mar 31 09:00 /backup/FGEDUDB/expdp_full_backup.dmp
-rw-r–r– 1 oracle oinstall 104857600 Mar 31 10:00 /backup/FGEDUDB/expdp_full.dmp

# 3. 故障处理
$ dbv file=/backup/FGEDUDB/expdp_full_backup.dmp

Total Pages Marked Corrupt : 0

$ cp /backup/FGEDUDB/expdp_full_backup.dmp /backup/FGEDUDB/expdp_full.dmp

# 4. 验证处理结果
$ dbv file=/backup/FGEDUDB/expdp_full.dmp

Total Pages Marked Corrupt : 0

4.3 数据泵损坏处理优化

优化数据泵损坏处理配置的最佳实践:

4.3.1 优化数据泵损坏处理管理

# 1. 创建数据泵损坏处理自动化存储过程
SQL> create or replace procedure auto_dp_corruption_check as
v_job_count number;
v_corrupt_count number;
begin
dbms_output.put_line(‘— Auto Data Pump Corruption Check —‘);

— 检查挂起的数据泵作业
select count(*) into v_job_count
from dba_datapump_jobs
where state = ‘NOT RUNNING’;

if v_job_count > 0 then
dbms_output.put_line(‘WARNING: Found ‘ || v_job_count || ‘ suspended Data Pump jobs’);

for rec in (
select owner_name, job_name, state
from dba_datapump_jobs
where state = ‘NOT RUNNING’
) loop
dbms_output.put_line(‘ Job: ‘ || rec.owner_name || ‘.’ || rec.job_name);
end loop;
else
dbms_output.put_line(‘No suspended Data Pump jobs found’);
end if;

— 检查数据泵主表
for rec in (
select owner, table_name
from dba_tables
where table_name like ‘SYS\_EXPORT\_%’ escape ‘\’
or table_name like ‘SYS\_IMPORT\_%’ escape ‘\’
) loop
dbms_output.put_line(‘Master table found: ‘ || rec.owner || ‘.’ || rec.table_name);
end loop;
end auto_dp_corruption_check;
/

Procedure created.

# 2. 执行自动化存储过程
SQL> set serveroutput on
SQL> exec auto_dp_corruption_check;

— Auto Data Pump Corruption Check —
No suspended Data Pump jobs found

PL/SQL procedure successfully completed.

# 3. 创建数据泵损坏处理历史表
SQL> create table dp_corruption_history (
id number primary key,
file_name varchar2(200),
corruption_type varchar2(50),
detection_time date,
recovery_time date,
status varchar2(20)
);

Table created.

SQL> create sequence dp_corruption_seq;

Sequence created.

# 4. 创建数据泵损坏记录存储过程
SQL> create or replace procedure record_dp_corruption(
p_file_name in varchar2,
p_corruption_type in varchar2
) as
begin
insert into dp_corruption_history (
id, file_name, corruption_type, detection_time, status
) values (
dp_corruption_seq.nextval, p_file_name, p_corruption_type, sysdate, ‘DETECTED’
);
commit;
end record_dp_corruption;
/

Procedure created.

# 5. 查看数据泵损坏历史
SQL> column detection_time format a20
SQL> column recovery_time format a20
SQL> select * from dp_corruption_history order by detection_time desc;

ID FILE_NAME CORRUPTION_TYPE DETECTION_TIME RECOVERY_TIME STATUS
———- ——————————- ——————– ——————– ——————– ——————–
1 /backup/FGEDUDB/expdp_full.dmp PHYSICAL_CORRUPTION 2026-03-31 10:00:00 2026-03-31 10:10:00 RECOVERED

生产环境建议:数据泵损坏处理优化需要建立完善的处理流程,建议定期验证、备份文件、监控作业。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 数据泵损坏处理总结

Oracle数据泵损坏处理是数据库管理员必须掌握的重要技能,具有以下特点:

  • 导出文件损坏:导出文件物理损坏或逻辑损坏
  • 导入过程损坏:导入过程中断或失败
  • 数据不一致:导出导入数据不一致
  • 元数据损坏:对象定义损坏或不完整
  • 作业损坏:数据泵作业状态异常

5.2 数据泵损坏处理检查清单

Oracle数据泵损坏处理检查清单:

  • 文件验证:定期验证导出文件完整性
  • 文件备份:备份导出文件到多个位置
  • 作业监控:监控数据泵作业状态
  • 错误处理:及时处理发现的错误
  • 记录过程:记录处理过程和结果
  • 预防措施:制定预防措施避免损坏

5.3 数据泵损坏处理工具推荐

Oracle数据泵损坏处理工具推荐:

  • DBVERIFY:验证导出文件完整性
  • EXPDP/IMPDP:导出导入数据
  • MD5SUM/SHA256SUM:计算文件校验和
  • SQL*Plus:执行SQL命令
  • Shell脚本:自动化处理过程
  • DBA_DATAPUMP_JOBS:查看数据泵作业状态
风哥提示:数据泵损坏处理是数据库管理员必须掌握的重要技能,建议定期验证数据泵文件的完整性。from:www.itpux.com www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息