阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

sqlplus登录报ORA-06502错误的问题排查和解决

146次阅读
没有评论

共计 2238 个字符,预计需要花费 6 分钟才能阅读完成。

最近碰见了一个 sqlplus 登陆报错的问题,我一开始排查问题的方向就错了,不得已,还是请教了 dbsnake 大师,对于这么一个小问题,就像“小罗的不看人传球”般解决了问题,有因才有果,对于任何事情都成立。当然,我也不是第一次受挫了,归根结底,还是碰见的问题少,对于一些基础原则性知识掌握不够,不能从现象中直接看出本质,导致了方向性上的错误,急也没用,慢慢积累吧,所以还是要总结一下,避免下次再犯同样的错误。

问题描述
一个 11.2.0.4 的开发库,用户名是 sqlreviewer,密码是 sqlreviewer,之前一直可以用,最近出现 sqlplus sqlreviewer/sqlreviewer 的时候,报错:
sqlplus 登录报 ORA-06502 错误的问题排查和解决

关于 ORA-06502 的描述:
sqlplus 登录报 ORA-06502 错误的问题排查和解决
描述的是 PLSQL 块中,因为实际值超过了变量定义的长度,所以报了这个错。

如果使用错误的密码 sqlreviewea,报错:
sqlplus 登录报 ORA-06502 错误的问题排查和解决
用户口令校验的正常错误。

问题到这里,可能有的朋友已经猜到大致的方向了,但我开始排查的方向就出了错误,我尝试用 strace 查看 sqlplus 的执行,然并卵,尝试创建使用同样位数的用户 sqlreviewea,执行 sqlplus 登录是正常的,

SQL> create user sqlreviewea identified by abc;
SQL> grant dba to sqlreviewea;

问题解决
1.sqlplus 登录报 PLSQL 赋值变量错误,需要排查是否库设置了 logon trigger。
方法 1:GC 中 triggers 视图查找 Event 是 LOGON 的记录
这里可以看见有一个 trigger 名称是 LOG_DEFERRED 的触发器:
sqlplus 登录报 ORA-06502 错误的问题排查和解决
方法 2:
sqlplus 登录报 ORA-06502 错误的问题排查和解决
注意使用 length(triggering_event)查看实际位数是 6,即’LOGON‘,右侧多一个空格,所以需要 rtrim 操作。

2. 查看 logon trigger 做了什么。
方法 1:GC 中
sqlplus 登录报 ORA-06502 错误的问题排查和解决
方法 2:
sqlplus 登录报 ORA-06502 错误的问题排查和解决
这才想起来,为了解决一个用户权限的问题(http://www.linuxidc.com/Linux/2016-06/132438.htm),上次特意为这个库增加了一个 logon trigger,判断登录的若是某个特定用户,则 session 级关闭延迟段分配属性,其中用户名的变量 logon_user 定义为 VARCHAR2(10),显然 sqlreviewer 用户的名称长度超过了 10 位,这就能解释通 sqlplus sqlreviewer/sqlreviewer 报一个 PLSQL 错误的原因了。至于使用错误的密码报 ORA-01017,很好解释,先进行了用户口令验证,未通过则报这个错,如果通过了,就会执行 logon trigger 的逻辑,因此报了另一个错误。

3. 还有一问题,就是为何尝试创建使用同样位数的用户 sqlreviewea,执行 sqlplus 登录是正常的,

SQL> create user sqlreviewea identified by abc;
SQL> grant dba to sqlreviewea;

问题就出在了将 DBA 权限授予了 sqlreviewea 用户。
《ADMINISTER DATABASE TRIGGER Privilege Causes Logon Trigger to Skip Errors (文档 ID 265012.1)》这篇文章明确指出了:
具有 ADMINISTER DATABASE TRIGGER 系统权限的用户 sqlplus 登录即使出现 logon trigger 报错,仍可以连接,不会阻止登录,但是这错误会记录在 alert.log 和 trace 文件中。
查看 alert.log 日志,确实有这个错误的记录:
sqlplus 登录报 ORA-06502 错误的问题排查和解决
查看 trace 日志,问题更清晰了,直接有一句:

Skipped error 604 during the execution of SYS.LOG_DEFERRED

就说明了其跳过这个 trigger 执行的报错。
sqlplus 登录报 ORA-06502 错误的问题排查和解决
注:这用的 trigger 是 database logon trigger,对应的是使用 ADMINISTER DATABASE TRIGGER 系统权限可跳过报错。如果是 schema logon trigger,则对应是 ALTER ANY TIGGER 权限,效果相同。
另外,就是以下用户和角色是有 ADMINISTER DATABASE TRIGGER 权限的,这就解释了为何具有 dba 权限的 sqlreviewea 用户登录 sqlplus 不会显示报错的原因。
sqlplus 登录报 ORA-06502 错误的问题排查和解决

总结
1. 对于基础理论的掌握熟练程度和敏感度,往往对排查问题的方向起到了至关重要的作用,例如出现了 ORA-06502 的 PLSQL 报错,是否就会联系到 logon trigger,或者是否知道什么是 logon trigger。一方面要持续吸收知识,更要理解知识,另一方面就要多碰问题,“本不知道这些问题,碰见的多了自然就知道了”,顺其自然,强求不得。
2.MOS 是提供了很好、很权威的问题排查途径,但要能用好,例如这块我用 logon trigger 查了未找到对应的,再看才发现未切换至英文,一定程度上看,英文资料还是比中文资料广而多。
3. 有因才有果,凡事都适合,不要因为问题小就不重视,对于我来说,任何小问题都是积累的重要一环,既然天分不足,只能慢慢积累,要耐得住。

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/133837.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计2238字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中