2009/07/14

Dealing with a large transaction log file

Transaction log principles

Whenever a data update is made entries are added to the transaction log.
It is not possible to prevent this as it is part of the way sql server maintains integrity - particularly during recovery.

The transaction log is a circular file i.e. when the end is reached any free entries at the start will be used.
This means that all being well the file will stay at a constant size as the current entry cycles round.

The system maintains the MinLSN which is a pointer to the first active log record.
Any log records before this (in the circular file) are free.
The MinLSN will be prevented from moving forward by any open transactions - i.e. the oldest open transaction entry will be >= the MinLSN.
The MinLSN is updated at checkpoint so committing a transaction will not immediately free entries and anything that holds up the checkpoint can cause problems.

If the database is in simple recovery mode all entries prior to the MinLSN will be freed at checkpoint.
If the database is in full recovery mode (and a full backup has been taken) the entries prior to the MinLSN will only be freed by a transaction log backup (not full backup).


Common cause of large transaction log file (.ldf)

Unfortunately the sql server default (except local editions) leaves the databases in full recovery mode.
This menas that if no action is taken no tr log entries will be freed and the log file will eventally fill the disk and crash the system.
The SQL Server installation process is very simple and commonly carried out by inexperienced personel. This will appear to work happily but cause problems later.
I would recommend always setting the model database to simple recovery mode to set the default for new databases.


Stopping the transaction log file (.ldf) from growing

If the log file has grown do to being in full recovery mode then set it to simple before going any further. This should immediately stop the log from growing.
Enterprise manager
Right click on the database, properties, Options, set model to simple, OK.
t-sql
sp_dboption [dbname], 'trunc. log on chkpt.', 'true'


Shrinking the transaction log file (.ldf)

Before this make sure there are free entries by setting the recovery model to simple or backing up the log.

Enterprise manager
Right click on the database, All tasks, Shrink database, Files, Select log file, OK.

t-sql
dbcc shrinkfile ([db_log_name])
Here [db_log_name] is the logical name of the log file as found from sp_helpdb or the table sysfiles


Shrinking the log file via detach/attach

Always take a full backup before a detach.

Detach the database, delete/rename the log file, attach the database - this will create a minimum size log file.
Note that the log file must be deleted/renamed otherwise it will be re-used even though it is not mentioned in the attach.

Enterprise manager
Right click on the database, All tasks, Detach database, OK.
Delete/rename the disk log file.
Right click on databases, All tasks, Attach database, Select the .mdf file, OK, Yes (to the create new log message).

t-sql
sp_detach_db [dbname]
Delete/rename the disk log file.
sp_attach_single_file_db [dbname], [filename]
where [filename] is the name of the physical data file (.mdf).

[轉貼於這裡]

2009/04/27

成功裡的失敗

因為不敢面對新的挑戰, 而往往在舊的領域中頻頻成功, 這也算是一種失敗.

2008/10/08

[HTML] 當頁面過長...

如果頁面過長有滾動條(scroll bar),且希望通過連結的 onclick 事件執行操作;應將它的 href 屬性設為 javascript:void(0);而不是 #,這可以防止不必要的頁面跳動。

e.g.

以前的寫法:

< href="#" onclick="changeTab('condition')">

日後建議寫法:

< href="javascript:void(0)" onclick="changeTab('condition')">

< href="###" onclick="changeTab('condition')">

< href="#" onclick="changeTab('condition'); return false;">

2008/09/30

程式與香雞排/蔡學鏞 - 轉貼文章

程式與香雞排/蔡學鏞

當程式員很可憐,在台灣當程式員尤其可憐。薪資低、工作量大、
地位不高、技術又容易被淘汰。難怪有人半開玩笑地告訴我,他以後不寫程式要改行去賣香雞排。

照理說,軟體開發是很專業的領域,越是專業的領域,越是處於金字塔的尖端,應該薪資很不錯才是,但不知怎地,台灣的程式員就是從來未獲重視。我們不要表面上的重視,我們要薪資上的重視。據我所知,大陸程式員的薪資水平,比起我們台灣高出許多(從國民所得、物價、房價來比較),美國程式員的薪資更是高得讓我猛嚥口水。

