2012年2月7日 星期二

MySQL 資料檔移轉 (on osx)

由於某台測試 Server 的一些設定檔毁損讓 LVM 無法正常掛載,經 MIS 緊急修復後我也參與了復原工作。從掛回去的檔案系統上,MIS 備份出了 MySQL data 路徑的資料庫檔案。由於 MySQL Server 是 5.0 版本的,要直接將檔案丟到新版的 MySQL Server 是不可行的。最好的情況是能轉變成 mysqldump 匯出的 .sql 檔。在 MySQL 官網看了半天,找不到合用的 5.0 binary 檔,要弄個合適的 linux 環境可能又要花不少時間,乾脆就抓 source code 自己來編了。這樣就可以不需要 linux 環境,能編出來放在 osx 上執行。

source code 的編譯上沒有遇到什麼困難,一如往常地 ./configure --prefix=/opt/mysql && make install 就能搞定。而接下來遇到的問題才是值得我筆記下來的部分!

將備份出來的 data 放至 MySQL 指定到的 data 路徑(自編的情況是放在 $MYSQL/var),啟動 MySQL 看起來一切正常。show tables 也都有看到資料表出現,但有些是採用 innodb engine,因為忘了放 ibdata1 檔而只有看到名字,沒有實際的內容。在關閉 MySQL Server 放回檔案就能正確讀到那些使用 innodb engine 的資料表。

我開始了第一次 mysqldump 的嘗試,但它跟我說找不到資料表:

mysqldump: Got error: 1146: Table .agentlog doesn't exist when using LOCK TABLES

這個資料表在 show tables 有出現,但名稱為 AgentLog。我也查了檔案是有 AgentLog.frm 的。於是我推測問題應該是出在 osx 的檔案系統,osx 安裝時選用的檔案系統預設為不分大小寫的。要在 osx 上建立出區分大小寫的檔案系統很容易,這步驟在 Android Soruce 編譯的指引中有包含:請參考『Setting up a Mac OS X build environment』。

於是我重新將資料放在新建立的、有區分大小寫的檔案系統中,再度執行 mysqldump 就不會找不到檔案。但我遇到新的問題:mysqldump 要匯出某些表格時說它無法支援 big5_chinese_ci。於是我查了 ./configure --help

--with-charset=CHARSET
Default character set, use one of:
binary
armscii8 ascii big5 cp1250 cp1251 cp1256 cp1257
cp850 cp852 cp866 cp932 dec8 eucjpms euckr gb2312 gbk geostd8
greek hebrew hp8 keybcs2 koi8r koi8u
latin1 latin2lab latin5 latin7 macce macroman
sjis swe7 tis620 ucs2 ujis utf8

在預設的情況下沒有包含 big5_chinese_ci!不過我們有另一個參數可以使用:

--with-extra-charsets=CHARSET,CHARSET,...
Use charsets in addition to default (none, complex,
all, or a list selected from the above sets)

於是我指定了 --with-extra-charsets=all,最後終於將資料匯成 .sql 的型式

沒有留言:

張貼留言