首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL MyISAM 表批量壓縮實戰:myisampack + myisamchk 流程詳解

     編輯:MySQL 綜合教學

MySQL MyISAM 表批量壓縮實戰

針對唯讀/歸檔類 MyISAM 表,使用 myisampack 壓縮數據文件,配合 myisamchk 重建索引,大幅減少存儲佔用(典型壓縮比 40%-60%)。

前置條件與風險

  • 僅支援 MyISAM,InnoDB 不適用。
  • 壓縮後表為唯讀**,不可寫入(INSERT/UPDATE/DELETE 失敗)。
  • 操作期間**必須停止寫入**(停服務或 FLUSH TABLES WITH READ LOCK),否則數據損壞。
  • 壓縮過程高 CPU、高 IO,建議維護窗口、分批執行。

工具鏈

  1. myisampack:壓縮 .MYD 數據文件,生成 .MYD.packed 並重命名。
  2. myisamchk -r -o -f --sort-index --analyze:重建索引(.MYI),更新統計信息,使壓縮表可用。

官方文檔:Client-Side Scripts

批量壓縮 Shell 腳本

#!/bin/bash
data_dir="/data/mysql/my_dbname/"
filelist=$(ls $data_dir)

echo "MYISAMPACK BEGIN."
for filename in $filelist; do
    idx=$(expr match "$filename" ".*.MYI")
    if [[ $idx -gt 0 ]]; then
        /usr/bin/myisampack $data_dir$filename
    fi
done

echo "MYISAMPACK End. MYISAMCHK BEGIN."
for filename in $filelist; do
    idx=$(expr match "$filename" ".*.MYI")
    if [[ $idx -gt 0 ]]; then
        /usr/bin/myisamchk -r -o -f --sort-index --analyze $data_dir$filename
    fi
done

echo "MYISAMCHK END."

腳本邏輯解析

  • 遍歷數據目錄,匹配 *.MYI 文件(每張表對應一個索引文件)。
  • 先壓縮所有表,再統一重建索引,避免交替操作產生臨時文件衝突。
  • 大庫建議分多次執行(按表名前綴/大小分組),單次運行時間可控。

驗證壓縮效果

myisamchk --unpack /data/mysql/my_dbname/tbl_name.MYI

生產建議

  1. 僅對**確定不再寫入**的歷史日誌、報表、歸檔表壓縮。
  2. 壓縮前**全量備份**,壓縮後**驗證查詢正確性**。
  3. 監控磁盤空間,壓縮臨時文件需額外 1.2-1.5 倍原表空間。
  4. InnoDB 表壓縮請使用 ROW_FORMAT=COMPRESSED + KEY_BLOCK_SIZE(透明壓縮,支援讀寫)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved