再谈使用 expdp 数据泵导出遇到的问题
作者 | JiekeXu
来源 | JiekeXu之路(ID: JiekeXu_IT)
转载请联系授权 | (微信ID:xxq1426321293)
大家好,我是 JiekeXu,很高兴又和大家见面了,今天分享一篇案例 再谈使用数据泵导出遇到的问题。本文首发于微信公众号【JiekeXu之路】,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!
事情是这样的,上周五下班时,同事使用数据泵导出测试数据时,由于源端、目标端操作系统异构且不在同一网段,也无法使用 scp 传输 dmp 文件,便在两端挂载了一个 NFS 网络文件系统,准备按用户导出数据,但是他多次尝试导出时,日志没有输出,也没有报错,瞬间感到头大,便让我们接手此问题了,预知后事详情,且听我慢慢道来。
前方高能,估计会涉及到一些知识盲点,请准备好小板凳哦。首先导出环境为 AIX 下的 11203,目标端为 Linuxone 系统下的 Oracle 19.9,将 linuxone 端的文件系统挂载到 AIX 主机上进行导出任务,使用类似如下的命令:
vi full_expdp.par
directory=EXP_Jieke_DIR
logfile=exp_to_schemas.log
dumpfile==ATX_FULL_%U.dmp
schemas=scott --写要导出用户
parallel=32
CLUSTER=N
nohup expdp \"/ as sysdba\" parfile='/ora-backup/full_expdp.par' &
对于 7.5 TB 的数据,如无其他优化设置这样导出多少会出问题,这里就先不讨论此方案可行性以及性能问题。单纯看此语法命令无任何问题,但是如上后台导出时 log 却没有日志输出,nohup.out 文件中也只有登录数据库的信息,便一直卡住没有后续信息了。
tail nohup.out
Export: Release 11.2.0.3.0 - Production on Fri Dec 4 21:53:16 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
ps -ef | grep expdp 查看导出进程还在,只不过通过数据库查看 job 发现 state 竟然是 DEFINING 状态,没有 EXECUTING 状态的。
使用数据泵 expdp user/passwd attatch=job_name 交互式方式查看也只有一个任务且为 DEFINING 异常状态,kill_job 卡住无法执行完毕,只能取消掉 kill 操作系统进程。
这里在说一下数据泵交互式状态查看方法:expdp\impdp user/passwd attatch=job_name 进入交互式状态下。job_name 可通过 dba_datapump_jobs 获取或者导出日志开头部分获取即可,进入交互式后使用 help 获取帮助命令, status 命令查看导出进度,可以清晰看到每个 job 具体的任务,当然你想停止 job 则直接 kill_job 后输入 yes 立即停止;STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。常用的还有 PARALLEL=N 修改 work 的数目,START_JOB 开启数据泵作业。如下是一个简单使用过程:
JIEKEUR1:[JiekeXu1]/newbackup/Jieke$ expdp \"/ as sysdba\" attach=SYS_EXPORT_TABLE_02
Export: Release 11.2.0.3.0 - Production on Fri Dec 4 21:53:16 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
Job: SYS_EXPORT_TABLE_02
Owner: SYS
Operation: EXPORT
Creator Privs: TRUE
GUID: B5A4B3B38E0A00FEE0530A0A30841115
Start Time: Friday, 04 December, 2020 21:46:24
Mode: TABLE
Instance: JiekeXu1
Max Parallelism: 0
EXPORT Job Parameters:
Parameter Name Parameter Value:
CLIENT_COMMAND "/******** AS SYSDBA" directory=EXP_Jieke_DIR logfile=exp_to_AT_CLAIMTASK.log dumpfile=AT_CLAIMTASK_%U.dmp tables=KHEF.AT_CLAIMTASK
State: DEFINING
Bytes Processed: 0
Job Error Count: 0
Dump File: /newbackup/Jieke/KHEF.AT_CLAIMTASK_%u.dmp
Export> help
------------------------------------------------------------------------------
The following commands are valid while in interactive mode.
Note: abbreviations are allowed.
ADD_FILE
Add dumpfile to dumpfile set.
CONTINUE_CLIENT
Return to logging mode. Job will be restarted if idle.
EXIT_CLIENT
Quit client session and leave job running.
FILESIZE
Default filesize (bytes) for subsequent ADD_FILE commands.
HELP
Summarize interactive commands.
KILL_JOB
Detach and delete job.
PARALLEL
Change the number of active workers for current job.
REUSE_DUMPFILES
Overwrite destination dump file if it exists [N].
START_JOB
Start or resume current job.
Valid keyword values are: SKIP_CURRENT.
STATUS
Frequency (secs) job status is to be monitored where
the default [0] will show new status when available.
STOP_JOB
Orderly shutdown of job execution and exits the client.
Valid keyword values are: IMMEDIATE.
Export> KILL_JOB
Are you sure you wish to stop this job ([yes]/no): yes
^CUDE-00001: user requested cancel of current operation
KILL_JOB 无法进行,则只能通过操作系统层直接 kill 进程,
ps -ef|grep expdp|grep -v grep|awk '{print $2}'|xargs kill -9
后续继续查看 dba_datapump_jobs 时发现都是 NOTRUNNING。这样状态的才可以在数据库中清理,但再一次发起导出时还会遇到这样挂起问题,没办法看来问题比较棘手只能加班处理了。这次等待的时间较长,挂起的进程都变成 ora_dm.
清理 dm 进程后,数据库里的状态才会变为 NOT RUNNING 然后便可以使用 drop table 语句清理掉数据库残余信息,大家也可以检查下自己的数据库是否有此类残余信息,如有,可清理之。
JIEKEUR1:[JiekeXu1]/newbackup/Jieke$ ps -ef|grep ora_dm|grep -v grep
oracle 60687002 1 0 21:46:24 - 0:00 ora_dm00_JiekeXu1
JIEKEUR1:[JiekeXu1]/newbackup/Jieke$
JIEKEUR1:[JiekeXu1]/newbackup/Jieke$ kill -9 60687002
JIEKEUR1:[JiekeXu1]/newbackup/Jieke$ ps -ef | grep smon
echo $ORACLE_SID
sqlplus / as sysdba
root 9961656 1 24 Nov 16 - 2567:10 /app/product/11.2.0/grid/bin/osysmond.bin
grid 9306526 1 0 Nov 16 - 0:33 asm_smon_+ASM1
oracle 14352698 1 0 Nov 16 - 6:27 ora_smon_JiekeXu1
oracle 23069710 51642682 0 22:44:14 pts/11 0:00 grep smon
[1] + Done(1) nohup expdp \"/ as sysdba\" directory=EXP_Jieke_DIR logfile=exp_to_AC_T_CLAIMTASK.log dumpfile=AC_T_CLAIMTASK_%U.dmp tables=KHYX_ECIF.AC_T_CLAIMTASK &
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL> set lines 300
SQL> col OWNER_NAME for a10
SQL> col OPERATION for a15
SQL> col JOB_MODE for a20
col STATE for a15
SQL> SQL> select * from dba_datapump_jobs;
OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE DEGREE ATTACHED_SESSIONS DATAPUMP_SESSIONS
---------- ------------------------------ --------------- -------------------- --------------- ---------- ----------------- -----------------
SYS SYS_EXPORT_TABLE_02 EXPORT TABLE NOT RUNNING 0 0 0
SYS SYS_EXPORT_SCHEMA_02 EXPORT SCHEMA NOT RUNNING 0 0 0
SYS SYS_EXPORT_TABLE_01 EXPORT TABLE NOT RUNNING 0 0 0
SQL> select 'drop table '||OWNER_NAME||'.'||JOB_NAME||' purge;' from dba_datapump_jobs where STATE='NOT RUNNING';
'DROPTABLE'||OWNER_NAME||'.'||JOB_NAME||'PURGE;'
-------------------------------------------------------------------------------
drop table SYS.SYS_EXPORT_TABLE_02 purge;
drop table SYS.SYS_EXPORT_SCHEMA_02 purge;
drop table SYS.SYS_EXPORT_TABLE_01 purge;
--执行结果用来执行,再次查看结果为空:
SQL> select * from dba_datapump_jobs;
no rows selected
不管是导入用户还是单独导出一个表到此文件系统均会出现卡住的现象,但是当我测试导出一张表到本地文件系统时很快就导出了,没有任何报错,此时便可定位是由于此文件系统挂载问题了。那么便需要卸载此文件系统重新加参数挂载即可,这个方式上文提到过,可戳此查看:
使用数据泵导出时遇到 ORA-27054 错误解决办法
你以为就这样结束了吗?要是这么容易我也就不用加班了哈,继续往下看吧。当 AIX 操作系统工程师加参数挂载完后导出还是一样的问题,而且在挂载时还将 buffer 参数调整至 65535 也没有任何作用。
后面看到 MOS 有篇文章说 AIX 挂载 NFS 文件系统有问题,解决办法竟然是禁用 NFS 或者存储文件到本地。。。之前也使用 AIX 挂载文件系统多次未发现问题,感觉这个有点扯,便没有再去理会这个了,继续查询下一个。DataPump Export/Import Hangs With "DEFINING" Status When Using A Directory On NFS Filesystem (文档 ID 2262196.1)
另一篇 Data Pump Hanging When Exporting To NFS Location (Doc ID 434508.1)中说需要添加 llock 本地锁,但是由于操作系统上没有 clear_locks 命令,便放弃了此方案。
服务器上的NFS锁存在一些问题。为nfs共享添加“llock”(llock是本地锁)选项通常可以清除数据泵挂起的情况。如果不能解决问题,那么在承载NFS挂载驱动器的服务器上运行以下操作并清除锁。在承载NFS挂载驱动器的服务器上运行以下操作,清除它们并允许成功地将expdp作业运行到NFS位置。
后面问题还是没有解决,突然想起了前文中提到的设置 event 10298 来禁用 NFS 检查功能,经过测试设置此事件对于前文中 ORA-27054 是有作用的,但此时设置后也没有任何作用而且设置此事件对于有损坏的数据不会做检测,导致导出的数据有损坏也无法检查有一定的危险性,这里还是取消好点。以下是设置过程,以及查看所有的 event 设置以及取消 event 10298 过程,此方法小伙伴们可收藏哦。
SQL> alter system set events '10298 trace name context forever, level 32';
System altered.
SQL> set serveroutput on size 1000000
SQL> declare
2 event_level number;
begin
for i in 1..100000 loop
sys.dbms_system.read_ev(i,event_level);
if (event_level > 0) then
dbms_output.put_line('Event '||to_char(I)||' set at level '||
to_char(event_level));
3 4 5 6 7 8 9 end if;
end loop;
end;
/
10 11 12 Event 10298 set at level 32
Event 10949 set at level 1
Event 28401 set at level 1
PL/SQL procedure successfully completed.
SQL> alter system set events '10298 trace name context off';
System altered.
SQL> set serveroutput on size 1000000
SQL> declare
2 event_level number;
begin
for i in 1..100000 loop
sys.dbms_system.read_ev(i,event_level);
if (event_level > 0) then
dbms_output.put_line('Event '||to_char(I)||' set at level '||
to_char(event_level));
end if;
3 4 5 6 7 8 9 10 end loop;
11 end;
/ 12
Event 10949 set at level 1
Event 28401 set at level 1
PL/SQL procedure successfully completed.
最后,还是感觉 NFS 的问题,但实在没办法了,请公司专家协助,建议加参数 llock 重新挂载 NFS 文件系统尝试导出成功了,这时也恍然大悟了,加参数 llock 原来如此,mount -F nfs -o vers=3,llock,rw,bg,hard ……
JIEKEUR1:/#fuser -cu /newbackup
/newbackup: 13566598c(oracle)
fuser -ck /newbackup
umount /newbackup
su - oracle
mount -F nfs -o vers=3,llock,rw,bg,hard,nointr,rsize=65535,wsize=65535,timeo=600,actimeo=1 10.1x.xx.xx:/bakup-new /newbackup
查看 /etc/filesystems 及 mount 挂载方法
llock 本地锁原来如此,llock:Requests that files lock locally at the NFS client. NFS network file locking requests are not sent to the NFS server if the llock option is used.如果使用 lloc k选项,请求文件在 NFS 客户端本地锁定。NFS 网络文件锁定请求不发送到NFS 服务器。
最后总结下,还有一个小问题就是 mount 挂载时,尽量要挂载到二级目录,现在 mount 到了一级目录,如果 NFS 挂了可能导致整个 OS 挂了。还有,如果有时间可以测试一下"rw,bg,hard,rsize=32768,wsize=32768,vers=4,cio,intr,timeo=600,proto=tcp"
本次问题应该是:vers=3导致的,如果 vers=4 不加 llock 本地锁也就避免了此问题。
参考链接:
Data Pump Hanging When Exporting To NFS Location (Doc ID 434508.1)
DataPump Export/Import Hangs With "DEFINING" Status When Using A Directory On NFS Filesystem (Doc ID 2262196.1)
Collecting The Required Information For Support To Troubleshot DNFS (Direct NFS) Issues (11.1, 11.2 & 12c). (Doc ID 1464567.1)
Data Pump Export (EXPDP) Hangs on OCFS2 Creating a 4 KB Dump File (Doc ID 1371783.1)
今天的分享就到这里了,压箱底的都拿出来了,如果本文对您有一丁点儿帮助,请多支持“在看”与转发,不求小费了哪怕是一个小小的赞,您的鼓励都将是我熬夜写文章最大的动力,让我有一直写下去的动力,最后一起加油,奥利给!
————————————————————————————