我目前正在为我的团队系统开发内务解决方案。
整体解决方案符合我的预期。但是当我检查日志文件时,它显示如果我连续运行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 任务是否有特定的名称模式?
即使在 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 参数中指定的所有表名应驻留在同一架构中。