發表文章

複製檔案的好工具:robocopy

最近把資料庫異地備份的工作接回來自己做, 才發現之前同事備份資料時使用的USB 2.0隨身碟效能確實不太好, 每周要備份的資料多達60GB, 至少要兩個小時才能備完。更糟的是, 隨身碟好像有點問題, 每每備份到一半就卡住不動, 又看不出來是什麼狀況。常常等很久之後, 忍不住了就拔線, 都會造成檔案不一致的現象, 還要再下chkdsk /F指令來處理。 稍做觀察後, 我發現那顆隨身碟(Transcend)有兩個問題: 1. USB線頭有接觸不良的情形, 所以複製檔案時不能去碰線, 否則就會整顆磁碟由系統中消失。 2. 並行處理能力不好, 如果有多個大檔案同時寫入時, 就很容易出現卡住的情形。 而我們之前使用的方法(在檔案總管內拖拉), 就會造成同時多個大檔案寫入。因此, 我一開始寫批次檔, 利用xcopy指令一個檔案一個檔案的複製, 果然就不再出現卡住的現象。但是xcopy指令必須一個檔案一個檔案的寫, 而且無法自行處理目錄, 批次檔寫起來有點辛苦! 在嘗試時, 發現robocopy這個指令, 不但有續傳的功能, 而且會自行處理目錄問題, 更好的是會顯示複製的進度。大概用法如下: robocopy g:\xxx h:\yyy /E 這樣一來, 就會把g:碟中xxx目錄內所有檔案及子目錄, 通通複製到h:碟中的yyy目錄下。robocopy在必要的時候會自行新增目錄, 不用我們處理。 最後, 推薦一下USB 3.0的隨身碟, 因為備份時間太久了, 所以我改用segate GoFlex Pro的隨身碟; 實測結果: USB 2.0 -> 25MB/s USB 3.0 -> 100MB/s 所以備份時間由原來的2小時, 縮短為20分鐘。

FreeBSD package - 版本錯亂

在FreeBSD中,常常使用pkg_version -v指令來查看是否有軟體套件需要更新, 有時候會看到如下的狀況: # pkg_version -v autoconf-2.68 ! Comparison failed automake-1.11.1 ! Comparison failed libtool-2.2.10 > succeeds index (index has 2.2.6b) 這代表軟體套件內部資料庫有狀況, 此時可以下pkgdb -F指令來修護之: # pkgdb -F ---> Checking the package registry database [Updating the pkgdb in /var/db/pkg ... - 50 packages found (-0 +7) ....... done] Stale origin: 'devel/autoconf268': perhaps moved or obsoleted. -> The port 'devel/autoconf268' was moved to 'devel/autoconf' on 2010-12-08 because: "Autotools cleanup" Fixed. (-> devel/autoconf) Stale origin: 'devel/automake111': perhaps moved or obsoleted. -> The port 'devel/automake111' was moved to 'devel/automake' on 2010-12-08 because: "Autotools cleanup" Fixed. (-> devel/automake) Stale origin: 'devel/libtool22': perhaps ...

FreeBSD gmirror 實作筆記

最近為我們家的郵件主機做mirror,之前為了怕出狀況, 所以先在virtual machine中實作一次, 情況很正常。主要的作法如FreeBSD HandBook, 及以下文章所述: Using Software RAID-1 with FreeBSD 之後在正式機器上做時, 卻出包了! 重新開機時, 出現如下訊息: Mounting root from ufs:/dev/gm0s1a setrootbyname failed ffs_mountroot: can't find rootvp Root mount failed: 6 Manual root filesystem specification: : Mount using filesystem e.g. ufs:da0s1a ? List valid disk boot devices Abort manual input mountroot> 正式機器那容我們慢慢找問題, 所幸之前已經準備一台virtual machine, 並將所有使用者帳號及郵件資料都備份過去了, 所以當下先切換機器給使用者使用。幾日下來, 備用機器運作也很順, 使用者應該沒發覺, 其實郵作主機已經換了一台。:-) 接下來, 就是思考問題出在那了。其實正如ONLAMP那篇文章的使用者留言, 有人提到, 文章使用的範例是將ad0, ad2兩顆實體硬碟做成mirror/gm0; 如果實作的環境不一樣時, 很容易在修改/etc/fstab檔時, 弄錯。我就是弄錯了!! 原本的/etc/fstab如下: # Device Mountpoint FStype Options Dump Pass# /dev/ad4s1b none swap sw 0 0 /dev/ad4s1a / ufs rw 1 1 /dev/ad4s1g /home ufs ...

SpamAssassin 之SMTP AUTH略過檢查

圖片
最近自己開始在公司外面使用公司的郵件主機寄收信,才發現寄信時雖然有使用帳號密碼認證(SMTP AUTH)。可是主機的檢查垃圾信軟體(SpamAssassin)仍會對信件進行檢查,而且因為在外面的網路都是動態取得ip, 大部份ip都已經被列入寄垃圾的黑名單網域中。所以我寄出的信,都被自己公司的主機標記為垃圾信!雖然試著寄往MSN及GMAIL都還是收得到,但是都被加註,總覺得很不妥當。所以試著調整。原本以為在SpamAssassin的設定檔中有可以設定的選項,結果沒找到。 後來升級軟體時(FreeBSD下使用portupgrade -a指令),發現SpamAssassin套件出現編譯選項,其中第一個選項就是如果通過SMTP AUTH認證,則略過檢查。將其選取後,往下升級,系統重開後,再做測試,就發現成功了。在公司外部,只要通過帳號密碼認證,就不會被認為是垃圾信,而且成功的寄出。 再去/var/log/maillog查看, 發覺其實還是有經過SpamAssassin的檢查, 只是score都變成-90幾的狀態。我想應該是有成功認證的都會把score都-100吧! 這樣即使IP被列在DNSBL的黑名單中, score也不容易大於零, 自然不會被認為是垃圾信。

Mail Server 移機(FreeBSD -> FreeBSD)

看到這篇文章,剛好我也在想,萬一我們的郵件主機掛點,要怎麼辦?是不是平常要把使用者帳號備份出來,如果有狀況時,至少不用叫使用者再去重新改密碼。 Acme Evil: Mail Server 移機完畢 : "FreeBSD上的mail及家目錄裡的mail資料" 因為Acme Evil是由FreeBSD移到Linux,所以使用Webmin來滙出滙入使用者帳號, 確實是個好方法! 但是我只是想保留使用者的帳號及密碼資訊, 並不想移到別的作業系統, 還是保留使用相同的FreeBSD系統。所以我想應該不用使用Webmin吧!是不是把/etc/passwd, /etc/group等檔案copy出來就好! Google了一下, 果然是如此!整理如下: 1. 備份三個檔案: /etc/passwd /etc/master.passwd /etc/group 2. 重建密碼資料庫: pwd_mkdb -p /etc/master.passwd 3. 如果想要的話, 也可以搬移/home目錄等, 使用tar指令(如Acme Evil文中所述) fb1# tar zcvf home.tar.gz /home/ fb2# scp someone@fb1:/root/home.tar.gz . fb2# cd / fb2# tar zxvf /root/home.tar.gz 其中scp指令用來跨主機copy檔案。 實作了一下, 並測試結果, 果然可以把帳號資訊完整移到別台主機。 這樣以後我只要備份這三個檔案, 有什麼萬一的時候, 大不了重裝一台主機, 再重建帳號, 就可以了。

新文章發表

感謝電子情報雜誌在2010/10號刊出我的作品"Oracle 11g RMAN上手玩", 有空請大家捧捧場, 去買一本來看看吧! 這幾年大環境艱困, 文教事業也不好做。希望台灣可以愈來愈好, 大家更幸福。

Oracle Server CPU 100% utilization debug memo

先說明,這是學習筆記,只供自己備忘用途! 之前在工作上曾經碰過Oracle主機CPU使用率跑到100﹪,造成大部份系統都連不上線,即使連上了,也是跑很慢的情況。後來,透過同事一同努力,終於找到問題點。解決了,但當時匆匆忙忙,也沒仔細把過程記錄下來,現在要回想都有困難。 為了以防之後再遇到同樣問題,花了一些時間,再重新再現當時的情況,並找了一些資料,做了一些測試,記錄如下: 有一支程式(寫得不好)會檢查某個表格的某筆記錄,如果該記錄的locked欄位值為‘Y’,就會一直查重複這個查詢過程,直到值變為不是‘Y’為止。當然,可以猜想這個程式是利用locked欄位當做和其他程式的溝通的機制,當它要做事時,就會先看是否有人在做事,若沒有則先修改locked欄位值,告訴大家我要做事了,其他人看到就會先等待,等做完事再註記locked欄位,其他人看到就知道可以做事了。模擬程式如下: declare locked varchar2(1); begin loop select locked into locked from test1.demotab where id=6; exit when locked 'Y'; end loop; dbms_output.put_line('quit loop'); end; 不幸的是,程式出錯了,有一支程式在做事時當掉了,所以沒有再把locked欄位註記回來。所以,所有程式都一直卡在查詢階段,沒有辦法做事。但是使用者只看到系統卡住,等待之後就會嘗試再開一次程式,如此一直開,一直試。結果,就有很多程式一直在查詢。如此就造成了CPU使用率高到100﹪的情況。(其實只要跑一次模擬程式,記得先將locked值設為‘Y’,CPU就100﹪了) 這個時候要如何查問題? 1.可以下如下SQL: select sid, program, event, final_blocking_session_status from v$session order by time_since_last_wait_micro desc 查看前幾筆記錄的SID值,記下來。 2.再下如下SQL: select sid,event,p1,p1text from v$session_wa...