故障现象:
数据库所有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)