OGG DDL触发器引发的故障系列(一)

时间:2022-07-03 01:13:09

故障现象:

数据库所有ddl操作无法成功,无法编译任何包 包括 grant、alter、impdp/expdp、drop、truncate等操作。


排查步骤:

确认报错

SQL> drop user test cascade;
drop user test cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01950: no privileges on tablespace 'ODC_TPS'
ORA-06512: at line 999
ORA-01950: no privileges on tablespace 'ODC_TPS'
 
SQL> grant dba to odc;
grant dba to odc
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01950: no privileges on tablespace 'ODC_TPS'
ORA-06512: at line 999
ORA-01950: no privileges on tablespace 'ODC_TPS'

可以看到报错, 没有对 ODC_TPS表空间的权限。

进一步检查该表空间的信息:

SQL> SELECT t.owner, t.segment_name,SUM(bytes)/1024/1024 From dba_segments t 
  2  WHERE t.tablespace_name = 'ODC_TPS'
  3  GROUP BY t.owner,t.segment_name
  4  ORDER BY SUM(bytes) desc;
OWNER                SEGMENT_NAME         SUM(BYTES)/1024/1024
-------------------- -------------------- --------------------
ODC                  GGS_MARKER                            104
ODC                  GGS_DDL_HIST                            8
ODC                  SYS_C0011139                            4
ODC                  GGS_MARKER_IND1                         2
ODC                  GGS_DDL_HIST_i4                       .25
ODC                  GGS_DDL_HIST_i2                     .1875
ODC                  GGS_DDL_HIST_i5                     .1875
ODC                  GGS_DDL_HIST_i6                      .125
ODC                  GGS_DDL_HIST_i3                      .125
ODC                  GGS_DDL_HIST_i1                      .125
ODC                  GGS_DDL_HIST_INDEX1                  .125
ODC                  GGS_DDL_HIST_ALT_u2                 .0625
ODC                  GGS_SETUP_UKEY                      .0625
ODC                  SYS_C0017453                        .0625
ODC                  GGS_CHECKPOINT                      .0625
ODC                  GGS_DDL_HIST_ALT_u3                 .0625
ODC                  GGS_SETUP                           .0625
ODC                  GGS_DDL_HIST_ALT_u1                 .0625
ODC                  GGS_DDL_HIST_ALT                    .0625

该表空间为ODC用户所使用,且ODC为ogg的管理用户,进一步确认是否开启了ogg的DDL同步:

SQL> select OWNER,TRIGGER_NAME,STATUS from dba_triggers where TRIGGER_NAME='GGS_DDL_TRIGGER_BEFORE';
OWNER      TRIGGER_NAME                   STATUS
---------- ------------------------------ --------
SYS        GGS_DDL_TRIGGER_BEFORE         ENABLED

ogg的DDL触发器存在且是enabled状态,ogg是开启ddl同步的。

 

安装ogg软件时,如果需要同步DDL操作,则需要安装DDL的相关组件,安装了DDL的组件后,就会在sys用户下创建一个DDL触发器,用来捕获ddl操作并保存到ogg管理用户下的相应表中。

 

排查到这一步就已经比较明显了,当数据库中有ddl操作时,ddl的触发器需要将这一操作记录到odc用户下的相关表中(所在的表空间是ODC_TPS),但是当前odc用户在该表空间上没有配额,导致以上报错。

 

尝试先将dba权限给ogg的管理用户,但是赋予权限失败,报错如下:

SQL> grant dba to odc;
grant dba to odc
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01950: no privileges on tablespace 'ODC_TPS'
ORA-06512: at line 999
ORA-01950: no privileges on tablespace 'ODC_TPS'

看到相同的报错。

尝试给odc用户赋权限,由于赋权限操作属于ddl无法完成,所以要先禁用ogg的ddl触发器,赋权限后在开启。

login as sysdba
SQL>alter trigger GGS_DDL_TRIGGER_BEFORE disable;
SQL>alter user odc quota unlimited on odc_tps;
SQL>alter trigger GGS_DDL_TRIGGER_BEFORE enable;

赋权限后即可进行ddl、编译等操作,问题解决。

 

参考文档:

DDL fails because of GoldenGate DDL trigger with error: ORA-01950: no privileges on tablespace ( 文档  ID 1513413.1)