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

MySQL MyISAM 表批量壓縮實戰:myisampack + myisamchk 一鍵腳本

     編輯:MySQL 資料庫相關知識

前言

MyISAM 表只讀、歸檔、日志類場景,**myisampack 可壓縮 40%-70% 空間**,但壓縮後表**只讀**,需配合 myisamchk 重建索引方可使用。本文提供生產級批量壓縮腳本。

操作原理

  1. myisampack table.MYI:壓縮 .MYD 數據文件,生成只讀表
  2. myisamchk -r -o -f --sort-index --analyze table.MYI:重建索引、更新統計,標記表可用

批量壓縮腳本(批量_compress_myisam.sh)

#!/bin/bash
# 用法:sh 批量_compress_myisam.sh /data/mysql/my_dbname/
# 注意:壓縮期間**必須確保無寫入**(停服務/鎖表/只讀庫)

DATA_DIR=$1
if [[ ! -d "$DATA_DIR" ]]; then
  echo "Usage: $0 "
  exit 1
fi

FILELIST=$(ls "$DATA_DIR")
echo "=== MYISAMPACK BEGIN ==="

for FILE in $FILELIST; do
  # 只處理 .MYI 索引文件
  if [[ "$FILE" == *.MYI ]]; then
    echo "Packing: $FILE"
    /usr/bin/myisampack "$DATA_DIR$FILE"
    if [[ $? -ne 0 ]]; then
      echo "ERROR: myisampack failed on $FILE"
      exit 1
    fi
  fi
done

echo "=== MYISAMPACK END. MYISAMCHK BEGIN ==="

for FILE in $FILELIST; do
  if [[ "$FILE" == *.MYI ]]; then
    echo "Checking & Rebuilding: $FILE"
    /usr/bin/myisamchk -r -o -f --sort-index --analyze "$DATA_DIR$FILE"
    if [[ $? -ne 0 ]]; then
      echo "ERROR: myisamchk failed on $FILE"
      exit 1
    fi
  fi
done

echo "=== MYISAMCHK END. ALL DONE ==="

關鍵參數解析

工具參數含義
myisampack(無額外參數)默認最佳壓縮比,生成只讀表
-b備份原文件為 .OLD(建議加上)
myisamchk-r恢復模式(重建索引)
-o優化索引樹(壓縮後必需)
-f強制覆蓋臨時文件
--sort-index排序索引塊,提升範圍查詢
--analyze更新索引統計信息

⚠️ 必須遵守的前置條件

  1. 業務停寫: 停止應用寫入、或 FLUSH TABLES WITH READ LOCK、或設置庫 READ ONLY
  2. 空間預留: 壓縮過程需臨時文件空間,**剩餘磁碟 > 表大小 1.5 倍**
  3. CPU 佔用高: 安排在業務低峰、或限制 CPU 親和性 taskset -c 0,1
  4. 大表分批: 單表 > 50GB 建議分多次、多窗口操作

驗證壓縮效果

SHOW TABLE STATUS LIKE 'tbl_name'\G
-- 關注:Data_length(壓縮後)、Index_length、Row_format: Compressed

總結

**MyISAM 只讀表壓縮 = 空間換時間**。批量腳本 + 前置鎖定 + 空間預留 + 低峰執行,是安全壓縮的鐵律。壓縮後表**不可寫入**,若需修改須解壓(myisamchk -u)→ 修改 → 重新壓縮,成本極高,**務必確認業務真只讀**再動刀。

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