MyISAM 表只讀、歸檔、日志類場景,**myisampack 可壓縮 40%-70% 空間**,但壓縮後表**只讀**,需配合 myisamchk 重建索引方可使用。本文提供生產級批量壓縮腳本。
myisampack table.MYI:壓縮 .MYD 數據文件,生成只讀表myisamchk -r -o -f --sort-index --analyze table.MYI:重建索引、更新統計,標記表可用#!/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 | 更新索引統計信息 |
FLUSH TABLES WITH READ LOCK、或設置庫 READ ONLYtaskset -c 0,1SHOW TABLE STATUS LIKE 'tbl_name'\G -- 關注:Data_length(壓縮後)、Index_length、Row_format: Compressed
**MyISAM 只讀表壓縮 = 空間換時間**。批量腳本 + 前置鎖定 + 空間預留 + 低峰執行,是安全壓縮的鐵律。壓縮後表**不可寫入**,若需修改須解壓(myisamchk -u)→ 修改 → 重新壓縮,成本極高,**務必確認業務真只讀**再動刀。