想想看,如果你在台北市租一間會漏水的小公寓,月租兩萬元(管理費和水電另計)。莫名其妙的多元入學方案實施之後,小孩壓力更大,要補習的東西更多。如果你有兩個小孩,每個月的補習費共要花上五千元。小孩要學費、生活費,又是另一個五千元。(乾脆含淚將小孩送人扶養。)

長得不怎麼好看的老婆就只會天天敷SKII面膜,因為她妄想SKII獨特的Pitera成分可以讓她的皮膚水水嫩嫩的,就和鄭秀文一樣。明明身材不好,卻又特別喜歡買DKNY昂貴的流行服裝。

光是這些支出加上你自己的支出,就已經超過五萬元了。你認為軟體公司會花五萬元請一個程式員嗎?在台灣,程式員要有五萬元以上的收入,恐怕要另有兼職才行。

於是你到歐萊禮兼職翻譯書,拼了老命把下班後的時間和假日的時間都拿來翻譯書,結果超過半年才翻譯完一本,還好歐萊禮仁慈不扣你延遲交稿的違約金。但這半年來身體變差了,微薄的稿酬光是拿來扣掉白蘭式雞精和補藥的支出,平均一個月也只多了約一萬元的收入,但總算因此達到收支平衡。

但這倒也不算真正的收支平衡,意外的收入支出也是有的:統一發票中獎收入平均一個月進帳200元,但偶而被倒會,加上有某個不長進的親戚時常來伸手要錢,你每個月還得多支出5,000元。婚喪喜慶的禮金支出、平常還要繳這個稅和那個稅、這個費和那個費的...每每讓你心疼地暗暗叫苦。

台灣的軟體公司一向不肯好好地花錢雇用優秀的程式員,還奢談什麼知識經濟。在寫程式與賣香雞排之間作抉擇,如果我要留在台灣,我可能會選擇賣香雞排,如果我要出國謀生(美國、新加坡...),我會選擇寫程式。畢竟,要寫程式,就要到一個尊重程式員專業能力的地方。寫程式的薪資不高,就沒辦法吸收好的人才,至少我就不打算在台灣寫程式寫太久。興趣當然重要,但付不出帳單光靠興趣撐著,你認為能撐多久?賣香雞排稱不上是知識經濟,但只要不炸得太難吃,至少收入比寫程式好。

所以我覺得,到夜市賣香雞排的提議還真是可以考慮考慮,畢竟在台灣當程式員,一家大小在除夕夜如同賣火材的小女孩一般餓死凍死的機會很高。賣香雞排,雖然辛苦,但看著香雞排老闆們眉開眼笑的,荷包滿滿的,還可以趁著傍晚開市前,開著賓士轎車帶著全家出遊呢。

台北市饒河街夜市的攤販告訴我,攤位租金一個月一萬元出頭,我估算了一下,如果我平均一天擺攤6小時,賣了香雞排300個,每個淨賺13元,一個月淨賺117,000元,扣掉攤位租金15,000,可以收入約十萬新台幣(免稅),實在比程式員普遍的月薪30,000~40,000(未稅)好太多了。而且香雞排的炸法不會每年推出新版本。

在台灣的軟體公司內部,有許多非科班出身的程式員,他們的薪資低廉,通常又很努力。軟體公司就算聘到了這種便宜又努力的程式員,也不要太高興,因為這樣的程式員,通常都只是把目前的公司當一個學習的過渡階段,等到學得差不多,拍拍屁股就走人了,才沒打算一輩子接受這樣的低薪。但可悲的是,大部分的公司都沒有良好的程式員生涯規劃制度,反正大家互相利用。所以這些程式員很可能在做計畫的過程中,學不到東西又磨得身心俱疲。

