← Back to list

魔術師日記 1 - 消失的DB

MySQL in 5.7, MyISAM has MYD, MYI, FRM files. In 8.0, the FRM is replaced with SDI (Serialized Dictionnary Information)

James Liang · 2022-03-30 09:57 · 1 claps · 2.1 min read
#mysql #myisam
Open on Medium ↗

魔術師日記 1 - 消失的DB

公司的外包系統準備今年後不再續約,準備自己開發一套新的系統,

由於某些不好說的原因此專案沒有任何文件或是程式碼,

這週剛收到外包提供的DB備份,

既期待又怕被傷害的拆開大禮包一看,

驚喜 :這個備份檔,名不虛傳還真的是從DB檔案"備份"出來的FRM 跟MYD檔。

依照之前的經驗,本機 Windows + Laragon 的環境下開啟直接複製到laragon\data\mysql\ 、匯出成sql後、匯入到同事先前建立好的開發環境Ubuntu+Mysql 就可以開始奇幻旅程。此時後面的同事A默默地說了一句:我把檔案直接複製到開發環境中為什麼不行。讓我們請出Google大神來研究一下:

db.opt 用來記錄該庫的預設字符集編碼和字符集排序規則用的。也就是說如果你建立資料庫指定預設字符集和排序規則,那麼後續建立的表如果沒有指定字符集和排序規則,那麼該新建的表將採用db.opt檔案中指定的屬性。

default-character-set=utf8
default-collation=utf8_general_ci

.frm 主要是表結構的定義資訊,不論什麼儲存引擎,每一個表都會有一個以表名命名的.frm檔案。

.MYD和.MYI .MYD:MY Data,是MyISAM儲存引擎專用的,用於存放MyISAM表的資料。 .MYI:MY Index,專屬於MyISAM儲存引擎,主要存放MyISAM表的索引相關資訊。

.ibd和.ibdata 兩者都是專屬於InnoDB儲存引擎的資料庫檔案。 .ibd:採用獨享表空間時InnoDB表的資料檔案。 .ibdata:採用共享表空間時所有InnoDB表的資料均存放在.ibdata中,這個檔案裡還儲存了:變更緩衝區、雙寫緩衝區、撤銷日誌

理論上測試機應該也是可以的說,但是測試複製檔案後,MySQL會找不到複製的DB,在研究了一陣子之後發現魔鬼藏在測試機版本: MySQL 8.0.28

In 8.0, the FRM is replaced with SDI (Serialized Dictionnary Information).

所以直接複製在測試機試會抓不到DB,在下列連結有找到解法,但是肚子實在太餓了,剩下的部分就下回待續 …

[embed]Migrate MyISAM tables from MySQL 5.7 to 8.0 The MySQL Ecosystem has been using InnoDB as the default transactional engine for many years now. If you are one of the…lefred.be


메타데이터
post_id
9d34d99f3cdb
slug
魔術師日記-1-消失的db-9d34d99f3cdb
url
https://medium.com/@lalalili/%E9%AD%94%E8%A1%93%E5%B8%AB%E6%97%A5%E8%A8%98-1-%E6%B6%88%E5%A4%B1%E7%9A%84db-9d34d99f3cdb
canonical_url
https://medium.com/@lalalili/%E9%AD%94%E8%A1%93%E5%B8%AB%E6%97%A5%E8%A8%98-1-%E6%B6%88%E5%A4%B1%E7%9A%84db-9d34d99f3cdb
author_url
https://medium.com/@lalalili
status
ok
fetched_at
2026-07-27 08:10:38