今天开发提了一个需求,他们想在DG上做一些统计,但希望把DG库中的两个临时表的写权限放开,便于一些特殊的统计。这么干合理不合理就不说了,为了老板们还得先解决问题。
首先发现应用那边执行insert报ORA-16224的错误,检查guard_status现实是all,因为没有搞定查询用的用户执行alter session disable guard的权限问题,因此选择使用skip来解决。
执行方法为:
alter database stop logical standby apply;
execute dbms_logstdby.skip('SCHEMA_DDL','OWNER1','TABLE1');
execute dbms_logstdby.skip('DML','OWNER1','TABLE1');
execute dbms_logstdby.skip('SCHEMA_DDL','OWNER2','TABLE2');
execute dbms_logstdby.skip('DML','OWNER2','TABLE2');
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
alter database guard standby;
再次尝试insert成功,其余update和delete也没有问题了。这里将guard_statusshe设置为standby的目的就是让sys以外的用户可以修改不被guard保护的对象。查看dba_logstdby_skip视图可以看到被skip的对象。
此问题解决后,突然发生的新的问题,由于自己的“手欠”,呵呵。一直想搞清楚alter session disable guard权限的问题,在尝试给那个用户赋予了sysdba时导致apply进程中断了,日志里面报错:
Errors in file /home/db/oracle/app/admin/CISG/bdump/cisg2_lsp0_762210.trc:
ORA-12801: error signaled in parallel query server P004
ORA-01031: insufficient privileges
LOGSTDBY Analyzer process P003 pid=37 OS id=696830 stopped
LOGSTDBY Apply process P006 pid=40 OS id=471434 stopped
LOGSTDBY Apply process P005 pid=39 OS id=835976 stopped
LOGSTDBY Apply process P007 pid=41 OS id=332118 stopped
LOGSTDBY Apply process P008 pid=42 OS id=475588 stopped
由于是grant引起的问题,因此需要用exec DBMS_LOGSTDBY.SKIP('NON_SCHEMA_DDL');
把执行不过去的这个ddl跳开(这里比较怪异的是正常来讲会出现LOGSTDBY id的信息,然后可以根据
后面写xid号使用DBMS_LOGSTDBY.SKIP_TRANSACION来解决(16进制数转换为10进制),这次的问题
并没有出现),执行命令为:
alter database stop logical standby apply;
exec DBMS_LOGSTDBY.SKIP('NON_SCHEMA_DDL');
alter database start logical standby apply immediate;
日志中出现了ORA-16205: DDL skipped due to skip setting的相关信息,说明处理生效了。
之后要使用DBMS_LOGSTDBY.UNSKIP('NON_SCHEMA_DDL');命令,不然以后的ddl都不生效了。
感觉DG这东西虽然省钱了,但各种限制过多,莫名其妙的问题也不少,如果不缺资金还是用第三方的一些工具来的省事。呵呵。
阅读(3219) | 评论(0) | 转发(0) |