15.

MySQL「Host is blocked because of many connection errors」の解除と恒久対策

編集
この記事の要点
  • 原因: 同一ホストからの接続失敗が max_connect_errors(既定 100)回を超えてブロックされた
  • 即時解除: mysqladmin -u root -p flush-hosts または SQL で FLUSH HOSTS;(MySQL 8.0.23+ は TRUNCATE TABLE performance_schema.host_cache;
  • 恒久対策: SET GLOBAL max_connect_errors=10000、my.cnf に max_connect_errors=10000
  • 根本原因はアプリ側のリトライ暴走、DNS 逆引きタイムアウト、認証情報ミス
  • DNS 逆引きを無効化: skip-name-resolve を my.cnf に。ユーザー権限は IP で再定義

エラー内容

ERROR 1129 (HY000): Host '192.168.1.10' is blocked because of many
connection errors; unblock with 'mysqladmin flush-hosts'

MySQL は同一クライアントホストからの接続失敗(プロトコルエラー、ハンドシェイクタイムアウト、認証失敗)が max_connect_errors 回続くと、そのホストをホストキャッシュ上でブロックします。以降そのホストからは認証画面に到達する前に 1129 エラーで弾かれます。

即時解除

方法 A: mysqladmin から

# 別のホスト(許可済み)または localhost から
mysqladmin -u root -p flush-hosts

方法 B: SQL で

-- MySQL 5.7
FLUSH HOSTS;

-- MySQL 8.0.23 以降は FLUSH HOSTS が非推奨
TRUNCATE TABLE performance_schema.host_cache;

-- どちらも RELOAD(FLUSH HOSTS)または SYSTEM_VARIABLES_ADMIN 権限が必要

ホストキャッシュを確認する

MySQL 5.7+ は performance_schema.host_cache でブロック理由を SQL で確認できます:

SELECT IP, HOST, HOST_VALIDATED, COUNT_HANDSHAKE_ERRORS,
       COUNT_AUTHENTICATION_ERRORS, COUNT_LOCAL_ERRORS,
       SUM_CONNECT_ERRORS
FROM performance_schema.host_cache;

-- COUNT_HANDSHAKE_ERRORS:   プロトコル不一致(古いクライアント等)
-- COUNT_AUTHENTICATION_ERRORS: 認証失敗
-- COUNT_LOCAL_ERRORS:        サーバ内部エラー
-- SUM_CONNECT_ERRORS:        max_connect_errors と比較されるカウンタ

max_connect_errors を上げる

既定値の 100 はリトライ多めの本番アプリでは小さすぎます:

-- 現在値確認
SHOW VARIABLES LIKE 'max_connect_errors';

-- 動的変更(再起動まで有効)
SET GLOBAL max_connect_errors = 10000;

恒久化するなら my.cnf に追記:

# /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
max_connect_errors = 10000

# DNS 逆引きを完全に無効化(後述)
skip-name-resolve

# ハンドシェイクのタイムアウト緩和
connect_timeout = 10

根本原因の調査

典型原因確認対処
アプリのリトライ暴走アプリログで再接続ループ指数バックオフ実装、接続プール使用
DNS 逆引きタイムアウトhost_cacheCOUNT_HOST_BLOCKED_ERRORSskip-name-resolve
FW / SG でタイムアウトTCP 接続自体が timeoutセキュリティグループ・iptables 確認
ロードバランサのヘルスチェック定期的に接続失敗ヘルスチェックを TCP のみ or 専用ユーザー
クライアントが古すぎるHANDSHAKE_ERRORS 多いクライアントライブラリ更新

DNS 逆引きを無効化(skip-name-resolve)

MySQL は接続元 IP を逆引きしてホスト名を取得しようとします。逆引きが遅い / 失敗するとハンドシェイクタイムアウトでカウントされます。

# my.cnf
[mysqld]
skip-name-resolve

注意: skip-name-resolve を有効化すると、'user'@'hostname' 形式の権限は機能しなくなります。IP で再定義が必要:

-- 旧(ホスト名)
DROP USER 'app'@'app-server.example.com';

-- 新(IP / ワイルドカード)
CREATE USER 'app'@'10.0.1.%' IDENTIFIED BY 'secret';
GRANT ALL ON myapp.* TO 'app'@'10.0.1.%';
FLUSH PRIVILEGES;

クラウド DB(RDS / Aurora)でブロックされた場合

マネージド DB は root に直接 SSH できないため、別経路で SQL を流す:

  1. 同 VPC 内の許可済みインスタンスから接続できれば FLUSH HOSTS; を実行
  2. RDS パラメータグループで max_connect_errors を大きく
  3. どうしても接続できない場合はインスタンスの再起動(host_cache は揮発)

アプリ側の予防策

関連する設定変数

変数既定値役割
max_connect_errors100ブロック閾値
connect_timeout10ハンドシェイク待ち秒
max_connections151同時接続上限
host_cache_sizeautoホストキャッシュ容量
skip_name_resolveOFFDNS 逆引き無効化

FAQ

Q: 自分の IP がブロックされたら自分自身では解除できない?
A: そのとおりです。localhost や別ホストから FLUSH HOSTS を実行する必要があります。サーバへの SSH があれば mysql -u root -p でローカル接続して実行。

Q: 再起動でブロックは消える?
A: ホストキャッシュは揮発なので消えます。ただし根本原因(リトライ暴走など)を直さないとすぐ再発します。

Q: max_connect_errors を 0 にしたら無制限?
A: 動作の正確性のため非常に大きい値(例: 4294967295)を設定してください。0 は意味が異なります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 1071 Specified key was too long; max key length is 767 bytes
  2. ERROR 1063 (42000): Incorrect column specifier for column '~'
  3. mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
  4. Install/Remove of the Service Denied!
  5. Datetime 型が NULL に見える
  6. Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  7. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  8. Exception: Wrong MySQL configuration
  9. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
  10. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
  11. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  12. Incorrect column specifier for column 'カラム名'
  13. BLOB/TEXT column 'description' used in key specification without a key length
  14. ERROR: /bin/sh: mysql_config: コマンドが見つかりません
  15. Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
  16. CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
  17. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
  18. 1
  19. 1
  20. 1)
  21. 1
  22. 1
  23. 1
  24. 1
  25. 1
  26. 1
  27. 1
  28. 1
  29. 1
  30. 1
  31. 1
  32. 1
  33. 1"'`--
  34. 1
  35. 1
  36. 1
  37. 1
  38. 1
  39. 1
  40. 1
  41. 1
  42. 1
  43. 1)
  44. 1
  45. 1
  46. 1
  47. 1
  48. 1
  49. 1
  50. 1
  51. 1
  52. 1
  53. 1"'`--
  54. 1
  55. 1
  56. SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~