在实际工作过程中,很多时候我们会使用逻辑导出(expdp)很逻辑导入(impdp)的方式对数据库进行操作,但是无论是导出还是导入进行到了哪一步,具体百分比是多少,或者说还没有导出完成到了业务高峰,我们想对导出任务进行暂停操作(发现ctrl+c好像并没有真正打断导出任务),在业务低峰期我们还想继续进行导出操作等,这个时候我们会用到为导入或者导出附加一个任务名。
此文中将会涉及到使用expdp导出的方式对Job_name做演示,impdp的操作大同小异,具体过程记录如下。
1、在使用impdp或者expdp的时候,需要首先在数据库里面创建目录
1.1、查看现有目录
select * from dba_directories;
1.2、创建目录
1.3、给目录授权,让数据库用户对其有读写权限
2、利用Job_nam对datapunp任务进行管理
2.1、查询现有数据库datapump任务,发现默认存在一个未运行的任务
2.2、执行一个带任务名为xiaozc_job的全库导出任务
expdp xiaozc/xiaozc directory=xiaozc dumpfile=xiaozc_%U.dmp parallel=4 job_name=xiaozc_job full=y
执行完成后对dba_datapump_jobs尽心查询,发现已经有了xiaozc_job的任务,状态为正在执行
2.3、通过expdp附加任务名查看导出任务作业的具体情况
C:\Users\Administrator>expdp xiaozc/xiaozc attach=xiaozc_job
Export: Release 11.2.0.4.0 - Production on 星期日 6月 12 18:57:13 2022
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
作业: XIAOZC_JOB --可以查看到作业名
所有者: XIAOZC --可以看到执行任务的所有者
操作: EXPORT --可以看到执行的操作为export
创建者权限: TRUE
GUID: 20C5E51B87E44EB9BC1D26C66C16BFAF
开始时间: 星期日, 12 6月, 2022 18:55:10
模式: FULL
实例:xiaozc
最大并行度: 4
EXPORT 个作业参数:
参数名 参数值:
CLIENT_COMMAND xiaozc/******** directory=xiaozc dumpfile=xiaozc_%U.dmp parallel=4 job_name=xiaozc_job full=y
状态: EXECUTING
处理的字节: 2,804,862,104
完成的百分比: 9 --可以看到整体任务完成的百分比
当前并行度: 4
作业错误计数: 0
转储文件: F:\databak\xiaozc_%u.dmp
转储文件: F:\DATABAK\XIAOZC_01.DMP
写入的字节: 2,804,871,168
转储文件: F:\DATABAK\XIAOZC_02.DMP
写入的字节: 4,096
转储文件: F:\DATABAK\XIAOZC_03.DMP
写入的字节: 4,096
转储文件: F:\DATABAK\XIAOZC_04.DMP
写入的字节: 4,096
Worker 1 状态: --可以看到某个进程的具体状态
进程名: DW00
状态: EXECUTING
对象类型: DATABASE_EXPORT/SCHEMA/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
完成的对象数: 2,389
总的对象数: 2,389
Worker 并行度: 1
Worker 2 状态:
进程名: DW01
状态: EXECUTING
对象方案: ERIS
对象名: ERIS_EXAM_BG
对象类型: DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
完成的对象数: 1
总的对象数: 1,430
完成的行数: 1,377,729
Worker 并行度: 1
Worker 3 状态:
进程名: DW02
状态: EXECUTING
对象方案: ERIS
对象名: ERIS_UIS_EXAM_BG
对象类型: DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
完成的对象数: 1
总的对象数: 1,430
完成的行数: 302,392
Worker 并行度: 1
Worker 4 状态:
进程名: DW03
状态: EXECUTING
对象方案: ERIS
对象名: N_ERIS_UIS_EXAM_BG
对象类型: DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
完成的对象数: 4
总的对象数: 1,430
完成的行数: 61,560
Worker 并行度: 1
Export>
2.4、通过任务名暂停expdp导出任务
2.4.1、Export>stop_job,用此命令,首先需要在导出界面使用ctrl+c,若没有ctrl+c,直接使用stop_job,会在stop pending状态下停留一段时间。
停留在stop pending下的原因是:To perform an orderly shutdown, use STOP_JOB (without any associated value). A warning requiring confirmation will be issued. An orderly shutdown stops the job after worker processes have finished their current tasks.
Export>stop_job,选择Y停止任务,如图:
但是此种方式停止任务后发现导出进程的状态如下,处于stop pending状态,进程处于waiting,如下:
只用当所有进程任务停止后,xiaozc_job任务的状态才成了idling,进程才变成未定义状态,如下:
在切换为导出数据库界面,发现已经停止了任务,如下:
在数据库里面查询数据泵任务,查询结果为xiaozc_job为idling,如下:
2.4.2、 STOP_JOB=IMMEDIATE停止任务
查看导出作业状态,如下:
查看datapump视图作业状态,如下:
查看导出文件大小,刷新发现已经不在改变大小,如图:
重启导出任务,使导出继续运行,重启命令如下:
在数据库里面查看作业任务的状态,发现为执行状态,如下所示:
经过一段时间,数据库导出完成,如下所示:
查看数据文件导出大小,比停止时有所增大,如下图:
3、总结
发现在停止作业的过程中STOP_JOB=IMMEDIATE命令比较好用,不加参数不会立即停止各进程的导出任务,没有任务的进程需要等待有任务的进程完成当前任务。