跟踪 cronjob 中运行的 expdp 任务状态

问题描述 投票:0回答:1

我目前正在为我的团队系统开发内务解决方案。

整体解决方案符合我的预期。但是当我检查日志文件时,它显示如果我连续运行expdp(因为我需要一次转储一张表,因为它们有不同的条件来导出数据),expdp或运行的任务看起来很忙并跳过一些表,我需要访问数据库服务器以在早上手动运行那些转储失败的表。

当我手动运行时,我观察到如果在转储上一个表后过早运行 expdp,它会抛出这些错误

Export: Release 19.0.0.0.0 - Production on Mon May 13 13:54:39 2024
Version 19.17.0.0.0
 
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
 
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation: nonexistent file or path [29434]

看来之前的expdp任务可能还没有完成处理某些东西(但是转储文件和日志文件已经完成生成)。我尝试在每次运行之间添加延迟(

sleep 60
)(无论是在shell脚本中还是手动运行),情况变得更好,expdp错误更少,但如果表真的很大,它仍然无法转储(也许我可以添加更多延迟,但会延长任务持续时间,这对于 24/7 运行的系统来说不是一个好方法)

所以我有了一个想法,我将有一个函数来检查 oracle datapump 任务是否仍在运行,方法是使用

ps -ef | grep <sth like data pump task>

(也许每15秒检查一次),如果命令找不到执行expdp的任务,则开始转储下一个表。

但我不确定该 expdp 任务是否有特定的名称模式?

shell cron oracle19c expdp
1个回答
0
投票

即使在 where 子句中有不同的条件,您也可以尝试在一个数据泵作业中导出多个表

File: <PARFILE_NAME>.par
-----------------
DIRECTORY = my_dir
DUMPFILE  = exp_query.dmp
LOGFILE   = exp_query.log
SCHEMAS   = hr, scott
INCLUDE   = TABLE:"IN ('EMP', 'DEPARTMENTS')"
QUERY     = scott.emp:"WHERE job = 'ANALYST' OR sal >= 3000"
# place following 3 lines on one single line:
QUERY     = hr.departments:"WHERE department_id IN (SELECT DISTINCT
department_id FROM hr.employees e, hr.jobs j WHERE e.job_id=j.job_id
AND UPPER(j.job_title) = 'ANALYST' OR e.salary >= 3000)"


-- Run Export DataPump job:

%expdp system/<PASSWORD> parfile=<PARFILE_NAME>.par

请注意,在此示例中不能使用 TABLES 参数,因为在 TABLES 参数中指定的所有表名应驻留在同一架构中。

© www.soinside.com 2019 - 2024. All rights reserved.