作者简介

石云华,Exadata中国用户组联合创始人,ORACLE ACE。毕业后一直从事Oracle数据库第三方运维服务工作,拥有十余年电信运营商、保险、税务、电力行业核心系统数据库运维经验。现就职于北京海天起点技术服务股份有限公司,oracle数据库专家组成员,Exadata部门负责人。个人著作有《Exadata实施运维指南》,《Oracle Exadata性能优化》

GoldenGate这款数据同步工具,无论是在安装部署,还是在数据抽取及复制的过程中,都需要与数据库进行交互,在一些极端情况下,GoldenGate出现故障时,GoldenGate自身的日志信息可能仍然无法定位故障原因。此时,就需要借助于数据库的诊断工具,进一步获取更多的日志信息来帮助诊断故障。

以下这个案例,就是巧用数据库工具来帮助分析GoldenGate故障的一个精典案例。

案例概要:

在配置GoldenGate的过程中,运行REGISTER EXTRACT命令来注册某个Extract进程时报错,错误信息如下所示。

ERROR   OGG-01755  Cannot register or unregister EXTRACT EXTA1 because of the following SQL error: OCI Error 26,723. See Extract user privileges in the Oracle GoldenGate for Oracle Installation and Setup Guide. GGSCI (yun) 5>

案例分析及处理:

(1)、从错误日志来看,错误描述非常简单,只是提及SQL error: OCI Error 26,723. 但不清楚这个错误的含义,让参考GoldenGate的安装手册,权限不够,但完全按照手册中的权限,仍然出现该问题.

(2)、这时,我们应该怎么办?首先,我们要知道,GoldenGate发出的命令,最终都会解析成数据库相应的命令,在数据库中运行,所以我们需要知道这个REGISTER EXTRACT命令,在数据库底层到底做了哪些事情。

尝试跟踪发出该命令的数据库底层会话的详细信息,发出REGISTER EXTRACT命令前,查看关于GoldenGate软件的数据库会话,如下所示。

SQL> select sid, prev_sql_id, sql_id, event, blocking_session, state  2    from v$session  3   where username = 'GGATE'  4     and osuser = 'ggate';  SID PREV_SQL_ID   SQL_ID        EVENT                         BLOCKING_SESSION STATE     —– ————- ————- —————————– —————- ———   27 4vscyf0q31wht               SQL*Net message from client                    WAITING   28 4vscyf0q31wht               SQL*Net message from client                    WAITING   29 4tn714x3k3mqy               SQL*Net message from client                    WAITING   30 7c788jjtrpfbt               SQL*Net message from client                    WAITING SQL>

(3)、在GGSCI命令行中,运行dblogin登录数据库,如下所示。

GGSCI (yun) 5> dblogin userid ggate, password ggate_5678 Successfully logged into database. GGSCI (yun) 6>

(4)、再次查看GoldenGate软件相关的数据库会话,如下所示。

SQL> /  SID PREV_SQL_ID   SQL_ID        EVENT                         BLOCKING_SESSION STATE     —– ————- ————- —————————– —————- ———   27 4vscyf0q31wht               SQL*Net message from client                    WAITING   28 4vscyf0q31wht               SQL*Net message from client                    WAITING   29 4tn714x3k3mqy               SQL*Net message from client                    WAITING   30 7c788jjtrpfbt               SQL*Net message from client                    WAITING   41 4vscyf0q31wht               SQL*Net message from client                    WAITING SQL>

可见,在GGSCI命令行中运行dblogin登录后,生成的新的数据库会话的SID为41。

(5)、下面来跟踪SID为41的会话,在数据库后台开启10046事件,命令如下所示。

SQL> select kill -9  ||c.spid  2  from  v$session b, v$process c  3  where  b.paddr=c.addr  4  and b.sid=&1; Enter value for 1: 41 old   4: and b.sid=&1 new   4: and b.sid=41 KILL-9||C.SPID ——————————– kill -9 2322 SQL> SQL> conn / as sysdba Connected. SQL> SQL> oradebug setospid 2322 Oracle pid: 34, Unix process pid: 2322, image: oracle@yun SQL> SQL> oradebug unlimit Statement processed. SQL> SQL> oradebug tracefile_name /u01/app/oracle/diag/rdbms/db11g/db11g/trace/db11g_ora_2322.trc SQL> SQL> oradebug event 10046 trace name context forever,level 12 Statement processed. SQL>

(6)、在GGSCI刚才dblogin登录后的命令行中再次运行REGISTER EXTRACT命令,如下所示。

GGSCI (yun) 8> register extract EXTA1 database 2013-02-16 20:33:48  ERROR   OGG-01755  Cannot register or unregister EXTRACT EXTA1 because of the following SQL error: OCI Error 26,723. See Extract user privileges in the Oracle GoldenGate for Oracle Installation and Setup Guide. GGSCI (yun) 9>

(7)、分析刚生成的10046事件的日志文件,有价值的信息不多,只提及一个err 26723错误。

(8)、再次分析该数据库会话的ERRORSTACK信息,命令如下所示。

SQL> oradebug dump errorstack 3; Statement processed. SQL> SQL> oradebug dump errorstack 3; Statement processed. SQL>

(9)、分析生成的ERRORSTACK信息,发现报错时,该数据库会话正在执行一个内部的存储过程。

于是,连接到数据库,手工执行该存储过程,发现同样报错了,报错信息如下所示。

ORA-26723: 用户 “GGATE” 要求角色 “DV_STREAMS_ADMIN/DV_XSTREAM_ADMIN/DV_GOLDENGATE_ADMIN” ORA-06512: 在 “SYS.DBMS_LOGREP_UTIL”, line 182 ORA-06512: 在 “SYS.DBMS_LOGREP_UTIL”, line 225 ORA-06512: 在 “SYS.DBMS_CAPTURE_ADM_INTERNAL”, line 295 ORA-06512: 在 “SYS.DBMS_CAPTURE_ADM”, line 409 ORA-06512: 在 line 27 SQL>

可见,GoldenGate的数据库用户需要以上权限,而这些权限说明该系统中配置过database vault。

(10)、验证当前的数据库环境是否配置过DV,命令如下所示。

[oracle@yun ~]$  cd $ORACLE_HOME/rdbms/lib [oracle@yun lib]$ ar -t libknlopt.a | grep -c kzvidv.o 1 [oracle@yun lib]$

输出结果为1,说明该数据库已经配置了DV。这是我的一个测试环境,突然想起来以前我在测试数据安全相关的产品时,在这个环境上部署过DV。

案例方案:

可以将DV功能关闭,关掉DV功能后,再次尝试注册命令,这次成功执行。

[oracle@yun ~]$  cd $ORACLE_HOME/rdbms/lib [oracle@yun lib]$ make -f ins_rdbms.mk dv_off [oracle@yun lib]$ make -f ins_rdbms.mk ioracle   GGSCI (yun) 4> dblogin userid ggate@source, password ggate Successfully logged into database. GGSCI (yun) 7> register extract EXTA1 database 2013-02-16 21:20:19  INFO    OGG-02003  Extract EXTA1 successfully registered with database at SCN 901914. GGSCI (yun) 8>

作者 管理员