sqlplus登入報ORA-06502錯誤的問題排查和解決

來源:互聯網
上載者:User

sqlplus登入報ORA-06502錯誤的問題排查和解決

最近碰見了一個sqlplus登陸報錯的問題,我一開始排查問題的方向就錯了,不得已,還是請教了dbsnake大師,對於這麼一個小問題,就像“小羅的不看人傳球”般解決了問題,有因才有果,對於任何事情都成立。當然,我也不是第一次受挫了,歸根結底,還是碰見的問題少,對於一些基礎原則性知識掌握不夠,不能從現象中直接看出本質,導致了方向性上的錯誤,急也沒用,慢慢積累吧,所以還是要總結一下,避免下次再犯同樣的錯誤。

問題描述:
一個11.2.0.4的開發庫,使用者名稱是sqlreviewer,密碼是sqlreviewer,之前一直可以用,最近出現sqlplus sqlreviewer/sqlreviewer的時候,報錯:

關於ORA-06502的描述:

描述的是PLSQL塊中,因為實際值超過了變數定義的長度,所以報了這個錯。

如果使用錯誤的密碼sqlreviewea,報錯:

使用者口令校正的正常錯誤。

問題到這裡,可能有的朋友已經猜到大致的方向了,但我開始排查的方向就出了錯誤,我嘗試用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的觸發器:

方法2:

注意使用length(triggering_event)查看實際位元是6,即’LOGON ‘,右側多一個空格,所以需要rtrim操作。

2.查看logon trigger做了什麼。
方法1:GC中

方法2:

這才想起來,為瞭解決一個使用者權限的問題(  ),上次特意為這個庫增加了一個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日誌,確實有這個錯誤的記錄:

查看trace日誌,問題更清晰了,直接有一句:

Skipped error 604 during the execution of SYS.LOG_DEFERRED

就說明了其跳過這個trigger執行的報錯。

註:這用的trigger是database logon trigger,對應的是使用ADMINISTER DATABASE TRIGGER系統許可權可跳過報錯。如果是schema logon trigger,則對應是ALTER ANY TIGGER許可權,效果相同。
另外,就是以下使用者和角色是有ADMINISTER DATABASE TRIGGER許可權的,這就解釋了為何具有dba許可權的sqlreviewea使用者登入sqlplus不會顯示報錯的原因。

總結:
1.對於基礎理論的掌握熟練程度和敏感度,往往對排查問題的方向起到了至關重要的作用,例如出現了ORA-06502的PLSQL報錯,是否就會聯絡到logon trigger,或者是否知道什麼是logon trigger。一方面要持續吸收知識,更要理解知識,另一方面就要多碰問題,“本不知道這些問題,碰見的多了自然就知道了”,順其自然,強求不得。
2.MOS是提供了很好、很權威的問題排查途徑,但要能用好,例如這塊我用logon trigger查了未找到對應的,再看才發現未切換至英文,一定程度上看,英文資料還是比中文資料廣而多。
3.有因才有果,凡事都適合,不要因為問題小就不重視,對於我來說,任何小問題都是積累的重要一環,既然天分不足,只能慢慢積累,要耐得住。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.