Windows 2012 标准版上的 Oracle 11.2.0.1.0:
expdp '/ as sysdba' full=y directory=exp dumpfile=... logfile=... flashback_time=systimestamp
失败:
ORA-39001: invalid argument value
ORA-39150: bad flashback time
ORA-01841: (full) year must be between -4713 and +9999, and not be 0
ORA-01877: string is too long for internal buffer
替换AFAIK 是一种向后兼容的方式来表示相同的确切内容也会失败并出现相同的错误flashback_time=systimestamp
。consistent=y
完全删除这些选项,无需其他更改,使其工作。
不过,除了 RMAN 之外,我还想进行一致的备份,是的,我确实已经配置并工作了。网上有各种建议的解决方法。例如使用to_timestamp
但它们似乎都没有工作。
我的问题是:
- 这是一个已知的错误?
- 是否有任何设置可能导致这种行为,如系统语言环境?
- 我正在使用这个脚本的一个稍微修改过的版本,我发誓就在昨天它工作得很好。我不记得改变任何东西,今天它不起作用。有任何想法吗?
- 有可靠的解决方法吗?我正在考虑使用
flashback_scn
,但这需要事先单独查询。
编辑:
加倍强调这里的怪异之处。每天:
- 00:00-11:59 - 错误如上
- 12:00-23:59 - 一切正常
我昨天晚上反复运行脚本flashback_time=systimestamp
- 没有错误。今天早上 7:45 再次从同一个脚本中得到错误,没有修改。
刚刚看了一下文档。
它说:
所以 SYSTIMESTAMP 应该实际工作......虽然文档建议您需要将参数括在引号中。尝试:
谜团已揭开。我有机会询问了一位为我们做一些咨询工作的 Oracle DBA。事实证明,这很可能是 Oracle 如何处理本地化时间戳中的空格的错误。一个简单的解决方法是
set NLS_LANG=american_america.ee8iso8859p2
在运行expdp
.