MySQLの停止は、他の人の観点から、MySQLサービスにアクセスできないか応答しないことを意味します。停止は、考えられる多くの原因によって発生する可能性があります。
- ネットワークの問題-接続の問題、スイッチ、ルーティング、リゾルバー、ロードバランサー層。
- 設定ミス-権限または所有権が間違っている、変数が不明、パスワードが間違っている、権限が変更された。
- ロック-グローバルロックまたはテーブルロックは、他のユーザーがデータにアクセスできないようにします。
このブログ投稿では、MySQLが停止した場合(Linux環境)に実行するいくつかの手順を説明します。
ステップ1:エラーコードを取得する
停止した場合、アプリケーションはいくつかのエラーと例外をスローします。これらのエラーには通常、エラーコードが付属しています。これにより、直面している問題と、問題のトラブルシューティングと停止の回復のために次に何をすべきかについての大まかなアイデアが得られます。
エラーの詳細については、MySQLエラーコードページまたはMariaDBエラーコードページをそれぞれ確認して、エラーの意味を理解してください。
ステップ2:MySQLサーバーは実行されていますか?
ターミナル経由でサーバーにログインし、MySQLデーモンが実行されて正しいポートをリッスンしているかどうかを確認します。 Linuxでは、次のようにします。
まず、MySQLプロセスを確認します。
$ ps -ef | grep -i mysql
$ systemctl start mysql # systemd
$ service mysql start # sysvinit/upstart
$ mysqld_safe # manual
上記の手順でエラーが発生した場合は、MySQLエラーログを確認する必要があります。このログは、オペレーティングシステムとMySQL構成ファイルのlog_errorのMySQL変数構成によって異なります。 RedHatベースのサーバーの場合、ファイルは通常次の場所にあります:
$ cat /var/log/mysqld.log
MySQLが実行されている場合は、正しいポートをリッスンしているかどうかを確認してください:
$ netstat -tulpn | grep -i mysql
tcp6 0 0 :::3306 :::* LISTEN 1089/mysqld
ステップ3:接続の問題を確認する
MySQLサーバーがMySQLエラーログ内でエラーなしで正常に実行されている場合、接続の問題が発生している可能性はかなり高くなります。まず、ping(ICMPが有効になっている場合)およびアプリケーションサーバーからMySQLサーバーへのtelnetを介してホストへの接続を確認します。
(application-server)$ ping db1.mydomain.com
(application-server)$ telnet db1.mydomain.com 3306
Trying db1.mydomain.com...
Connected to 192.168.0.16.
Escape character is '^]'.
O
5.6.46-86.2sN&nz9NZ�32?&>H,EV`_;mysql_native_password
MySQLポートに接続できる場合は、telnet出力にいくつかの行が表示されるはずです。ここで、アプリケーションサーバーからMySQLクライアントを使用してもう一度試してください:
(application-server)$ mysql -u db_user -p -h db1.mydomain.com -P3306
ERROR 1045 (28000): Access denied for user 'db_user'@'db1.mydomain.com' (using password: YES)
上記の例では、エラーにより、次に何をすべきかについての情報が少し得られます。上記は、誰かが「db_user」のパスワードを変更したか、このユーザーのパスワードの有効期限が切れているためと考えられます。これは、MySQL5.7のかなり正常な動作です。 4以降では、自動パスワード有効期限ポリシーがデフォルトで360日のしきい値で有効になっています。つまり、すべてのパスワードが1年に1回有効期限が切れます。
ステップ4:MySQLプロセスリストを確認する
MySQLが接続の問題なしに正常に実行されている場合は、MySQLプロセスリストをチェックして、現在実行されているプロセスを確認してください。
mysql> SHOW FULL PROCESSLIST;
+-----+------+-----------+------+---------+------+-------+-----------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+-----+------+-----------+------+---------+------+-------+-----------------------+-----------+---------------+
| 117 | root | localhost | NULL | Query | 0 | init | SHOW FULL PROCESSLIST | 0 | 0 |
+-----+------+-----------+------+---------+------+-------+-----------------------+-----------+---------------+
1 row in set (0.01 sec)
一部の長時間実行トランザクションは他のトランザクションを停止させる可能性があり、最終的には同じリソースへのアクセスを待機している他のトランザクションにタイムアウトが発生します。攻撃的なトランザクションを強制終了して他のユーザーが同じ行にアクセスできるようにするか、長いトランザクションが終了した後にエンキュートランザクションを再試行することができます。
MySQLの停止のリスクを最小限に抑えるには、プロアクティブな監視が非常に重要です。データベースがClusterControlによって管理されている場合、上記のすべての側面は、ユーザーによる追加の構成なしで自動的に監視されます。長時間実行されるクエリ、サーバーの設定ミス、リソースがしきい値を超えているなどの異常検出については、受信トレイでアラームを受信する必要があります。さらに、ClusterControlは、ホストまたはネットワークに問題が発生した場合に、データベースサービスの回復を自動的に試行します。
ホワイトペーパーを読むことで、MySQLとMariaDBのディザスタリカバリについて詳しく知ることもできます。