Oracle数据库导出时如何过滤指定作业,区分DBMS_JOB与DBMS_SCHEDULER作业
Oracle 10g两类作业区分及导出跳过方案
两类作业的区分方法
两类作业的元数据完全独立,本身天然隔离,不需要额外做特殊识别:
- DBMS_JOB创建的旧作业:元数据存储在
ALL_JOBS/DBA_JOBS视图中,对象类型为JOB,所有旧作业的ID都是纯数字序列值 - DBMS_SCHEDULER创建的新作业:元数据存储在
ALL_SCHEDULER_JOBS/DBA_SCHEDULER_JOBS视图中,对象类型为SCHEDULER JOB,支持自定义命名,作业标识为字符串格式
导出前可以直接通过两个视图批量核对两类作业清单:
-- 查询所有DBMS_JOB旧作业 SELECT job, what FROM dba_jobs; -- 查询所有DBMS_SCHEDULER新作业 SELECT owner, job_name FROM dba_scheduler_jobs;
跳过指定作业的导出方案
方案1:使用expdp数据泵导出(推荐,10g原生支持)
数据泵支持通过EXCLUDE参数直接指定排除的作业类型或特定作业:
- 跳过所有DBMS_JOB旧作业:添加参数
EXCLUDE=JOB - 跳过所有DBMS_SCHEDULER新作业:添加参数
EXCLUDE=PROCOBJ - 跳过指定的单个作业示例:
# 跳过ID为123的DBMS_JOB旧作业 expdp 用户名/密码 DIRECTORY=导出目录 DUMPFILE=全量导出.dmp FULL=Y EXCLUDE=JOB:"=123" # 跳过户SCOTT名下名为TEST_JOB的DBMS_SCHEDULER新作业 expdp 用户名/密码 DIRECTORY=导出目录 DUMPFILE=全量导出.dmp FULL=Y EXCLUDE=PROCOBJ:"IN (SELECT object_name FROM dba_objects WHERE object_type='PROCOBJ' AND owner='SCOTT' AND object_name='TEST_JOB')"
注意:Windows环境下执行命令时,参数内的双引号需要添加转义符,或者直接把参数写入parfile参数文件中避免转义冲突。
方案2:使用传统exp/imp导出
传统导出工具不支持直接排除作业,可以先全量导出,导入到测试实例之后再手动删除不需要的作业:
-- 删除ID为123的DBMS_JOB旧作业 EXEC dbms_job.remove(123); COMMIT; -- 删除SCOTT.TEST_JOB的DBMS_SCHEDULER新作业 EXEC dbms_scheduler.drop_job('SCOTT.TEST_JOB');
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

