背景
最近由於kettle在同步Oracle數據的時候,時不時會有數據丟失,為了避免數據丟失的時候我們不能及時發現,領導要求在數據庫里每天同步完數據之后,進行一次核對,並將核對結果通過郵件發送出來。並給出了一個Oracle發郵件的存儲過程。
那個存儲過程確實寫的很精妙,但是由於測試內網環境沒有一個可以使用的郵箱服務器,所以最終程序沒有報語法錯誤,就上生產了,結果生產部署的時候遇到了各種問題,不過還好都及時解決了,在此特做一個問題解決的記錄。
0,發郵件功能的前置條件
a, 開發發郵件的代碼
b, 具有一個可以訪問DBMS、_NETWORK_ACL_ADMIN包的高權限用戶
c, 用高權限用戶給自己執行發郵件程序時候所用到的用戶進行ACL授權
d, 網絡上確保數據庫所在的機器與郵箱SMTP服務器連通
1,ORA-29278:SMTP 臨時性錯誤: 421 Service not available
原因:網絡問題,連不上SMTP服務器
解決辦法:檢查SMTP服務配置是否正常,網絡端口是否可正常訪問,SMTP服務器是否正常服務
注:檢查端口的指令
windows版:telnet ip port
Linux版:wget ip:port
或者ssh:如ssh -v -p port username@ip
-v代表打開調試模式,username可隨意指定
2,ORA-24247:網絡訪問被訪問控制列表(ACL)拒絕
原因:Oracle數據庫端缺少對執行發郵件動作的用戶進行相應的授權操作
解決辦法:在Oracle里用高權限用戶進行acl授權
1 BEGIN 2 3 --1.創建訪問控制列表(ACL) 4 5 dbms_network_acl_admin.create_acl(acl => 'email_server_permissions.xml', 6 7 description => 'Enables network permissions for the e-mail server', 8 9 principal => 'oracle_user', --授權用戶,也即具體執行發郵件動作的Oracle數據庫用戶 10 11 is_grant => TRUE, 12 13 privilege => 'connect'); 14 15 --COMMIT; 16 17 --2.將 ACL 與郵件服務器相關聯 18 19 dbms_network_acl_admin.assign_acl(acl => 'email_server_permissions.xml',--每次執行該串兒腳本的時候,這里需要保持住不一致 20 21 host => '*.*.*.*', --主機名要做ip映射;SMTP服務器地址,這里要和調用的時候保持一致,我在具體實際中選用的ip,調用的時候只能用ip,用域名會報錯 22 23 lower_port => 25, 24 25 upper_port => NULL); 26 27 --COMMIT; 28 29 --3.ACL 為用戶授與連接郵件服務器的權限 30 31 dbms_network_acl_admin.add_privilege(acl => 'email_server_permissions.xml', 32 33 principal => 'oracle_user', --授權用戶 34 35 is_grant => TRUE, 36 37 privilege => 'resolve'); 38 39 --COMMIT; 40 41 END;
3,PLS-00201:identifier 'XXX' must be declared
原因:執行上一步授權動作的用戶不具有訪問DBMS、_NETWORK_ACL_ADMIN包的權限
解決辦法:找一個高權限的用戶,給具體執行授權動作的用戶附上該包的訪問權限
grant execute on 包名 to 用戶名;
注:如果不是當前用戶:則調用要加名稱:如ZUO.Proc
如果是當前用戶:則直接調用即可:如Proc
4,ORA-44416: ACL無效:無法解析的主用戶‘mgrdb’
原因:用戶名大小寫問題,acl授權的時候,用戶名得大寫
解決辦法:在授權腳本中將用戶名大寫
參考鏈接:
https://blog.csdn.net/yuanyannan123/article/details/40182189
https://www.2cto.com/database/201404/290719.html
http://www.nazmulhuda.info/ora-44416-unresolved-principal
https://blog.csdn.net/u010678947/article/details/20702149
https://www.cnblogs.com/muhy/p/10567607.html