2011-05-08

MySQL 版本升級

公司即將搬移到新廠房,打算藉此機會將年代久遠的主機換新,首要的工作是解決資料庫太舊的問題。

一般來說資料庫能用就用,絕大多數的資料庫軟體也能向下相容,但今日網路世界已大不相同,舊版軟體的支援也早已過了年限,與其一直用著舊版,不如將它更新,對未來電子簽核系統的改版也比較容易。

公司原有的 MySQL 版本是 3.23.51,在升級過程中讓我吃足苦頭,畢竟非科班的我實在是摸不著頭緒,在網路上找了許多資料,對於 big5 轉換到 utf8 的著墨大多在於 PHP,對我沒用,公司是只有 ASP,為此我採取進 MySQL 下以指令來作升級,參照網路的方法,流程是資料匯出,修改匯出資料,匯入新系統,我都照著做卻完全無法匯入,原本打算放棄,直接在新系統中以虛擬機來跑舊版程式,所幸 VirtualBox 的效能及操作介面都算可以,讓我在自己的機器上不斷的重建系統,總算有點成果,剩下的就差實機演練了,或許將來新廠房就用這套軟體來跑了。記錄一下流程,供將來實機操作的參考。

首先架構系統,不論實機或虛擬機,得先有作業系統,以 Windows XP 作為新的系統,裝上 IIS 後把舊版的電子簽核整個目錄複製到新系統中,設定好 IIS 虛擬目錄指向它後,調整權限就可以了。

接下來裝設 MySQL 5.5.11,由於是統包版本,所以連帶把 ODBC Connector 也一併裝上,由於舊版是使用 3.5.1,而新版的 Connector 是 5.1 版,一度以為是這層關係,所以網頁無法運作。

再下來就是核心問題了──資料庫的移轉,也就是吃足苦頭的編碼問題,第一個步驟是檢查編碼設定,以 root 身份進入 MySQL,執行「show variables like "%character%";」,不知是前輩設定的問題,還是 MySQL 3.23.51 實在太舊了,僅顯示一個編碼設定項目,而其值是「big5」,就用預設值直接滙出,不需指定「--default-character-set=big5」參數。操作許多次後,我決定為免檔案過大,採取資料庫結構及各資料表分別匯出。
登出 MySQL 後首先是結構「mysqldump -uroot -p -q -d --add-drop-table 資料庫 > sp-struc.sql」,「-q」是直接匯出而不是先保存於記憶體中,「-d」是只要結構,「--add-drop-table」是讓匯出的資訊中包含刪除舊資料表的動作,方便匯入新系統時的操作。
而資料表原本是用「mysqldump -uroot -p -q -t 資料庫 > sp-data.sql」即可,「-t」就是只匯出資料而沒有結構,若是資料數多的話,檔案將會非常巨大,這對 Windows 系列(不包含 Win7)來說是個負擔,所以採取各資料表各別匯出,「mysqldump -uroot -p -q -t 資料庫 資料表 > sp-data-資料表.sql」。

再下來就是對這些檔案進行必要的編輯,或許是我的 MySQL 版次一下升得太多,參照網路上的方法,試了再試,修改後的檔案就是不能用,在一整天的虛擬機重構過程中,不斷的調整測試,天曉得我居然使用 Windows 7 來導出 Windows 2000 下的東西準備給 Windows XP 服用,從作業系統、資料庫、ODBC Connector 等,沒有一個地方的版本是相同的,資料庫的結構再怎麼複雜也不會大到哪去,就一直用匯出的結構檔修改測試,終於找到一個讓我快吐血的答案,那就是 Windows 那該死的「BOM」,那是啥?因為微?習慣到處留伏筆,連個檔案都得留個 BOM 記號它才曉得那是個 UTF8 編碼的檔案。所以最後的解決方式是開啟檔案後,資料部份不做修改,用另存新檔添加「BOM」記號轉存即可,而結構部分只將「TYPE=MyISAM;」改成「ENGINE=MyISAM DEFAULT CHARSET=utf8;」而已,並沒有像網路文章一樣,添加 chatacter 的設定語句。

附註:新的系統下 MySQL 是 5.5.11,而所有的 character 環境變數除 filesystem 是 binary 外,其餘全是 utf8。

Update 20110514:
程式寫得太爛真是個未爆彈,對於資料庫的操作竟沒有做出該有的保護措施,僅單純的將資料往資料庫丟,結果卻造成非資訊人員操作上的無心,引發「隱碼攻擊」。讓系統呈現半停頓狀態。
不懂就不要大嘴巴,講了一堆你倒是拿出解決的辦法啊!

0 意見: