sql >> データベース >  >> RDS >> MariaDB

MySQLが停止した場合の手順

    MySQLの停止は、他の人の観点から、MySQLサービスにアクセスできないか応答しないことを意味します。停止は、考えられる多くの原因によって発生する可能性があります。

    • ネットワークの問題-接続の問題、スイッチ、ルーティング、リゾルバー、ロードバランサー層。
    • リソースの問題-リソースの制限またはボトルネックに達しているかどうか。
    • 設定ミス-権限または所有権が間違っている、変数が不明、パスワードが間違っている、権限が変更された。
    • ロック-グローバルロックまたはテーブルロックは、他のユーザーがデータにアクセスできないようにします。

    このブログ投稿では、MySQLが停止した場合(Linux環境)に実行するいくつかの手順を説明します。

    ステップ1:エラーコードを取得する

    停止した場合、アプリケーションはいくつかのエラーと例外をスローします。これらのエラーには通常、エラーコードが付属しています。これにより、直面している問題と、問題のトラブルシューティングと停止の回復のために次に何をすべきかについての大まかなアイデアが得られます。

    エラーの詳細については、MySQLエラーコードページまたはMariaDBエラーコードページをそれぞれ確認して、エラーの意味を理解してください。

    ステップ2:MySQLサーバーは実行されていますか?

    ターミナル経由でサーバーにログインし、MySQLデーモンが実行されて正しいポートをリッスンしているかどうかを確認します。 Linuxでは、次のようにします。

    まず、MySQLプロセスを確認します。

    $ ps -ef | grep -i mysql
    お返しに何かを受け取る必要があります。それ以外の場合、MySQLは実行されていません。 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
    プロセス名"mysqld"を取得し、ポート3306のすべてのインターフェイス(:::3306または0.0.0.0:3306)でPID 1089をリッスンし、状態は"LISTEN"です。上記の行が127.0.0.1:3306を示している場合、MySQLはローカルでのみリッスンしています。すべてのIPアドレスをリッスンするには、MySQL構成ファイルのbind_address値を変更するか、単にその行にコメントする必要がある場合があります。

    ステップ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操作は、データベースを停止させて応答しなくなるほど破壊的である可能性があります。次のSQLステートメントが実行されている場合、他のユーザーがデータベースまたはテーブルにアクセスするのをブロックする可能性があります(これにより、アプリケーションの観点からMySQLサービスが短時間停止する可能性があります):

      読み取りロック付きのフラッシュテーブル ロックテーブル... 代替テーブル...

    一部の長時間実行トランザクションは他のトランザクションを停止させる可能性があり、最終的には同じリソースへのアクセスを待機している他のトランザクションにタイムアウトが発生します。攻撃的なトランザクションを強制終了して他のユーザーが同じ行にアクセスできるようにするか、長いトランザクションが終了した後にエンキュートランザクションを再試行することができます。

    結論

    MySQLの停止のリスクを最小限に抑えるには、プロアクティブな監視が非常に重要です。データベースがClusterControlによって管理されている場合、上記のすべての側面は、ユーザーによる追加の構成なしで自動的に監視されます。長時間実行されるクエリ、サーバーの設定ミス、リソースがしきい値を超えているなどの異常検出については、受信トレイでアラームを受信する必要があります。さらに、ClusterControlは、ホストまたはネットワークに問題が発生した場合に、データベースサービスの回復を自動的に試行します。

    ホワイトペーパーを読むことで、MySQLとMariaDBのディザスタリカバリについて詳しく知ることもできます。


    1. ActiveRecordクエリの時間ベースの優先度

    2. トランザクション内でのGOの使用

    3. SQL Server 2005で大文字と小文字を区別するように変更するにはどうすればよいですか?

    4. PostgreSQLクエリはインデックススキャンでより高速に実行されますが、エンジンはハッシュ結合を選択します