2010年11月14日 星期日

手動更新 MyISAM 檔案的注意事項

MyISAM 的好處之一是能跨 OS 直接執行, 只要複製檔案即可 (InnoDB 不能這麼做)。配合 "rsync -av --delete db1/ db2/", 就能從檔案系統的層級快速同步 database db1 到 db2, 方便開發。但複製檔案後沒有重開 MySQL 的話, 有可能會有以下問題:
  • 更新資料後可能會因 query cache 而取到舊資料, 執行 "reset query cache" 可解決這問題。保險起見, 用  "flush tables with read lock; unlock tables;"  更穩。
  • 可能會找不到新加的欄位, 原因可能是 INFORMATION_SCHEMA 沒有更新, 文件第一頁就說這個 database 是唯讀的, 不能更新。可以用 "flush tables with read lock; unlock tables;" 可解決 (強迫關掉所有 table, 下次用時就會重讀硬碟了)。
另一種可怕的錯誤是, 不小心在 mysql 目錄下放了不對的檔案, 比方說 rsync 時不小心少打 "/", 變成在 database 目錄下放另一個目錄, 而不是放入 MySQL 的檔案 (如 *.frm, *.MYD, *.MYI)。這種情況下做任何 SQL 都會有 warning, 有些 framework / lib 會在發現 warning 時直接丟 exception 出來, 結果就是其它程式跑出不知所云的錯誤訊息, 很難除錯。

2010-11-16 更新

今天中另一個雷, MEMORY engine 在硬碟上只有 frm 檔用來存 schema, 資料和 index 都在記憶體裡, 別傻傻的 rsync db1 到 db2 後, 就以為兩個資料庫內容一模一樣啊。

2010-11-22 更新

《High performance MySQL 2e》p146 "Speeding up alter table" 提到不少非正規更新檔案的方法, 可以學到一些小技巧, 對於自己開發用的資料庫來說, 頗實用的。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...