Mysql

是否有正確的順序來執行 mysqlcheck 命令以進行定期維護?

  • February 14, 2022

執行各種mysqlcheck命令是否有正確的順序?

例如CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE和也FLUSH TABLES and FLUSH LOGS

我編寫了這個腳本,我計劃通過 cron 定期執行,只是想確保我沒有誤解文件並以正確的順序執行它們(如果有的話)。

echo -n 'Checking MySQL tables...'
OUTPUT=$(mysqlcheck --defaults-file=/etc/mysql/sys.cnf --all-databases --check 2>&1)
if [ $? -eq 0 ]; then
   echo ' SUCCESS.'
else
   echo ' FAIL!'
fi

echo -n 'Analyzing MySQL tables...'
mysqlcheck --defaults-file=/etc/mysql/sys.cnf --all-databases --analyze >/dev/null 2>&1
if [ $? -eq 0 ]; then
   echo ' SUCCESS.'
else
   echo ' FAIL!'
fi

echo -n 'Optimizing MySQL tables...'
mysqlcheck --defaults-file=/etc/mysql/sys.cnf --all-databases --optimize >/dev/null 2>&1
if [ $? -eq 0 ]; then
   echo ' SUCCESS.'
else
   echo ' FAIL!'
fi

echo -n 'Flushing MySQL tables...'
mysqladmin --defaults-file=/etc/mysql/sys.cnf refresh >/dev/null 2>&1
if [ $? -eq 0 ]; then
   echo ' SUCCESS.'
   echo 'Flushing MySQL logs... SUCCESS.'
else
   echo ' FAIL!'
   echo 'Flushing MySQL logs... FAIL!'
fi

if [ -z "$OUTPUT" ]; then
   :
else
   echo 'Raw mysqlcheck results...'
   echo "${OUTPUT}"
   echo ' ...DONE.'
fi

編輯

我更新了腳本,刪除了REPAIR TABLE部分,因為我認為這種類型的東西應該​​手動完成。

除非您使用 MyISAM 表,否則檢查、修復和刷新表無關緊要。我從不使用 MyISAM 表。我從來不mysqlcheck直接跑。

FLUSH LOGS沒有必要。它對桌子沒有任何幫助。

OPTIMIZE TABLE預設儲存引擎 InnoDB 通常不需要。InnoDB 將自動重用空範圍。最終,InnoDB 表空間可能會變得碎片化,但這並不一定會產生任何負面影響,除了佔用額外的空間。OPTIMIZE TABLE以碎片整理的方式重建表空間,所以偶爾我會執行它,但不是按計劃執行。根據需要執行此操作,通常是在批量數據導入或批量刪除之後。

ANALYZE TABLE值得定期執行。我設置了一個預定的作業,每張桌子大約每 10 天執行一次。實際上,我計劃的工作每天都會執行並隨機選擇 10% 的表進行分析。ANALYZE TABLE這可能過於復雜,因為每天在每張桌子上跑步並沒有什麼壞處。

引用自:https://dba.stackexchange.com/questions/307426