首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 資料目錄架構深度解析

     編輯:MySQL 資料庫相關知識

資料目錄的樹狀結構

MySQL 將所有資料庫與表組織在單一資料目錄(datadir)下,直接對應檔案系統層級:

  • 每個資料庫 ➜ 一個子目錄(名稱同資料庫名)。
  • 每張表 ➜ 資料庫目錄下的三個檔案:.frm(結構定義)、.MYD(資料)、.MYI(索引,MyISAM)或 .ibd(InnoDB 獨立表空間)。
  • 狀態檔(PID、錯誤日誌、一般查詢日誌、更新日誌)也置於資料目錄頂層。

伺服器為唯一存取入口

所有客戶端必須透過 mysqld 進程存取資料,不可直接操作檔案。優點:

  • 避免多進程同時寫入導致資料損毀。
  • 多執行緒架構支援高併發連線,更新操作序列化保證一致性。

例外情況(需謹慎):

  1. 同一資料目錄啟動多個 mysqld —— 需檔案鎖定支援,否則日誌混亂、資料損毀。
  2. 執行 myisamchk/isamchk 維護表時,必須確保伺服器未開啟該表(或停止伺服器),否則索引損毀。

資料庫與表的檔案系表示法

資料庫

  • CREATE DATABASE db_name ➜ mkdir DATADIR/db_name; chmod 700 DATADIR/db_name(僅擁有者可存取)。
  • DROP DATABASE db_name ➜ 刪除目錄與所有表檔(保留非表檔與目錄本身)。
  • SHOW DATABASES ➜ 列出資料目錄下的子目錄名,無需主表。

表

  • CREATE TABLE 產生 tbl.frm、tbl.MYD、tbl.MYI(MyISAM),擁有者為 mysqld 使用者,權限 600。
  • ALTER TABLE 重寫 .frm 並調整資料/索引檔。
  • DROP TABLE 刪除三個檔案。
  • SHOW TABLES 列出 .frm 基名。

作業系統對命名的限制

效能含義:檔案描述符與開啟速度

  • 每張開啟的表佔用多個檔案描述符(.frm、.MYD、.MYI),高併發或複雜聯結易耗盡預設限制(常見 1024/進程)。需調整 open_files_limit 或 OS ulimit -n。
  • 資料庫目錄檔案過多(如 1 萬表 = 3 萬檔)會導致 open() 系統呼叫變慢(目錄查找效率下降)。對策:合併同結構表(加 user_id 欄位),權衡磁碟空間與開啟速度;或考慮分庫分表。
  • 表大小上限受限於 MySQL 內部限制(3.23 前 4GB,3.23+ 約 9 百萬 TB)與 OS 檔案大小限制(如 AIX 4.1 2GB、4.2 64GB),取較小者。

狀態檔詳解與安全

限制類型說明
合法字元MySQL 允許英數字、_、$,但 OS 檔案系統可能禁止 $ 或其他字元,Shell 引用時需跳脫(\$db 或 '$db')。
長度上限MySQL 64 字元,但受限於 OS 檔名長度(舊 System V 僅 14 字元,表名實際 10 字元 + 擴展名)。
大小寫敏感度UNIX 區分大小寫(my_tbl ≠ MY_TBL),Windows 不區分。跨平台遷移時需注意。
檔案類型預設名稱內容啟用方式
PID 檔HOSTNAME.pid伺服器進程 ID啟動自動建立,關閉自動刪除
錯誤日誌HOSTNAME.err啟動/關閉事件、錯誤、stderr 輸出透過 mysqld_safe 啟動才會產生
一般查詢日誌HOSTNAME.log連線/斷線、所有查詢文字--log
更新日誌HOSTNAME.nnn修改資料/結構的查詢(可重放復原)--log-update

安全警示:日誌含明文密碼(如 GRANT ... IDENTIFIED BY 'pwd'),資料目錄權限必須 chmod 700 DATADIR,且確保 mysqld 以該擁有者身分執行。日誌檔名含點號(.),資料庫目錄名無點號,ls -l 首字元 -(檔案)vs d(目錄)易於區分。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved