MySQL 從 3.23 變到 4.0 的變化之一就是讓預設的 db 格式變成 InnoDB (3.23 的後期版本要使用 mysql-max 才支援),這種格式的好處是可以支援更多的正式 SQL 指令,像是 foreign key (有接觸比較多資料庫的人應該會知道,MySQL 還有很多正式的 SQL 指令沒有支援到),根據我的經驗,使用這種格式的資料庫,如果你把其中一個 database (也就是你 mysql/data/ 裡面的一個目錄) 備份覆蓋回去的話,可能會在讀取或是寫入的時候出現錯誤。Manual 裡面是有提過 InnoDB 如果要做 "binary backup" 的話要怎麼做,但是 backup 章節裡面還是只有寫 mysqldump 這種正統的用法 -- 當然,你也要使用正確。
直接用 mysql/data/ 來備份還有一個問題,通常是發生在 major version upgrade 的時候 (ex. 3.23 -> 4.0),mysql 本身的資料欄位有更動或是新增,這時候直接使用這種備份有時候會遇到寫入資料的時候沒有 default value 的問題,我碰了好幾次。用 sql 備份的時候 default value 會在你 import sql 進去的時候自動加上,就不會有這個問題。
我只碰過以上兩種錯誤的 case,提出來和大家分享。雖然我也知道 4.1 以後的 charset 問題讓大家用起來很頭大,但是我覺得還是用 sql 備份比較妥當,當然你也可以兩個都做。


