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

MySQLで一般的なエラーをトラブルシューティングするための便利なヒント

    MySQL 広く使用されているオープンソースのリレーショナルデータベース管理システム( RDMS Oracleが所有 。これは、長年にわたってWebベースのアプリケーションのデフォルトの選択肢であり、他のデータベースエンジンと比較して依然として人気があります。

    MySQL Webアプリケーション用に設計および最適化されており、 Facebookなどの主要なWebベースのアプリケーションの不可欠な部分を形成しています。 、 Twitter ウィキペディア YouTube 、および他の多く。

    あなたのサイトまたはウェブアプリケーションはMySQLを利用していますか ?この詳細な記事では、 MySQLの問題と一般的なエラーのトラブルシューティング方法を説明します データベースサーバー。問題の原因を特定する方法と、問題を解決するために何をすべきかについて説明します。

    1。ローカルMySQLサーバーに接続できません

    MySQLの一般的なクライアント/サーバー接続エラーの1つは、「 ERROR 2002(HY000):ソケット'/var/run/mysqld/mysqld.sock'(2)> 」。

    このエラーは、 MySQLがないことを示しています サーバー(mysqld) ホストシステムで実行されているか、間違ったUnixソケットファイル名または TCP / IPを指定した サーバーに接続しようとしたときのポート。

    mysqldという名前のプロセスをチェックして、サーバーが実行されていることを確認します 図のように、データベースサーバーホストでpsコマンドとgrepコマンドを一緒に使用します。

    $ ps xa | grep mysqld | grep -v mysqld
    

    上記のコマンドで出力が表示されない場合は、データベースサーバーが実行されていません。したがって、クライアントはそれに接続できません。サーバーを起動するには、次のsystemctlコマンドを実行します。

    $ sudo systemctl start mysql        #Debian/Ubuntu
    $ sudo systemctl start mysqld       #RHEL/CentOS/Fedora
    

    MySQLを確認するには サービスステータスについては、次のコマンドを使用してください。

    $ sudo systemctl status mysql       #Debian/Ubuntu
    $ sudo systemctl status mysqld      #RHEL/CentOS/Fedora
    

    上記のコマンドの出力から、 MySQL サービスが失敗しました。このような場合は、再起動してステータスをもう一度確認してください。

    $ sudo systemctl restart mysql
    $ sudo systemctl status mysql
    

    さらに、サーバーが次のコマンドで示されているように実行されているにもかかわらず、上記のエラーが表示される場合は、 TCP / IPも確認する必要があります。 ポートはファイアウォールまたはポートブロックサービスによってブロックされています。

    $ ps xa | grep mysqld | grep -v mysqld
    

    サーバーがリッスンしているポートを見つけるには、次のようにnetstatコマンドを使用します。

    $ sudo netstat -tlpn | grep "mysql"
    

    2。 MySQLサーバーに接続できません

    よく発生するもう1つの接続エラーは、「(2003)「サーバー」上のMySQLサーバーに接続できません(10061) 」は、ネットワーク接続が拒否されたことを意味します。

    ここでは、 MySQLがあることを確認することから始めます 上記のようにシステム上で実行されているサーバー。また、サーバーでネットワーク接続が有効になっていること、および接続に使用しているネットワークポートがサーバーで構成されているポートであることを確認してください。

    MySQLサーバーに接続しようとしたときに発生する可能性のあるその他の一般的なエラーは次のとおりです。

    ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
    ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
    

    これらのエラーは、サーバーが実行されている可能性があることを示していますが、 TCP / IPを使用して接続しようとしています サーバーがリッスンしているものとは異なるポート、名前付きパイプ、またはUnixソケットファイル。

    3。 MySQLで拒否されたエラーへのアクセス

    MySQL 、ユーザーアカウントはユーザー名で定義されます および、ユーザーがサーバーに接続できる1つまたは複数のクライアントホスト。さらに、アカウントにはパスワードなどの認証資格情報が含まれている場合もあります。

    アクセスが拒否されました」にはさまざまな原因がありますが 」エラー、一般的な原因の1つは、サーバーが接続時にクライアントプログラムの使用を許可するMySQLアカウントに関連しています。 ユーザー名であることを示しています 接続で指定されたものには、データベースにアクセスするための特権がありません。

    MySQLを使用すると、クライアントユーザーがサーバーに接続してサーバーが管理するデータにアクセスできるようにするアカウントを作成できます。この点で、アクセス拒否エラーが発生した場合 、ユーザーアカウントが、使用しているクライアントプログラム、および場合によっては接続元のホストを介してサーバーに接続できるかどうかを確認します。

    SHOW GRANTSを実行すると、特定のアカウントにどのような権限があるかを確認できます。 示されているコマンド。

    > SHOW GRANTS FOR 'tecmint'@'localhost';
    

    MySQLシェルで次のコマンドを使用して、特定のデータベースの特定のユーザーにリモートIPアドレスに特権を付与できます。

    > grant all privileges on *.test_db to 'tecmint'@'192.168.0.100';
    > flush privileges;
    
    に付与します

    さらに、アクセス拒否エラー MySQLへの接続に関する問題が原因である可能性もあります。前述のエラーを参照してください。

    4。 MySQLサーバーへの接続が失われました

    次のいずれかの理由により、このエラーが発生する可能性があります。ネットワーク接続が不十分接続タイムアウト またはBLOBの問題 max_allowed_pa​​cketより大きい値 。ネットワーク接続に問題がある場合、特にリモートデータベースサーバーにアクセスしている場合は、ネットワーク接続が良好であることを確認してください。

    接続タイムアウトの場合 特にMySQLの場合に問題が発生します サーバーへの初期接続を使用しようとしている場合は、 connect_timeoutの値を増やしてください パラメータ。ただし、BLOB値の場合 max_allowed_pa​​cketよりも大きい 、 max_allowed_pa​​cketに高い値を設定する必要があります /etc/my.cnf[mysqld]の下の構成ファイル または[client] 示されているセクション。

    [mysqld]
    connect_timeout=100
    max_allowed_packet=500M
    

    MySQLの場合 構成ファイルにアクセスできない場合は、MySQLシェルで次のコマンドを使用してこの値を設定できます。

    > SET GLOBAL connect_timeout=100;
    > SET GLOBAL max_allowed_packet=524288000;
    

    5。 MySQL接続が多すぎます

    MySQLの場合 クライアントが「接続が多すぎます」に遭遇しました 」エラーは、使用可能なすべての接続が他のクライアントによって使用されていることを意味します。接続数(デフォルトは 151 )はmax_connectionsによって制御されます システム変数; /etc/my.cnf でより多くの接続を許可するように値を増やすことで、問題を解決できます。 構成ファイル。

    [mysqld]
    max_connections=1000
    

    6。メモリ不足のMySQL

    MySQLを使用してクエリを実行する場合 クライアントプログラムで問題のエラーが発生した場合は、MySQLにクエリ結果全体を保存するのに十分なメモリがないことを意味します。

    最初のステップは、クエリが正しいことを確認することです。正しい場合は、次の手順を実行します。

    • MySQLクライアントを直接使用している場合は、--quick switchで開始します。 、キャッシュされた結果を無効にする、または
    • MyODBCを使用している場合 ドライバー、構成ユーザーインターフェイス(UI)には、フラグ用の高度なタブがあります。 「結果をキャッシュしない」にチェックを入れます 「。

    もう1つの優れたツールは、 MySQL Tuner です。 –実行中のMySQLサーバーに接続し、パフォーマンスを向上させるためにサーバーを構成する方法についての提案を提供する便利なスクリプト。

    $ sudo apt-get install mysqltuner     #Debian/Ubuntu
    $ sudo yum install mysqltuner         #RHEL/CentOS/Fedora
    $ mysqltuner
    

    MySQLの最適化とパフォーマンスの調整のヒントについては、記事「15の便利なMySQL/MariaDBのパフォーマンスの調整と最適化のヒント」をお読みください。

    7。 MySQLがクラッシュし続ける

    この問題が発生した場合は、問題が MySQLにあるかどうかを確認する必要があります。 サーバーが停止するか、クライアントに問題があるかどうか。多くのサーバークラッシュは、破損したデータファイルまたはインデックスファイルが原因で発生することに注意してください。

    サーバーのステータスを確認して、サーバーが稼働している期間を確認できます。

    $ sudo systemctl status mysql       #Debian/Ubuntu
    $ sudo systemctl status mysqld      #RHEL/CentOS/Fedora
    

    または、次のmysqladminコマンドを実行して、MySQLサーバーの稼働時間を検索します。

    $ sudo mysqladmin version -p 
    

    他のソリューションには、 MySQL の停止が含まれますが、これに限定されません。 サーバーとデバッグを有効にしてから、サービスを再開します。問題を繰り返すために使用できるテストケースを作成してみることができます。さらに、追加のターミナルウィンドウを開き、次のコマンドを実行して、他のクエリの実行中にMySQLプロセス統計を表示します。

    $ sudo mysqladmin -i 5 status
    OR
    $ sudo mysqladmin -i 5 -r status 
    

    結論:問題またはエラーの原因を特定する

    いくつかの一般的なMySQLを見てきましたが 問題とエラー、およびそれらのトラブルシューティングと解決の方法も提供されています。エラーを診断する上で最も重要なことは、エラーの意味を理解することです(原因の観点から)。

    では、これをどのように判断できますか?次のポイントは、問題の原因を正確に突き止める方法を示しています。

    1. 最初の最も重要なステップは、ディレクトリ/var/log/mysql/に保存されているMySQLログを調べることです。 。 tailなどのコマンドラインユーティリティを使用して、ログファイルを読み取ることができます。
    2. MySQLサービスの開始に失敗した場合は、systemctlを使用してそのステータスを確認するか、 journalctlを使用してください。 (-xeを使用 フラグ)問題を調べるためのsystemdの下のコマンド。
    3. /var/log/messagesなどのシステムログファイルを調べることもできます または問題の理由で同様のもの。
    4. Mytop、glances、top、ps、htopなどのツールを使用して、どのプログラムがすべてのCPUを使用しているか、マシンをロックしているかを確認するか、メモリ、ディスクスペース、ファイル記述子などが不足していないかどうかを確認してください。その他の重要なリソース。
    5. 問題が暴走するプロセスであると仮定すると、MySQLが正常に機能するように、いつでも(pkillまたはkillユーティリティを使用して)それを強制終了することができます。
    6. mysqld サーバーが問題を引き起こしている場合は、次のコマンドを実行できます:mysqladmin -u root ping またはmysqladmin -u root processlist そこから応答を得る。
    7. MySQLサーバーに接続しようとしているときにクライアントプログラムに問題がある場合は、それが正常に機能しない理由を確認し、トラブルシューティングの目的でサーバーから出力を取得してみてください。

    次のMySQL関連の記事も読むことをお勧めします:

    1. 初心者向けのMySQL/MariaDBの学習–パート1
    2. CentOS7でNetdataを使用してMySQL/MariaDBデータベースを監視する方法
    3. すべてのMySQLデータベースを古いサーバーから新しいサーバーに転送する方法
    4. Mytop –LinuxでMySQL/MariaDBのパフォーマンスを監視するための便利なツール
    5. Linux用の12のMySQL/MariaDBセキュリティのベストプラクティス

    詳細については、問題と一般的なエラーに関するMySQLリファレンスマニュアルを参照してください。MySQLの使用中に発生する可能性のある一般的な問題とエラーメッセージが、上記で説明したものなどを含めて包括的にリストされています。


    1. SQLite AUTOINCREMENT

    2. OracleのNLS_INITCAP()関数

    3. MountainLionのpggem'0.14.0'が失敗する

    4. MariaDBでのDATE()のしくみ