[MySQL] 使用 mysqldump 指令分別匯出 Schema 結構與資料的方法

預設把資料庫導出的時候都是資料表結構與資料混在一起。如果希望分別匯出的話可以使用下方指令:(環境需安裝 MySQL Client 套件)

輸出 SQL 結構

mysqldump -uDBUSER -pDBPASSWD DBNAME --no-data > schema.sql

輸出資料庫資料

mysqldump -uDBUSER -pDBPASSWD DBNAME --no-create-db --no-create-info --skip-comments --compact > data.sql

重新匯入的方法

在上述兩個操作的資料夾中登入 MySQL

mysql -uDBUSER -pDBPASSWD DBNAME

然後先匯入資料表結構,

source schema.sql;

再匯入資料。

source data.sql;

後記

其實預設全部一起匯出對於一般情況已可滿足,會這樣拆解主要是為了處理編碼轉換的問題上。(續上篇 [PHP] 舊專案、新環境的「向上相容」技術 提到的專案)

轉出結構的部分包含對資料編碼的宣告。資料儲存採該編碼,但匯出的檔案預設為 UTF8 ,所以還須補上 --skip-set-charset --default-character-set=latin1 這個參數來正確轉換(這裡舉例 latin1),然後是替換結構中的宣告為新的編碼 sed 's/CHARSET=latin1/CHARSET=utf8mb4/g'

至於資料的部分也同樣以此參數匯出,然後使用指令 iconv 來轉換過編碼再匯入新的編碼資料庫環境。

iconv  -f CP950 data.sql > data.utf8.sql

麻煩的地方是 BIG5 編碼的資料存入 latin1 編碼格式,無從得知原中文編碼為何又要從 latin1 轉 UTF8 的時候,可以試試 BIG5, CP950 或是 BIG5-2003。

如果碰到 cannot convert 就寫程式開檔案,把 data.sql 開起來一行一行的轉碼為 UTF8 格式轉存。

幸運的你,如果上面都沒出錯,就會得到轉換成 UTF8 編碼的資料囉!

當然,如果像我這樣還會繼續有錯誤的,也難免(就認命吧)。不要採用資料轉匯出的方式,直接寫程式與資料庫對接取資料轉換就可以幾乎保證不會有問題了。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *