发表于: 2008.10.05 20:47
分类: ORACLE , Bug
出处: http://yangtingkun.itpub.net/post/468/471695
---------------------------------------------------------------
发现数据泵一个奇怪的错误。数据泵的交互模式下,停止数据泵命令时,输入确认的命令无效。
直接描述问题不是很容易说清楚,还是直接看例子:
E:dmp>expdp yangtk/yangtk dumpfile=d_output:full.dp full=y
Export: Release 10.2.0.1.0 - Production on 星期日, 05 10月, 2008 15:51:22
Copyright (c) 2003, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options启动 "YANGTK"."SYS_EXPORT_FULL_01": yangtk/******** dumpfile=d_output:full.dp f
ull=y正在使用 BLOCKS 方法进行估计...处理对象类型 DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
ORA-39139: 数据泵不支持 XMLSchema 对象。将跳过 TABLE_DATA:"OE"."PURCHASEORDER"。
使用 BLOCKS 方法的总估计: 0 KB处理对象类型 DATABASE_EXPORT/TABLESPACE处理对象类型 DATABASE_EXPORT/PROFILE处理对象类型 DATABASE_EXPORT/SYS_USER/USER处理对象类型 DATABASE_EXPORT/SCHEMA/USER处理对象类型 DATABASE_EXPORT/ROLE处理对象类型 DATABASE_EXPORT/GRANT/SYSTEM_GRANT/PROC_SYSTEM_GRANT处理对象类型 DATABASE_EXPORT/SCHEMA/GRANT/SYSTEM_GRANT处理对象类型 DATABASE_EXPORT/SCHEMA/ROLE_GRANT处理对象类型 DATABASE_EXPORT/SCHEMA/DEFAULT_ROLE处理对象类型 DATABASE_EXPORT/SCHEMA/TABLESPACE_QUOTA处理对象类型 DATABASE_EXPORT/RESOURCE_COST处理对象类型 DATABASE_EXPORT/SCHEMA/DB_LINK处理对象类型 DATABASE_EXPORT/TRUSTED_DB_LINK处理对象类型 DATABASE_EXPORT/SCHEMA/SEQUENCE/SEQUENCE处理对象类型 DATABASE_EXPORT/SCHEMA/SEQUENCE/GRANT/OWNER_GRANT/OBJECT_GRANT处理对象类型 DATABASE_EXPORT/DIRECTORY/DIRECTORY处理对象类型 DATABASE_EXPORT/DIRECTORY/GRANT/OWNER_GRANT/OBJECT_GRANT处理对象类型 DATABASE_EXPORT/CONTEXT处理对象类型 DATABASE_EXPORT/SCHEMA/PUBLIC_SYNONYM/SYNONYM处理对象类型 DATABASE_EXPORT/SCHEMA/SYNONYM处理对象类型 DATABASE_EXPORT/SCHEMA/TYPE/INC_TYPE处理对象类型 DATABASE_EXPORT/SCHEMA/TYPE/TYPE_SPEC处理对象类型 DATABASE_EXPORT/SYSTEM_PROCOBJACT/PRE_SYSTEM_ACTIONS/PROCACT_SYSTEM
处理对象类型 DATABASE_EXPORT/SYSTEM_PROCOBJACT/POST_SYSTEM_ACTIONS/PROCACT_SYSTE
M处理对象类型 DATABASE_EXPORT/SCHEMA/PROCACT_SCHEMA处理对象类型 DATABASE_EXPORT/SCHEMA/TABLE/TABLE
Export> stop_job是否确实要停止此作业 ([Y]/N): N是否确实要停止此作业 ([Y]/N): n是否确实要停止此作业 ([Y]/N): N是否确实要停止此作业 ([Y]/N):
E:dmp>
在执行数据泵的导出过程中,使用CTRL+C进入交互模式,使用STOP_JOB来停止JOB的运行,但是在提示“是否确认要停止此作业([Y]/N):”处,输入大写N和小写n都没有任何作用,也就是说,一旦执行了STOP_JOB,再想反悔就不行了。
其实并非是输入N无效,输入Y也是无效的:
E:dmp>expdp yangtk/yangtk attach=SYS_EXPORT_FULL_01
Export: Release 10.2.0.1.0 - Production on 星期日, 05 10月, 2008 16:36:22
Copyright (c) 2003, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
作业: SYS_EXPORT_FULL_01
所有者: YANGTK
操作: EXPORT
创建者权限: FALSE
GUID: 8FE8B91599634CAA9A7061ED2CBACE68
起始时间: 星期日, 05 10月, 2008 16:36:31
模式: FULL
实例: ytk102
最大并行度: 1
EXPORT 个作业参数:
参数名 参数值:
CLIENT_COMMAND yangtk/******** dumpfile=d_output:full.dp full=y
状态: IDLING
处理的字节: 0
当前并行度: 1
作业错误计数: 0
转储文件: e:dmpfull.dp
写入的字节: 5,795,840
Worker 1 状态:
状态: UNDEFINED
Export> start_job
Export> stop_job是否确实要停止此作业 ([Y]/N): y是否确实要停止此作业 ([Y]/N): Y是否确实要停止此作业 ([Y]/N): T是否确实要停止此作业 ([Y]/N): F是否确实要停止此作业 ([Y]/N):
E:dmp>
根据例子可以看到,实际上输入任何的值都没有作用。
其实问题根源在于中午翻译的bug,将环境变量的语言设置为英文:
E:dmp>SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
E:dmp>expdp yangtk/yangtk attach=SYS_EXPORT_FULL_01
Export: Release 10.2.0.1.0 - Production on Sunday, 05 October, 2008 16:39:39
Copyright (c) 2003, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Produc
tion
With the Partitioning, OLAP and Data Mining options
Job: SYS_EXPORT_FULL_01
Owner: YANGTK
Operation: EXPORT
Creator Privs: FALSE
GUID: 8FE8B91599634CAA9A7061ED2CBACE68
Start Time: Sunday, 05 October, 2008 16:39:41
Mode: FULL
Instance: ytk102
Max Parallelism: 1
EXPORT Job Parameters:
Parameter Name Parameter Value:
CLIENT_COMMAND yangtk/******** dumpfile=d_output:full.dp full=y
State: IDLING
Bytes Processed: 63,165,968
Current Parallelism: 1
Job Error Count: 0
Dump File: e:dmpfull.dp
bytes written: 70,000,640
Worker 1 Status:
State: UNDEFINED
Export> start_job
Export> stop_job
Are you sure you wish to stop this job ([yes]/no): no
Export> stop_job
Are you sure you wish to stop this job ([yes]/no): yes
E:dmp>
可以看到问题的真正原因在于Oracle的中午翻译将YES/NO选项简写为Y/N,从而导致了似乎任何输入都无效的结果。
E:dmp>SET NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
E:dmp>expdp yangtk/yangtk attach=SYS_EXPORT_FULL_01
Export: Release 10.2.0.1.0 - Production on 星期日, 05 10月, 2008 16:46:36
Copyright (c) 2003, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
作业: SYS_EXPORT_FULL_01
所有者: YANGTK
操作: EXPORT
创建者权限: FALSE
GUID: 8FE8B91599634CAA9A7061ED2CBACE68
起始时间: 星期日, 05 10月, 2008 16:46:38
模式: FULL
实例: ytk102
最大并行度: 1
EXPORT 个作业参数:
参数名 参数值:
CLIENT_COMMAND yangtk/******** dumpfile=d_output:full.dp full=y
状态: IDLING
处理的字节: 64,529,008
当前并行度: 1
作业错误计数: 0
转储文件: e:dmpfull.dp
写入的字节: 71,696,384
Worker 1 状态:
状态: UNDEFINED
Export> START_JOB
Export> STOP_JOB是否确实要停止此作业 ([Y]/N): NO
Export> STOP_JOB是否确实要停止此作业 ([Y]/N): YES
E:dmp>
将环境变为中文继续测试,输入YES和NO果然可以正确的执行,看来确实是中文环境翻译造成的。
以前也碰到过中文翻译时出现错误的情况,看来Oracle的本地化实现还是存在不少bug的。











