MySQLの一般的なエラーのトラブルシューティングに役立つヒント


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

ある[ MySQL は、Webアプリケーション用に設計され、最適化された - それは Facebookのの、 Twitter の、などの主要なWebベースのアプリケーションの不可欠な部分を形成するウィキペディア YouTube 、その他多数。

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

1.ローカルのMySQLサーバーに接続できない

MySQLにおける一般的なクライアントからサーバーへの接続エラーの1つは、「 ERROR 2002(HY000):ソケット '/var/run/mysqld/mysqld.sock'を介してローカルのMySQLサーバーに接続できない(2)

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

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

$ 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

サーバーがlistenしているポートを見つけるには、図のようにnetstatコマンドを使用してください。

$ sudo netstat -tlpn | grep "mysql"

2. MySQLサーバーに接続できない

もう1つの一般的な接続エラーは「(2003) 'server'(10061)ではMySQLサーバーに接続できません」です。これはネットワーク接続が拒否されたことを意味します。

ここでは、上に示すように、システム上で 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つは、接続時にサーバーがクライアントプログラムの使用を許可している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サーバーへの接続が失われた

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

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

[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にはクエリ結果全体を格納するのに十分なメモリがありません。

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

  • if you are using MySQL client directly, start it with --quick switch, to disable cached results or
  • if you are using the MyODBC driver, the configuration user interface (UI) has an advanced tab for flags. Check “Do not cache result“.

もう1つの優れたツールは、 MySQL Tuner です。実行中のMySQLサーバーに接続し、より高いパフォーマンスを得るための設定方法に関する提案を提供する便利なスクリプトです。

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

MySQLの最適化とパフォーマンスチューニングのヒントについては、次の記事を読んでください。

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. The first and most important step is to look into the MySQL logs which are stored in the directory /var/log/mysql/. You can use command line utilities such as tail to read through the log files.
  2. If MySQL service fails to start, check its status using systemctl or use the journetctl (with the -xe flag) command under systemd to examine the problem.
  3. You can also examine system log file such as /var/log/messages or similar for reasons for your problem.
  4. Try using tools such as Mytop, glances, top, ps, or htop to check which program is taking all CPU or is locking the machine or to inspect whether you are running out of memory, disk space, file descriptors, or some other important resource.
  5. Assuming that problem is some runaway process, you can always try to kill it (using the pkill or kill utility) so that MySQL works normally.
  6. Supposing that the mysqld server is causing problems, you can run the command: mysqladmin -u root ping or mysqladmin -u root processlist to get any response from it.
  7. If the problem is with your client program while trying to connect to the MySQL server, check why it is not working fine, try to get any output from it for troubleshooting purposes.

MySQL関連の次の記事も読んでください。

  1. Learn MySQL / MariaDB for Beginners – Part 1
  2. How to Monitor MySQL/MariaDB Databases using Netdata on CentOS 7
  3. How to Transfer All MySQL Databases From Old to New Server
  4. Mytop – A Useful Tool for Monitoring MySQL/MariaDB Performance in Linux
  5. 12 MySQL/MariaDB Security Best Practices for Linux

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