所以,何苦來哉!不如我們通通去賣香雞排吧!但是你們只能到通化街夜市和士林夜市賣,不可以到我屬意的饒河街夜市和我搶生意(我打聽過,饒河街的攤位租金是三者中最便宜的)。我的攤位名稱要取做什麼?...嗯!就叫做「Java雞排」好了,以紀念我曾有過的Java程式員身份。我打算把雞排分成三種大小,最大到最小分別叫做J2EE、J2SE以及J2ME。哪天你到饒河街夜市,發現了一個乾乾瘦瘦、看起來營養不良的少年頭家用著生硬的台語在吆喝著:「來呦!來呦!好呷的香雞排,J2EE一塊50,J2SE一塊40,J2ME一塊30......」請你也來光顧一下吧!...看在Java的份上。


再論香雞排

網路上到處張貼轉寄「程式與香雞排」一文,使得該文章在網路上引起程式員廣大的迴響。當「該文作者」在BBS各版和各種網頁討論區都看到自己的文章被人到處張貼討論時,驚駭莫名。更荒謬的是,該文章居然還繞了一圈被人轉寄到「該文作者」的email信箱中。該文章引起迴響的程度遠遠超出「該文作者」的預期。

有的人對於「該文作者」寄予無限的同情,畢竟該文章內容寫得太負面了。Oh!No.你們搞錯同情對象了,事實上該文並非「該文作者」的寫照,畢竟「該文作者」未婚(不用擔心SKII和DKNY的支出),也還沒未婚生子(不用擔心多元入學方案和補習費),也從不標會(對高風險事物沒興趣),也從不對統一發票的中獎號碼(這點小錢根本不放在眼裡),也沒有不長進的親戚敢上門伸手要錢(言語犀利苛薄,親戚躲他像躲鬼一樣避之唯恐不及),也不是非科班出身的便宜程式員(雖然沒本事取得博士學位,但好歹也是個清華大學的資訊碩士),也在台灣和大陸的Java圈子都小有名氣(但不排除有些人孤陋寡聞)。橫看豎看,「該文作者」都不算是一個受到壓榨的程式員。甚至「該文作者」經常逛街瘋狂瞎拼買到手軟,出門懶得擠公車只坐計程車,在路上看到賣口香糖的老人或殘障人士一定會捐錢,......這麼努力花錢,但不知怎地錢就是花不完,所以「該文作者」可以說是生活得相當優渥的。而且「該文作者」還得寸進尺,常嚷嚷不想工作,宣稱以後要辭職回家變賣家產,靠父母親一點一滴掙來的財產來過無憂無慮的生活。你一定想問:既然如此,「該文作者」幹嘛寫了一篇胡亂抱怨的文章,無端惹來你掬一
把同情之淚?我希望你不要
因此怨懟「該文作者」欺騙你的感情,「該文作者」只是利用文學中「示現修辭格」的手法來撰寫該文章,以求得強烈的閱讀效果,這和「十八歲賺一億」一書作者蓄意欺騙的行徑是完全不同的。「該文作者」悲天憫人,對於許多程式員的遭遇感同身受,透過該文章,將他所知道的一切披露出來,代替許許多多台灣的程式員發聲。

夠了!我們不要再談論「該文作者」了!免得讓你因為過度羨慕他而開始哀聲嘆氣,畢竟這麼有福氣又囂張的人實在不多。該文作者「托夢」請我整理這些日子以來讀者的看法,我無法拒絕這樣的請託,因為我和「該文作者」的關係實在太密切了。

有一些有志進入軟體產業的在學學生憂心忡忡,表示看了該文章之後,信心開始動搖,有幻滅的感覺。我認為,幻滅是成長的開始,早點經歷幻滅總是好事,才不會一廂情願地只看到事物好的一面,也因此會多做好一些準備(不管是心理上的準備或技能上的準備),成功的機會就會大幅提高。學生距離就業還有許多年的光景,只要好好把握這些年充實自己,其實以後你們在軟體產業的發展前途仍然是很不錯的。至於程式與香雞排的作者,則是一個「先天下之憂而憂,後天下之樂仍憂」的一個「馬不停蹄地憂傷」的小子,所以你們不要把他那過度負面的看法放在心上。香雞排,你們負責吃就好了,要賣也是我來賣。

也有許多讀者對於該文章感到心有戚戚焉,這類的讀者以程式員居多。我要警告這類的程式員,如果你平常不好好加強自己的分析設計技巧、管理能力、或其他技能,當程式員當了五年後仍然只是最低階的程式員,還得親自寫程式,辛辛苦苦地追著瑣碎的技術跑,那麼你就真得要小心考慮,賣香雞排或許真的比較適合你。

也有人的薪資不止五萬元,質疑該文章太悲觀。一般來說,這種人可能在外商公司、或者已經脫離程式員等級、或者在不太軟的軟體公司(例如chipdesign),或者在非軟體公司的MIS部門。我認識一個年資約兩年的程式員,在一家不太軟的外商軟體公司當程式員,月薪約6萬台幣,但這樣的價碼可是大多數的程式員都無法達到的。薪水這麼高的程式員,不需要轉行賣香雞排。

有些人則沒有受到「該文作者」的恫嚇所打擊,仍堅持要繼續在軟體行業走下去,我很佩服這樣的人,因為你正是軟體產業需要的人。你不把錢看得太重,而且肯努力、有興趣,只要繼續持之以恆,我相信你在未來的報酬自然也不會太差的。但是你千萬要慎選公司,選擇一個有發展前景又願意栽培你的公司,否則你最後還是可能會去賣香雞排的。

還有一些讀者提出許多有建設性的寶貴意見,這些意見包括了:「雞排一塊不只賺13元,一天不只賣300個,十萬元的估計太保守」、「珍珠奶茶其實更有賺頭,每杯淨賺八成」、「滷味不需要技巧,比較適合程式員轉行」、「當靈修講師不需要大學學歷,輕輕鬆鬆月入七萬元」。但不管怎樣,我還是對賣香雞排情有獨鍾,我兩小時前才剛到饒河街夜市吃了一個香雞排,此刻仍然齒頰留香,回味無窮。賣香雞排的收入也有很大的差異,有些香雞排的攤位門可羅雀,有些香雞排的攤位生意好到老闆累得一邊吊點滴一邊炸香雞排。前陣子我看到電視新聞採訪一位在新竹科學園區附近賣香雞排的女老闆,她說她每個月賺45萬元以上。她還告訴記者香雞排好吃的秘訣在於醬料,但任憑記者怎麼追問,她仍不肯透露醬料的作法。急於開店賣香雞排的我對此婆娘小氣之舉很不以為然,我悻悻然地自言自語:「哼!秘訣?你以為我無法得知你的醬料配方?」我決定重金禮聘擅長偷拍的「郭女士」出馬,先接近該香雞排店的女老闆成為她的靈修姊妹淘,取得信任之後,再潛入該女老闆的廚房裝設針孔攝影機。我相信,以郭女士純熟的偷拍手法,醬料的配方會落入我手中。有了她的醬料,加上我獨門研發使用高筋麵粉和數十種藥材做出來的銷魂蝕骨酥皮
,我寫程式的苦日子即將結束,我終將成為香雞排大亨的。想到這裡,我喜孜孜地笑了。

香雞排三部曲:完結篇

我所撰寫的香雞排首部曲(程式與香雞排)在台灣程式員圈子造成一股轟動,幾乎每個程式員都讀過,成了網路上的熱門話題。香雞排話題太過度發酵,是我所不樂見的。每當有程式員感嘆自己的收入太低時,就會丟出一句「不如改行去賣香雞排」以為自嘲,香雞排儼然是軟體產業主管最不願意碰觸的禁忌圖騰。

據我所知,許多程式員讀過該文章之後,紛紛開始自怨自艾,不想在這個圈子繼續待下去。我自感罪孽深重,所以連忙以比較樂觀的態度寫了香雞排第二部曲(再論香雞排),希望達到平衡作用。但是現在,我必須告訴你,香雞排第二部曲太過於樂觀,我必須寫下這篇香雞排第三部曲,也就是香雞排系列的完結篇,告訴你其實也不要太樂觀。為了提高可信度,本文章會提出許多數據,以為佐證。

根據我多方打量,在台灣,大學畢業,具有工作經驗一年的程式員,約30,000~35,000新台幣(月薪),我們就姑且取最高值35,000新台幣來估算好了。而在中國大陸,大學畢業,具有工作經驗一年的程式員,(月薪)薪資差異頗大,有2,000人民幣的,也有4,000人民幣的,我取估計值為3,500人民幣,約等於14,000新台幣(人民幣幣值以新台幣四倍估算)。

你很覺得很更高興嗎?因為你的薪資是大陸程式員的2.5倍(35,000/14,000=2.5)。先別高興,你必須把物價和國民所得也考慮進去才行。

考慮物價因素。台灣電腦雜誌的售價200元新台幣,大陸電腦雜誌的售價10元人民幣,約40元新台幣,是台灣的1/5。台灣電腦書籍的售價600新台幣,大陸書籍的售價30人民幣,約120新台幣,是台灣的1/5。也就是說,台灣的資訊出版品售價約為大陸的5倍,但台灣的程式員薪資只有大陸的2.5倍。也就是說,在台灣的程式員買一本書,在大陸的程式員可以買兩本書。

考慮國民所得因素。台灣國民所得年平均近15,000美金,約等於525,000新台幣,是台灣程式員月收入的15倍。大陸國民所得年平均近1,000美金,約等於35,000新台幣,是大陸程式員月收入的2.5倍。簡單來說,大陸程式員工作2.5個月,就能賺到大陸民眾一整年的所得;台灣程式員工作15個月,才能賺到台灣民眾一整年的所得。比較起來,大陸程式員賺錢的速度是台灣程式員的15/2.5倍,也就是6倍。

因為大陸的都市生活水平比未開發的地方高出許多,貧富差距、城鄉差距很大,為了減少誤差,我們必須把這些因素所造成的影響也算進去。我不知道大陸的房租、交通費、餐飲費用為何,所以無法比較。但我估計,這會使得前述的「6倍」數字稍微降低一點,所以我把「6倍」降為「5倍」,這樣的估算應該算合理,差距5倍耶!如果你的薪水原本是四萬元,五倍就是20萬新台幣。想想,在台灣,一個月有了二十萬的進帳,日子豈不快樂似神仙。

台灣程式員的薪資水準比人家差五倍,難道能力也比人家差五倍?我不這麼認為,我反倒認為台灣的程式員普遍能力比大陸程式員好,因為台灣的資訊產業、資訊教育很早就開始了。像我這種寫了近19年程式的人也不是很少見,有過十年以上程式經驗的人更是比比皆是。

香雞排三部曲系列文章不是為我自己抱怨,因為我對自己的未來有一套規劃,不打算讓自己陷入「富爸爸,窮爸爸」一書所謂的「mouserace」中。只是,有多少程式員會有這樣的規劃。台灣的程式員就像是在被熱水緩慢地煮熟的青蛙。而我就像是一隻已經跳離開鍋子,開始尋找水塘的青蛙,我寧願在夏天發燙的柏油路上,被川流不息的來車壓成扁扁的「青蛙乾」,也不願意當一隻任人烹煮的青蛙。

我知道我這篇文章又會引起一些人的抗議,特別是資訊產業主管的抗議。如果你是這樣的主管,我勸你先別找我興師問罪,因為根據我的判斷,這篇文章效用只有短暫的。原本不自覺水溫上升的青蛙,在讀過這篇文章之後開始騷動「你說什麼!鍋底正在加熱!」...一陣子緊張之後又漸漸歸於平靜,或許是因為已經習慣這樣的環境了,或許是因為擔心出了鍋子會找不到水源而乾死,所以青蛙繼續待在鍋內,真正跳出鍋子另覓水塘的青蛙只有極少數。而有趣的是,勸青蛙不要跳出鍋子的那些主管們,本身可能也是一隻待煮熟的青蛙呢!

拿起溫度計,現在就量一下你周圍的水溫有多少度?攝氏60度?攝氏70度?
本文作者:蔡學鏞

NGINX SSL/設定檔案

#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #...