發表文章

目前顯示的是 2012的文章

無解的錯誤訊息ORA-7445 [OPIXGUID()+13]?

我們的Oracle資料庫時有Core Dump, 錯誤訊息為ORA-7445 [OPIXGUID()+13],一直找不到真正的原因為何?有意思的是,在官方支援網站My Oracle Support上找相關文件,看到一篇文件Troubleshooting ORA-7445 [opixguid] [ID 1469649.1],它的內容: Applies to: Oracle Server - Enterprise Edition - Version 9.2.0.1 to 11.2.0.3 [Release 9.2 to 11.2] Information in this document applies to any platform. Symptoms  Dumps in function opixguid can occur in 9i, 10g, 11g, caused by several bugs. Cause There are many bugs opened for ORA-7445 [opixguid], most of them being closed as Not a bug, Not reproducible, Suspended due to lack of information. Some examples: 11.2 Bug 12385064 : ORA-7445 [OPIXGUID()+13] 11.1 Bug 9968142 : ORA-7445 [OPIXGUID()+13] [SIGSEGV, ADDRESS NOT MAPPED TO OBJECT] Bug 10225810 : ORA-07445: EXCEPTION ENCOUNTERED: CORE DUMP [OPIXGUID()+000C] 9.2 Bug 2488563 : ORA-07445: EXCEPTION ENCOUNTERED: CORE DUMP [OPIXGUID()+0] ... 簡單地說,客戶提了很多ORA-7445的錯誤,大部份他們以不是錯誤結案,或者是無法再現該錯誤,或因資訊不足而擱置。 這種錯誤,就是偶而出現,大部份時候都可以正常的跑SQL,也許10天,也許半個月,也許很久才會出現一次

台灣的ClamAV Mirror Site同步較慢?

今天看郵件閘道主機的日誌時,一直看到freshclam有如下錯誤訊息: Dec  5 13:43:12 mail1 freshclam[15030]: daily.cld is up to date (version: 15680, sigs: 290708, f-level: 63, builder: guitar) Dec  5 13:43:14 mail1 freshclam[15030]: getfile: safebrowsing-40061.cdiff not found on remote server (IP: 120.119.118.1) Dec  5 13:43:14 mail1 freshclam[15030]: getpatch: Can't download safebrowsing-40061.cdiff from database.clamav.net Dec  5 13:43:15 mail1 last message repeated 4 times Dec  5 13:43:15 mail1 freshclam[15030]: Incremental update failed, trying to download safebrowsing.cvd Dec  5 13:43:27 mail1 freshclam[15030]: Downloading safebrowsing.cvd [100%] Dec  5 13:43:28 mail1 freshclam[15030]: Mirror 120.119.118.1 is not synchronized. Dec  5 13:43:28 mail1 freshclam[15030]: Trying again in 5 secs... Dec  5 13:43:31 mail1 freshclam[15030]: Update process terminated 想說為什麼會不能更新safebrowsing-xxxxx.cdiff, 難道是我們網路有問題,還是防火牆設定有問題。於是直接下指令freshclam查看,發現它一直吐出以下訊息,而且看來一直跑不完的樣子。 # freshclam ClamAV update

由Oracle PL/SQL中寄信

我有時候會使用Oracle的PL/SQL來寫一些程序,可以提供給前端的程式來叫用,或者使用Oracle的排程器來叫用,就可以做到許多原本要用C#或PB等開發工具才能做到的事。PL/SQL可以提供很好的效能,配合SQL Developer工具就可以跨平台在Windows或Mac OSX,Linux等不同電腦上寫程式。 最近在寫一個定期檢查的功能,想要在程式檢查到某些特別狀況時,希望可以寄送信件通知。找了一些資料,先稍作整理: 1. PL/SQL寄email的方式由早期的UTL_TCP,UTL_SMTP,到10g之後主要是推UTL_MAIL, 但是UTL_MAIL預設沒有安裝,必須由DBA先行安裝並設定一個指定郵件主機的初始參數。 $cd $ORACLE_HOME/rdbms/admin $sqlplus / as sysdba > @ utlmail.sql > @ prvtmail.plb > grant execute on UTL_MAIL to public; > alter system set smtp_out_server='xxx.xxx.xxx.xxx' 然後就可以很簡單的叫用一個程序來寄信了。 utl_mail.send(sender, recipients, cc, bcc, subject, message, mine_type); 我直接在SQL Developer裡測試正常,但是將此程式包在另一個程序裡叫用時,卻出現ORA-24247的錯誤。Google了一下找到這篇 ORA-06502 ORA-24247 calling UTL_MAIL from Oracle 11gR2  說要再建立一個ACL,然後要利用此ACL指派權限可以存取該郵件主機。不過,我在建立ACL時,卻又出現另一個錯誤訊息:function-based index XDB.XDB$ACL_XIDX is disabled並告訴我可以重建或啟用該索引。我直接在SQL Developer中重建該索引,卻一直失敗。再去Google後找到另一篇 Fine-grained access to network services ,發現他也是同樣的情況,而且他說他重建索引後就可以了。我才想到自己雖然具有DBA的權限,但是

又被垃圾信攻擊了

最近做例行主機檢查時,發現郵件閘道主機異常的大量在往外寄信,但都無法寄出去。看了一下mailq, 果然發現有很大量的信在/var/spool/mqueue中。 直覺的先在mail log裡查看問題,但只看到一大堆由A主機寄到B主機的訊息,而B主機則是一大堆由A主機寄來信件以及試著要寄出,但無法寄出的訊息。 我們的架構是預設由A主機來寄信,如若寄不出去,則轉到B主機,由B主機來試著寄看看。所以真的寄不出去的信,都會queue在B主機。由初步看到的現象,我判斷(假設)攻擊者很有可能已經猜到我們使用者的帳號及密碼,然後由A主機大量的寄信進來。 我必須印證這個想法,並且若真為此情況,則必須找到是那個帳號被利用了。 但要如何印證呢?當然可以由mail log來查看,一定可以看到誰在那個時候,使用那個帳號進入,然後寄了多少信。這表示我必須查看大量的log訊息了,其實未必,我想到一個方法,在B主機裡queue了大量無法寄出的垃圾信,正好提供我重要的資訊。 #cd /var/spool/mqueue #ls * #cat xxxxxxx 如此,列出這些垃圾信的內容,(可能要多看幾封)結果我發現大部份的垃圾信都是在前幾天的幾點幾分寄到A主機的。如此,我只要看那個時刻的log就可以了。 #bzcat /var/log/maillog.0.bz2 | grep 16:08 | grep auth 以上列指令,在正確的mail log檔裡找到該時刻的資訊,而其實我也只要知道是不是有人使用SMTP AUTH的方式驗證進入。所以這樣我很快的只要查看很少的資訊就發現,果然有。而且找到是那個帳號被利用了。再進行反覆確認,以這個帳號來查看當天寄了多少信,登入驗證多少次,果然都是很異常的大量,而且其ip, FQDN, enveloper的內容等,也都符合。 我甚至還猜了一次該帳號的密碼,還真的猜對了。實在太好猜了。 最後,我只好先將該帳號鎖定(其實系統只是改了他的密碼),並將所有在mailq中的所有垃圾信都刪除。再觀察情況都正常後就收工了。

Oracle SQL Developer可以對PL/SQL程式除錯

圖片
之前在使用Oracle SQL Developer寫PL/SQL的時候,就有發現有除錯的功能,但是也沒耐心去找說明文件看如何使用,就直接用用看。但是每次都是有錯誤訊息,一時之間也不知道問題在那裡,又急著寫出程式,就先使用老方法DBMS_OUTPUT.PUT_LINE()把變數的內容印出來,其實也都可以解決。所以就一直沒去想為什麼除錯功能都不能用,最近比較有時間可以找問題,稍微試了一下,發現除錯功能是可以用的。 首先,網路上很多文章都有在講怎麼使用,例如這篇 Testing and Debugging Procedures using SQL Developer 。但是都講的很順,沒提到會碰到的問題。所以都會告訴你正常進入除錯模式的樣子長怎樣: 基本的可以看變數的內容值,可以設中斷點,可以進入或往下跑的功能都有。 我碰到的問題是在按除錯時,就出現錯誤訊息,不會進入這個除錯的畫面。而錯誤訊息是連線到一個奇怪的ip address 169.95.x.x之類的。然後告訴我連不到,我一直沒想到這個位址是何方神聖,後來一想,我的機器有安裝過虛擬機器的軟體,所以會有一張軟體的網路卡,而其ip address就是這種奇怪的樣子。 福至心靈,把那張虛擬機器建的軟體網卡停用後,再按除錯,就出現“其他的錯誤訊息”了。但是原本的錯誤訊息不見了,這表示已成功了一步。 我再按一下“編譯以除錯”按鈕,之後再去試按除錯,就成功了!可以正常的出現選取要除錯目標的視窗。之後的操作也都正常。

用實例談CSS, jQuery搭配ASP.NET

感謝電子情報刊出我的文章: "用實例談CSS, jQuery搭配ASP.NET"。去年家裡多了一個成員, 小朋友現在滿周歲了, 這一年多來, 我回家都沒有時間做自己的事情。在電腦前面坐一下, 馬上就有一隻小手手要來幫你按東按西; 不然就是會有人問說: "那個重要嗎? 一定要現在做嗎?" 所以這篇文章幾乎都是白天利用工作之餘, 一點一滴慢慢累積而成。 而且在投稿後, 又有做一些修改; 這一點很對不起雜誌社的編輯先生小姐, 真的很謝謝他們。 但是還是有未來得及修改的部份, 就是程式碼十三, 應該如下:               程式碼十三 : 包裹 jQuery 指令碼及 ScriptManager 的類別 public static class js_Utility {     public static void Alert( Page p, string message)     {         message = message.Replace( "\n" , " " );         string js = @"var smb=$('#dialog p span').clone();                     $('#dialog p').remove();                     $('#dialog').append('<p> </p>' ');                     $('#dialog p').append(smb).append('" + message + "');" +             @"$('#dialog').dialog({modal: true,                                                 buttons: {                      

微軟ODBC driver for oracle的問題

圖片
我知道微軟之前已宣告不再為Oracle資料庫寫driver了, 而且微軟的ODBC driver for oracle最近的版本, 也是2008年了, 距今也有4年多, 可算是很舊的。 不過, 十幾年前我開始使用微軟的ODBC driver for oracle時, 用得還很順手。和PowerBuilder配合起來也沒什麼問題, 可能我用的功能很少很單純! 後來, 碰到一些問題, 同事告訴我有一些SQL語句, 這個driver沒有辦法解析, 他的解決方法是把這個driver換掉, 換成Oracle自家寫的ODBC driver, 問題就解決了! 最近我也碰到同樣的情況: select xxx from p, e, d, s, ed, dp, ( select a, sum(hours) h from ( select a, 0 hours from p wherer y = :year union all select a, hours from pof where b between :d1 and :d2 ) group by a ) v where p.a = e.c and d.a = s.s ... and p.a = v.a 這個SQL語句, 使用微軟的ODBC driver時, 會傳回錯誤訊息ORA-01861:文字與格式字串不符, 但是把ODBC driver換成Oracle自家寫的那支, 卻會很正常的跑完, 並傳回正確的結果。那就換driver不就好了, 還有什麼好討論的呢? 問題就在於, 有些奇奇怪怪的情況下, 一定要用微軟的那支driver, 這個時候就很頭大了。 我試了一下, 發現這個SQL語句的問題在於: 1. 可能是太多層的子查詢, 2. 或者是union 3. 反正太複雜了會造成微軟那支driver出問題。 所以, 我把SQL語句改寫: select xxx from p, e, d. s. ed, dp, ( select a, sum(hours) h from pof where b between :d1 and :d2 group by a ) v where p.a = e.c and d.a = s.s ... and p.a = v.a

FreeBSD mail指令出現/tmp: write failed, filesystem is full錯誤

在我的一台FreeBSD主機出現如下情況: 當我下mail指令時, 出現如下錯誤訊息: /tmp: write failed, filesystem is full 在一個連線中, 下mail指令後, 開另一個連線, 一直用df指令觀看, 果然看到/tmp一直被吃掉! 本想用加大/tmp的方式(把/tmp ln到更大的分割區)來處理, 但想想現有/tmp已經有500MB了, 還要加多大? 所以覺得應該看看為什麼500MB還不夠mail指令用, 也不用想太多, 其實就是因為我用root帳號, 而預設所有系統訊息都會寄給root, 但我卻從不去清其郵件, 如下: # ls -l /var/mail total 3084208 -rw------- 1 clamav clamav 0 Jul 30 2009 clamav -rw------- 1 cyrus cyrus 0 Jul 30 2009 cyrus -rw------- 1 root wheel 3156647058 Feb 18 11:01 root -rw------- 1 spamd spamd 0 Jul 30 2009 spamd root的信件已經3GB大了, 當然mail程式在讀取的時候就需要超過500GB的空間, 自然會爆掉了。只要把/var/mail/root清掉就好了。 #rm /var/mail/root #touch /var/mail/root

如何為Linux上的Oracle 11g做異地備份

異地備份, 好像很高貴的樣子, 當911發生後, 很多廠商推異地備份方案, 都不便宜。我們自己弄了一個不太花錢的簡單版: 其實就只是把備份的檔案, 利用網路FTP到另一個地點, 只要事後可以由備份檔還原資料即可。 規劃要備份的檔案有三種: 1.archivelog, 2. full backup, 3. export dump files 前兩者合在一起, 可以做幾乎任一個時點的資料還原, dump檔則可以簡單的找出之前資料的樣子, 算是多一個保險, 多一個還原資料的方式。 這三種檔案各寫一個Script來備份: 1. Archivelog #!/bin/sh HOST='ftp-server' USER='user1' PASSWD='pass1' #D1=`date -d '1 day ago' "+%Y_%m_%d"` ftp -n -i $HOST <<END_SCRIPT quote USER $USER quote PASS $PASSWD bin cd archivelog mkdir $1 cd $1 lcd /u03/app/oracle/FRA/PRINCO/archivelog/$1 mput * quit END_SCRIPT exit 0 2. Full Backup #!/bin/sh HOST='ftp-server' USER='user1' PASSWD='pass1' ftp -n -i $HOST <<END_SCRIPT quote USER $USER quote PASS $PASSWD bin cd backupset lcd /u03/app/oracle/FRA/PRINCO/backupset/$1 mput *FULL*.bkp quit END_SCRIPT exit 0 3. Export dump files #!/bin/sh HOST='ftp-server' USER='user1' PASSWD='pass1'

ASP.NET AJAX Update Panel don't work

最近參與一個ASP.NET網站的程式撰寫, 寫了一個用Ajax Tool Kit做ModalPopup的頁面, 為了在其Panel中不產生full postback, 以免讓該ModalPopup出來的Panel跳掉, 所以使用UpdatePanel將button, gridview包起來。在自己的開發環境中, 都運作正常。Check in回server後, 同事整合code後, 測試時, 卻發現modal popup的panel都會跳掉, 看起來是update panel沒有正常運作。 仔細檢查, 確實在我的開發機器上是可以正常運作的。但在同事的機器上, update panel也真的運作不正常。 後來, 同事檢查我的機器上的Web.config檔, 發現他的Web.config多了一行: <xhtmlconformance mode="Legacy"/> 將此行移掉(remark掉)後, 程式運作就正常了。 我們猜想, 應該是因為我們的專案是由之前ASP.NET 1.1的一路升級來的。也許升級程式自動加了這一行以求相容性XD。但是開發機器是最近安裝, 全新的。

薪資媒體申報檔200->250字

今年(2012)1月要各個公司要為每個員工申報去年的薪資所得, 因為過年的關係, 好像可以延到2月。不過, 今年的中英文媒體申報檔格式有改動, 由原來的200字, 改成250字。主要是要容納更多的資料。例如, 名字部份加長了。 可是我們這些公司的系統, 並沒有這些需要, 反而是要因應這些變動, 而要改寫系統產出的文字檔格式。如果我們有10個系統, 那就要改10支程式。想想, 有點笨; 所以, 最後只寫了一支程式, 用來將原本200字的文字檔, 改成250字文字檔格式。那麼原本的10個系統都不用動, 也不用測試。還好, 使用者也能接受, 因為問題不是我們造成的, 要怪, 也只能怪國稅局了。 其實國稅局的申報程式, 應該有兩個功能, 一個可以讀200字的中英文合併檔, 一個可以讀新的250字的中英文合併檔, 那就皆大歡喜。 不過, 在那之前, 使用者急著申報作業, 我們還是把轉檔程式做好先。 我用C#的Windows Form來寫, 因為可以XCOPY部署, 還蠻方便的。程式只有三個輸入: 1. 舊的中英文合併檔檔名(完整路徑)    ----> tbFileName 2. 所得期間(起) (3碼年, 2碼月; 民國年)-----> tbStart 3. 所得期間(迄) (3碼年, 2碼月; 民國年)-----> tbEnd Button按下後的程式: Encoding ec = Encoding.GetEncoding("Big5");             StreamReader rdr = new StreamReader(tbFileName.Text, ec);             StreamWriter wtr = new StreamWriter(tbFileName.Text.ToString() + ".250", false, ec);             string space28 = new string(' ', 28);             string period = tbStart.Text + tbEnd.Text;             string space12 = new string(' &