この記事では、RHEL 9系・Rocky Linux 9系を想定環境として、mysqlcheck コマンドの実践的な使い方を解説します。テーブルのチェック(CHECK)・修復(REPAIR)・最適化(OPTIMIZE)・統計更新(ANALYZE)の4操作、全データベース一括実行、cron による定期メンテナンス組み込みまでカバーします。
この記事のポイント
・mysqlcheck は CHECK / REPAIR / OPTIMIZE / ANALYZE を CLI から実行するラッパー
・-A オプションで全データベースをまとめてチェック・最適化できる
・InnoDB では REPAIR 非対応、OPTIMIZE は内部で ALTER TABLE ENGINE=InnoDB が走る
・cron で低トラフィック時間帯に定期実行するのが実務の基本
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
mysqlcheck の役割と4つの操作の違い
mysqlcheck は MySQL・MariaDB に付属するコマンドラインツールです。SQL 文の CHECK TABLE・REPAIR TABLE・OPTIMIZE TABLE・ANALYZE TABLE を、コマンドラインから一括実行できるラッパーとして機能します。mysql クライアントでテーブルをひとつずつ SQL で処理するのは手間がかかりますが、mysqlcheck を使えばデータベース単位・全データベース単位でまとめて処理できます。
4つの操作の役割を整理します。
・CHECK(--check):テーブルの整合性確認。異常終了後の点検や定期チェックに使う。InnoDB・MyISAM 両対応
・REPAIR(--repair):テーブル破損の修復。MyISAM 専用。InnoDB テーブルには実行しても "note" が返るだけで修復されない
・OPTIMIZE(--optimize):断片化解消・不要スペース回収。DELETE や UPDATE を頻繁に行うテーブルに有効。InnoDB では内部的に ALTER TABLE ENGINE=InnoDB が実行される
・ANALYZE(--analyze):インデックス統計を更新する。クエリプランが想定と異なるときに実行すると改善することがある
| 操作 | 対応エンジン | 主な用途 |
|---|---|---|
| CHECK | InnoDB / MyISAM | 整合性確認・定期点検 |
| REPAIR | MyISAM のみ | テーブル破損の修復 |
| OPTIMIZE | InnoDB / MyISAM | 断片化解消・スペース回収 |
| ANALYZE | InnoDB / MyISAM | インデックス統計の更新 |
mysqlcheck の基本的な使い方
1. 接続オプションと基本構文
mysqlcheck の基本構文は次のとおりです。mysqlcheck [オプション] データベース名 [テーブル名 ...]
・-u ユーザー名:MySQL ユーザーを指定する。通常は root
・-p:パスワードを対話入力する(スクリプトから実行する場合は .my.cnf で代替)
・-h ホスト名:ホストを指定する。省略するとローカルソケット接続
実行例:
# データベース名を指定してチェック(デフォルト操作は --check) mysqlcheck -u root -p mydb # 特定テーブルだけをチェック mysqlcheck -u root -p mydb users # 複数テーブルを指定してチェック mysqlcheck -u root -p mydb users orders products
mydb.users OK mydb.orders OK mydb.products OK
2. 全データベースを一括チェックする(-A オプション)
-A(--all-databases)を付けると、サーバー上のすべてのデータベースを対象にできます。# 全データベースを一括チェック mysqlcheck -u root -p -A # 全データベースを一括最適化 mysqlcheck -u root -p -A --optimize # 全データベースのインデックス統計を一括更新 mysqlcheck -u root -p -A --analyze
操作の種類を切り替える
1. テーブルを修復する(--repair / --auto-repair)
テーブルが壊れていると判断した場合に使います。MyISAM テーブル専用です。# 特定のデータベースを修復する mysqlcheck -u root -p --repair mydb # チェックして問題があれば自動で修復する mysqlcheck -u root -p --auto-repair mydb
重要:InnoDB テーブルに --repair を実行しても修復は行われません。出力に "note: The storage engine for the table doesn't support repair" と表示されますが、これはエラーではなく仕様どおりの動作です。InnoDB テーブルの破損には、バックアップからの復元か、mysqldump によるダンプ&インポートで対処します。
2. テーブルを最適化する(--optimize)
DELETE や UPDATE を多数実行した後にテーブルに生じる断片化を解消します。# 特定のデータベースのすべてのテーブルを最適化 mysqlcheck -u root -p --optimize mydb # 特定テーブルだけを最適化 mysqlcheck -u root -p --optimize mydb users
mydb.users OK mydb.orders note : Table does not support optimize, doing recreate + analyze instead status : OK
3. インデックス統計を更新する(--analyze)
クエリの実行計画(プラン)がおかしいと感じたとき、まず試みるのがインデックス統計の更新です。# 特定のデータベースの統計を更新 mysqlcheck -u root -p --analyze mydb # 全データベースの統計を更新 mysqlcheck -u root -p -A --analyze
Linuxサーバー上の MySQL・MariaDB 運用をより体系的に学びたい方は、Linux Master Pro Seminar も参考にしてみてください。
cron による定期メンテナンスの組み込み
定期的な OPTIMIZE や ANALYZE はサービスへの影響を最小限にするため、低トラフィック時間帯に cron で自動実行するのが基本です。cron からパスワードを直接記述せず、.my.cnf に認証情報をまとめるのが安全な方法です。
# /root/.my.cnf を作成して認証情報を格納する # root のみ読み書き可能にする chmod 600 /root/.my.cnf
[client] user=root password=ここに実際のパスワードを書く
#!/bin/bash # /usr/local/bin/mysql_maintenance.sh LOG="/var/log/mysql_maintenance.log" DATE=$(date "+%Y-%m-%d %H:%M:%S") echo "[${DATE}] メンテナンス開始" >> "${LOG}" # 全データベースのインデックス統計を更新 mysqlcheck -u root -A --analyze >> "${LOG}" 2>&1 # 全データベースを最適化(OPTIMIZE TABLE 相当) mysqlcheck -u root -A --optimize >> "${LOG}" 2>&1 echo "[$(date "+%Y-%m-%d %H:%M:%S")] メンテナンス完了" >> "${LOG}"
chmod 750 /usr/local/bin/mysql_maintenance.sh # 動作確認(スクリプトを直接実行する) /usr/local/bin/mysql_maintenance.sh # ログを確認する tail -20 /var/log/mysql_maintenance.log
# root の crontab を編集する crontab -e # 毎週日曜日の午前3時に実行する例 0 3 * * 0 /usr/local/bin/mysql_maintenance.sh
よくあるメッセージとトラブルシュート
「The storage engine for the table doesn't support repair」InnoDB テーブルに --repair を実行したときに返される note です。エラーではなく、InnoDB がこの操作に対応していないことを示しています。破損が疑われる場合はバックアップからの復元で対処します。
「warning: 1 client is using or hasn't closed the table properly」
別のプロセスがテーブルを開いたままになっている警告です。MyISAM テーブルで異常終了後によく出ます。--auto-repair オプションを付けて再実行すると修復を試みます。
mysqlcheck -u root -p --auto-repair mydb
認証エラーです。-p オプションを付けてパスワードを入力するか、/root/.my.cnf に認証情報を記述します。
「error: 1 when fixing table」
REPAIR に失敗した場合のエラーです。MyISAM の場合、テーブルの破損が深刻で mysqlcheck では修復できない状態です。myisamchk コマンドでより詳細な修復を試みるか、バックアップからの復元を検討します。
# myisamchk でより詳細な修復を試みる(MySQL サービスを停止してから実行) systemctl stop mysqld myisamchk --safe-recover /var/lib/mysql/mydb/テーブル名.MYI systemctl start mysqld
まとめ
mysqlcheck の主なコマンドをまとめます。| やりたいこと | コマンド |
|---|---|
| DB のテーブルをチェック | mysqlcheck -u root -p mydb |
| 特定テーブルをチェック | mysqlcheck -u root -p mydb users |
| 全 DB をまとめてチェック | mysqlcheck -u root -p -A |
| チェックして破損があれば修復 | mysqlcheck -u root -p --auto-repair mydb |
| テーブルを最適化(断片化解消) | mysqlcheck -u root -p --optimize mydb |
| 全 DB のインデックス統計を更新 | mysqlcheck -u root -p -A --analyze |
| 全 DB をまとめて最適化 | mysqlcheck -u root -p -A --optimize |
| 全 DB を修復 | mysqlcheck -u root -p -A --repair |
>> Linux Master Pro Seminar の詳細はこちら
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:mysqladminコマンドでMySQLを管理する方法|ステータス確認・フラッシュ・シャットダウンの実務手順
- この記事の属するカテゴリ:データーベース管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます