您的位置:首页 > 其它

不能在逻辑STANDBY上创建JOB

2012-01-18 15:51 543 查看
不能在逻辑STANDBY上创建JOB

想在逻辑STANDBY上创建几个job,做一些数据处理的工作,结果创建的时候出现insufficient privileges错误,后面跟着的是调用SYS.DBMS_INTERNAL_LOGSTDBY的123行的时候出现错误。这是啥原因呢?

首先想到的是用户没有创建job的权限,于是GRANT CREATE JOB TO USER,还是不行。

然后想到会不会是因为GUARD的原因呢,于是ALTER DATABASE GUARD NONE,还是不行。

然后想到是否是没有执行DBMS_INTERNAL_LOGSTDBY的权限,但不应该啊,如果没权限的话会直接报没权限的,不会执行到一半出现错误,但还是GRANT ALL ON DBMS_INTERNAL_LOGSTDBY TO USER了一把,再次运行,还是出错。

打开DBMS_INTERNAL_LOGSTDBY,想看看123行是执行什么东西的时候出错,结果发现代码是加密的,晕倒。

看来还是去metalink吧,上面找到一个关于DATA GUARD CONCEPT AND ADMIMISTRATION上的一段话:

Oracle PL/SQL supplied packages that modify system metadata typically are not

supported by SQL Apply, and therefore their effects are not visible on the logical

standby database. Examples of such packages are DBMS_JAVA, DBMS_REGISTRY,

DBMS_ALERT, DBMS_SPACE_ADMIN, DBMS_REFRESH, DBMS_REDEFINITION, DBMS_

SCHEDULER, and DBMS_AQ.

Specific support for DBMS_JOB has been provided. Job execution is suspended on a

logical standby database and jobs cannot be scheduled directly on the standby

database. However, jobs submitted on the primary database are replicated in the

standby database. In the event of a switchover or failover, jobs scheduled on the

original primary database will automatically begin running on the new primary

database.

就是说,有些包因为是在SYS用户下,所以是不会被传到LOGICAL STANDBY上来的,但是DBMS_JOB是传过来的,虽然传过来了,但是是给切换后的job执行用的,里面说:

Job execution is suspended on a logical standby database and jobs cannot be scheduled directly on the standby database.

也就是说不能在逻辑STANDBY上创建JOB,晕,终于找到了官方的说法了。

可是为啥不能创建job呢?论坛上找到一个说法,说是因为创建job的时候job的id是oracle自动编号的,所以如果允许的话,可能会引起主库和LOGICAL STANDBY库上的ID冲突,和我想的差不多,不过这也太牵强了,为啥不能做一个可以手工指定id的创建job的方式呢?看来问题可能不是ID冲突这么简单了。

作为替代,可以在CRONTAB中来实现这些JOB类似的功能。

http://zhang41082.itpub.net/post/7167/461793
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: