Posts

Showing posts from 2014

[SQL Server] 解決log檔(ldf file)過度膨脹的實戰經驗

Image
背景:
公司最近把一套每天有相對大量交易(之前公司更大很多很多倍)的系統轉移到SQL Server去,不到一個月交易檔(ldf)已經貼近數據檔(mdf)的size,真的好可怕啊。
身為SQL Server的DBA當然 要替月行道,警惡懲奸 不能讓這種情況繼續下去。
解決方案選擇: 第一個我想到的方法是把Database的Recovery model設成Simple,簡單來說就是不需要交易記錄,對於Insert Delete Update 很少的系統勉強還說得過去,不過對於交易量大的系統來說就不行了,沒有交易記錄萬一資料庫突然往生,總不能用full backup還原然後要User重新輸入一天的交易吧。
第二個方法是定時進行備份。為什麼log大小跟備份有關係呢? 簡單來說,資料庫的ldf檔就是用來儲存Full Backup後所發生的所有交易。如果你從今天從來沒有為資料庫進行過備份,理論上ldf檔會無限的膨脹下去,而且利用Shrink指令也無法把交易檔壓縮。因為沒備份的話就等於ldf檔裡面的東西統統有用,當然沒辦法壓縮了。所以要保持交易檔案的size就是要持續保持備份,在每次備份完了以後自動把交易檔Truncate成初始大小,這樣可以長期保持相對小的交易檔。 所以,最後我選擇了方案二。

實作流程考慮因素:
SQL Server的backup model一定要一份full backup再塔配其他備份檔一起使用(SQL Server的備份model解釋在此),要達到控制ldf檔案大小的目的,備份可以每天只是Full Backup,也可以是Full->T-log,也可以是最複雜Full->Diff->T-log,我考慮使用那一種的因素主要有以下:

資料庫本身只是約55GB不是太大;每天交易量不多,每分鐘約10筆交易;使用者允許少量的data loss,一天Data loss肯定不行;資料庫只是辦公時間才會用。
我個人認為Backup Plan越簡單越好,發生狀況的時候已經很緊張,複雜的Backup只會令事情更糟。反正今天硬碟實在是太便宜,天天備份幾次也無所謂,因此在儘量簡化備份流程的前題之下,小弟傾向每天Full BackUp一次,每小時備份一次T-log,就是Full->T-log的塔配。

實現步驟:
好吧,根據之前實作流程的結論動手做看看吧。要自動化整個備份工…

[Ubuntu] 14.04 如何更換theme

Image
前言:
在我的Thinkpad X200裝了Windows 8一陣子, 實在無法再忍受Win8這種難用得爆炸的介面. 所以為了小黑的生命, 主人的將來, 地球的命運, 所以我決心投入Ubuntu的懷抱, 灌了Ubuntu的小黑開機關機速度超級快, 裡面再灌VM就可以用Visual Studio, 用了三個月暫時還沒有不適應. 不過小弟就是有點不喜歡Ubuntu的風格, 那怎樣換Theme呢?

實作:
在Ubuntu上裝Theme的方法有很多, 以下只說我自己成功的案例 :) 這次我安裝的是Numix Theme.  我個人喜歡扁平化的風格 XD

先安裝Unity Tweak這套工具
sudo apt-get install unity-tweak-tool
裝好以後打後會看到這個畫面



接下來安裝Numix Theme, 在Terminal中:
sudo add-apt-repository ppa:numix/ppa
sudo apt-get update
sudo apt-get install numix-gtk-theme numix-icon-theme-circle
sudo apt-get install numix-wallpaper-notd


搞定以後反回Unity Tweak, 按Appearance中的Theme按鈕.


在Theme tab中應該會看見Numix這個字的theme, 就選一個吧



沒有意外的話會發現工具列應該會變了顏色, 接下來把icon也換一下吧, 按一下icon的tab, 試試選一下Numix-circle



登登, 搞定!


總結: Ubuntu真的不錯用, 特別是像我這種要經常開會的人, 關機速度快可以快速逃離會議室不用給User抓住....XD



[SQL Server] 資料遺失後的檢討

Image
前言:
公司的SQL Server有不同的Job(工作)每天負責把AS400的資料匯入到SQL Server。身為DBA當然要確保這些Job是OK。由於這些Job是由業務系統的管理員提供需求再由我來寫,對於Job的內容其實全不知情,這就是問題所在(哀)。


上星期接到業務部門投訴在公司網站上找不到一個多月前的申請,同事叫了我去查資料庫,果然出了意外。這個資料表每天給AS400的舊資料覆寫,造成新紀錄只能在SQL Server內存在一天。又剛好我們的第三方備份只保存一個月,又剛好我們沒有使用SQL Server內建的備份功能,當然,我就是回不去了....


至於結果,人家部門才不會理你是你的錯還是其他人的錯,總之資料不見了就是DBA的問題。最後好不容易堐過了幾場補救方案的會議....

問題:

只有一個月的備份足夠嗎?SQL Server只有Transaction log可以把資料救回來嗎?研究
第一點:個人建議三個月是比較穩妥的做法。之於我們公司不知為什麼硬碟空間少得非常可憐,可以考慮每星期Full backup, 然後每天Diff的做法。總之,只備份一個月的確有很多難以估計的風險。

第二點:不行,死心吧。Transaction Log是交易的Delta資料,如果最初的時候沒有做一次Full Backup, 因為沒有被參照的完整備份,光有Transaction log是沒用的。如果你的SQL Server選擇的是Full Recovery, 可以看下這張圖,這張圖清楚說明先有Full backup後面的log才有意義。清楚的說明可以參考Microsoft這篇文章。 同學,死心吧...


總結: 異質資料庫資料同步的確是個很難搞的問題,會有很多不可預期的因素,因此個人是認為資源許可的話還是把備份時間盡量拉長,如果空間不足可以選擇Diff BackUp把備份時間再保持多一點點...
參考資料: Differential Database Backups

[軟體] 在Windows7 安裝骨灰級學倉頡軟體--快快樂樂學倉頡

Image
前言:話說我們這些用電腦宅齡超過十五年以上的挨踢人聚在一起的時候總喜歡提一些當年的技術,Duron鉛筆超頻這種骨灰級方案在圈裡是常識吧XD。
突然有朋友提到"快快樂樂學倉頡"這套DOS 1.0年代用來學打字的軟體,應該是很多港澳挨踢人的集體回憶吧。
有沒有方法在Windows7上回憶一下呢?答案當然是有啦!


方法:這次我們會用到DOSBox這套軟體。根據官網說法"DOSBox is an emulator that recreates a MS-DOS compatible environment"。顧名思義DOSBOX就是一台MS-DOS的虛擬機器囉。安裝好以後在裡面安裝快快樂樂學倉頡基本上就OK了。準備工作: 根據貴用戶的要OS, 先到這裡下載相對應的DOSBox版本,我裝的是Windows版本。快快樂樂學倉頡的執行檔。(沒有的話可以私下問我)
步驟:
裝好了以後按下圖示開啟進入到DOSBox主畫面
由於這裡是MS-DOS的虛擬機器,當然不會有任何其他檔案,接下來我們要把裝住 "快快樂樂學倉頡" 的資料夾掛載(Mount)到虛擬機器去。這裡裝住軟體的資料夾叫 "HPCJ",所以在浮標上輸入mount C: C:\Users\xxxxx\Documents\Software\HPCJ
這句的意思是mount a disk called "C:", and its location is "C:\Users\xxxxx\Documents\Software\HPCJ",搞定以後按確定。就會出現已經mount好的訊息。接下來可以直接存取"快快樂樂學倉頡" 資料夾的內容了。先輸入C: 然後按確定跳到剛掛載的C:
直接輸入"快快樂樂學倉頡"的exe名稱按確認。例如我的是Open.exe,按enter。
登登~!!成功了。



打了這麼多年,其實我打字速度也不快就是了。囧rz

[SQL Server] 如何轉換Collation?

Image
歷史久遠的老品牌公司嘛,就是歷史包袱很多經常要考慮相容性的問題。因為公司舊的Sql server不是使用預設的Collation,如果我在新資料庫硬要使用新的Collation,很多使用HKSCS big5碼的香港字符就會爛掉(例如啱,嘅)。最後為了趕工加上老闆的決定要轉回用舊的collation。改Collation這回事....很抱歉是沒有GUI可以使用(噗)。
先把SQL Server 2012安裝光碟mount到SQL Server. 例如我把整個image放在C:\sqlserver.
打開cmd, 把位置移到C:\sqlserver, 然後輸入 Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=administrator /SAPWD=<你sa的密碼> /SQLCOLLATION=Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS_SC
在這裡 /SQLSYSADMINACCOUNTS一定要輸入administrator, 輸入sa不知道為什麼無法確認admin帳號 囧, 確認無誤後按Enter.沒有問題的話大概跑個五分鐘, 從新看到C:\sql server就完成了 (M$一點提示都沒有真陽春)
接下來當然是把之前備份的設定慢慢重灌回去囉(哀)

[SQL Server] 如何辨別欄位中的數據是否包含繁體中文字?

背景:
今天好不幸運,因為資料出錯的關係需要找出在SQL Server內某一資料表中某個欄位含有中文的 record (s)。SQL Server當然....沒有預載這個功能啦。所以只好自己寫一隻T-SQL。囧

方法原理:
這次會用到的是patindex這個功能。patindex 的作用是傳回指定之運算式中的模式,在所有有效文字和字元資料類型中第一次出現的起始位置,如果找不到模式,便傳回零[1]。簡單點來說如果沒有發現中文字傳回零,否則傳回非零數字。這樣就可以判斷欄位是否有中文字了。

例子:
SELECT *
from <你想要尋找的資料表>
where patindex('%[一-龜]%',<你想要判斷的欄位>) > 0

為什麼一定 "一" 到 "龜"呢?因為ASCII中繁體中文字的範圍剛好是40869,那就是說如果找到ASCII碼在此範圍的字一定是中文囉。


希望對於大家有點小幫助,如果以上論點有問題歡迎提出給小弟一次機會更正喔 :-)。

參考:
http://msdn.microsoft.com/zh-tw/library/ms188395.aspx