mysqlcheckコマンドでMySQLのテーブルをチェック・修復・最適化する方法|定期メンテナンスの実践手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > mysqlcheckコマンドでMySQLのテーブルをチェック・修復・最適化する方法|定期メンテナンスの実践手順
「テーブルが壊れているかもしれないが、確認コマンドが分からない」「バックアップ前に整合性チェックをしたいが、SQL でひとつずつ実行するのが面倒だ」。MySQL・MariaDB の運用でよく聞くつまずきです。

この記事では、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 で低トラフィック時間帯に定期実行するのが実務の基本


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

"OK" が返れば整合性に問題はありません。問題がある場合は "warning" や "error" が表示されます。

2. 全データベースを一括チェックする(-A オプション)

-A(--all-databases)を付けると、サーバー上のすべてのデータベースを対象にできます。

# 全データベースを一括チェック mysqlcheck -u root -p -A # 全データベースを一括最適化 mysqlcheck -u root -p -A --optimize # 全データベースのインデックス統計を一括更新 mysqlcheck -u root -p -A --analyze

定期メンテナンスのバッチ処理として使う場合は、後述の .my.cnf を使った認証情報の管理と組み合わせて cron から呼び出します。

操作の種類を切り替える

1. テーブルを修復する(--repair / --auto-repair)

テーブルが壊れていると判断した場合に使います。MyISAM テーブル専用です。

# 特定のデータベースを修復する mysqlcheck -u root -p --repair mydb # チェックして問題があれば自動で修復する mysqlcheck -u root -p --auto-repair mydb

--auto-repair は CHECK の結果に基づいて REPAIR を自動実行するため、「チェックと修復を同時にやりたい」という場面でよく使われます。

重要: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

InnoDB テーブルで "Table does not support optimize, doing recreate + analyze instead" という note が表示されるのは正常です。内部で ALTER TABLE ... ENGINE=InnoDB が実行され、テーブルの再構築と統計更新が行われています。

3. インデックス統計を更新する(--analyze)

クエリの実行計画(プラン)がおかしいと感じたとき、まず試みるのがインデックス統計の更新です。

# 特定のデータベースの統計を更新 mysqlcheck -u root -p --analyze mydb # 全データベースの統計を更新 mysqlcheck -u root -p -A --analyze

MySQL 8.x・MariaDB では innodb_stats_auto_recalc が有効な場合、大量の行変更後に自動で統計が再計算されます。それでもプランが改善しないときに mysqlcheck --analyze を手動で実行します。

Linuxサーバー上の MySQL・MariaDB 運用をより体系的に学びたい方は、Linux Master Pro Seminar も参考にしてみてください。

cron による定期メンテナンスの組み込み

定期的な OPTIMIZE や ANALYZE はサービスへの影響を最小限にするため、低トラフィック時間帯に cron で自動実行するのが基本です。

cron からパスワードを直接記述せず、.my.cnf に認証情報をまとめるのが安全な方法です。

# /root/.my.cnf を作成して認証情報を格納する # root のみ読み書き可能にする chmod 600 /root/.my.cnf

/root/.my.cnf の内容(パスワードはご自身の環境の値を設定してください):

[client] user=root password=ここに実際のパスワードを書く

.my.cnf を設定すれば、mysqlcheck 実行時に -p なしでも認証が通ります。次にバックアップスクリプトを作成します。

#!/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

問題なければ cron に登録します。

# root の crontab を編集する crontab -e # 毎週日曜日の午前3時に実行する例 0 3 * * 0 /usr/local/bin/mysql_maintenance.sh

OPTIMIZE TABLE は InnoDB では内部的にテーブルを再構築するため、大きなテーブルではその間 I/O が増大します。本番環境では曜日と時間帯をトラフィックの実測値に合わせて設定してください。

よくあるメッセージとトラブルシュート

「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

「mysqlcheck: Got error: 1045: Access denied for user 'root'@'localhost'」

認証エラーです。-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
日常運用では、週次の cron で全データベースに対して --optimize と --analyze を自動実行しておくと、断片化の蓄積やクエリプランの乱れを未然に防げます。ただし OPTIMIZE TABLE は実行中に I/O 負荷が高まるため、本番環境への影響を事前にステージング環境で確認してから組み込むことをお勧めします。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
>> Linux Master Pro Seminar の詳細はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。