このページは機械翻訳したものです。
MySQL サーバーへの接続を試行したときに問題が発生した場合に問題を修正するために実行できる一連のアクションについて、次の項目で説明します。
-
サーバーが実行中であることを確認します。 そうでない場合、クライアントは接続できません。 たとえば、サーバーに接続しようとして次のいずれかのようなメッセージで失敗した場合、サーバーが実行中でないことが 1 つの原因であることがあります。
shell> mysql ERROR 2003: Can't connect to MySQL server on 'host_name' (111) shell> mysql ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111) -
サーバーは実行しているが、サーバーが待機しているのと異なる TCP/IP ポート、名前付きパイプ、または Unix ソケットファイルを使用して接続しようとしている場合もあります。 これを修正するには、クライアントプログラムを呼び出すときに、適切なポート番号を指すように
--portオプションを指定するか、--socketで適切な名前付きパイプまたは Unix ソケットファイルを指定します。 ソケットファイルがある場所を見つけるには、次のコマンドを使用できます。shell> netstat -ln | grep mysql サーバーがネットワーク接続を無視するように構成されていないこと、または (リモート側から接続しようとする場合に) サーバーのネットワークインタフェース上でローカル側でのみ待機するように構成されていないことを確認します。
skip_networkingシステム変数を有効にしてサーバーを起動した場合、TCP/IP 接続は受け入れられません。bind_addressシステム変数を127.0.0.1に設定してサーバーを起動した場合、サーバーはループバックインタフェースでローカルでのみ TCP/IP 接続をリスニングし、リモート接続を受け入れません。ファイアウォールが MySQL へのアクセスをブロックしていないか確認します。 ファイアウォールは、実行中のアプリケーションまたは MySQL によって通信用に使用されるポート番号 (デフォルトは 3306) を基準として構成されることがあります。 Linux または Unix の場合、IP テーブル (または同様の機能の) 構成を調べてポートがブロックされていないことを確認します。 Windows では、ZoneAlarm や Windows ファイアウォールなどのアプリケーションを、MySQL ポートをブロックしないように構成する必要がある場合があります。
-
付与テーブルが適切にセットアップされており、サーバーがこれをアクセス制御に使用できるようになっていることが必要です。 一部の配布タイプ (Windows でのバイナリ配布、Linux での RPM および DEB 配布など) では、インストールプロセスによって、付与テーブルを含む
mysqlシステムデータベースを含む MySQL データディレクトリが初期化されます。 これを行わない配布の場合は、データディレクトリを手動で初期化する必要があります。 詳細は、セクション2.10「インストール後のセットアップとテスト」を参照してください。付与テーブルの初期化が必要かどうかを判別するには、データディレクトリの下にある
mysqlディレクトリを参照します。 (通常、データディレクトリはdataまたはvarという名前で、MySQL のインストールディレクトリの下にあります。)mysqlデータベースディレクトリにuser.MYDという名前のファイルがあることを確認してください。 そうでない場合は、データディレクトリを初期化します。 これを行ってサーバーを起動すると、サーバーに接続できるようになります。 -
新規インストールの後、パスワードを使用せずに
rootとしてサーバーにログオンしようとすると、次のエラーメッセージが表示されることがあります。shell> mysql -u root ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)これは、インストール時に root パスワードがすでに割り当てられており、指定する必要があることを意味します。 パスワードが割り当てられている様々な方法、およびパスワードの検索方法については、セクション2.10.4「初期 MySQL アカウントの保護」 を参照してください。 root パスワードをリセットする必要がある場合は、セクションB.3.3.2「root のパスワードをリセットする方法」 の手順を参照してください。 パスワードを検出またはリセットした後、
--password(または-p) オプションを使用してrootとして再度ログオンします:shell> mysql -u root -p Enter password:ただし、mysqld --initialize-insecure を使用して MySQL を初期化した場合、サーバーはパスワードを使用せずに
rootとして接続できます (詳細は セクション2.10.1「データディレクトリの初期化」 を参照)。 これはセキュリティ上のリスクであるため、rootアカウントのパスワードを設定する必要があります。手順は、セクション2.10.4「初期 MySQL アカウントの保護」 を参照してください。 既存の MySQL インストールを新しいバージョンに更新した場合、MySQL のアップグレード手順を実行しましたか。 行なっていない場合は実行します。 付与テーブルの構造は、新機能が追加されるときにしばしば変更されるため、アップグレードしたあとは常に、テーブルの構造が最新であることを確認することをお勧めします。 その手順は、セクション2.11「MySQL のアップグレード」を参照してください。
-
クライアントプログラムが接続しようとしたときに次のエラーメッセージを受け取る場合、サーバーはクライアントが生成可能なものよりも新しい形式のパスワードを予期していることを意味します。
shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client -
クライアントプログラムは、オプションファイルまたは環境変数で指定された接続パラメータを使用することに注意してください。 コマンド行に接続パラメータを指定しないときにクライアントプログラムが間違ったデフォルトの接続パラメータを送信していると思われる場合、該当するオプションファイルおよび環境を確認してください。 たとえば、オプションなしでクライアントを実行するときに
Access deniedを受け取る場合、いずれかのオプションファイルで古いパスワードを指定していないか確認してください。--no-defaultsを指定してクライアントプログラムを呼び出すことによって、オプションファイルの使用をクライアントプログラムによって抑制することができます。 例:shell> mysqladmin --no-defaults -u root versionクライアントが使用するオプションファイルの一覧は、セクション4.2.2.2「オプションファイルの使用」にあります。 環境変数の一覧は、セクション4.9「環境変数」にあります。
-
次のエラーが出る場合、誤った
rootパスワードを使用していることを示しています。shell> mysqladmin -u root -pxxxx ver Access denied for user 'root'@'localhost' (using password: YES)パスワードを指定していないのに前述のエラーが発生する場合、いずれかのオプションファイルに間違ったパスワードがリストされていることを意味します。 前述の項目で説明したように、
--no-defaultsオプションを試してみてください。パスワードの変更に関する情報は、セクション6.2.14「アカウントパスワードの割り当て」を参照してください。
rootパスワードを紛失したか忘れた場合、セクションB.3.3.2「root のパスワードをリセットする方法」を参照してください。 -
localhostはローカルホスト名のシノニムで、ホストを明示的に指定しない場合にクライアントが接続を試行するデフォルトホストでもあります。--host=127.0.0.1オプションを使用して、サーバーホストに明示的に名前を付けることができます。 これにより、ローカル mysqld サーバーへの TCP/IP 接続が発生します。 また、ローカルホストの実際のホスト名を使用する--hostオプションを指定することによって TCP/IP を使用することもできます。 この場合、サーバーと同じホスト上でクライアントプログラムを実行していても、ホスト名がサーバーホスト上のuserテーブル行に指定されていなければなりません。 Access deniedというエラーメッセージは、ログインしようとしているユーザー名、接続を試行しているクライアントホスト、およびパスワードを使用したかどうかを通知します。 通常では、エラーメッセージ内で指定されたホスト名およびユーザー名に正確に一致する 1 つの行をuserテーブル内に持つようにします。 たとえば、using password: NOというメッセージを含むエラーメッセージを受け取る場合、パスワードなしでログインしようとしたことを意味します。-
mysql -uを使用してデータベースに接続しようとしたときにuser_nameAccess deniedエラーを受け取った場合、userテーブルにおそらく問題があります。 これをチェックするには、mysql -u root mysqlを実行し、次の SQL ステートメントを発行します。SELECT * FROM user;この結果には、クライアントのホスト名および使用中の MySQL ユーザー名に一致する
HostおよびUserカラムを持つ行が含まれているはずです。 -
MySQL サーバーを実行しているホストではないホストから接続しようとして次のエラーが発生する場合、クライアントホストと一致する
Host値を持つ行がuserテーブルにないということを意味しています。Host ... is not allowed to connect to this MySQL serverこれは、接続しようとするときに使用するクライアントホスト名およびユーザー名の組み合わせに対するアカウントをセットアップすることによって修正できます。
接続元のマシンの IP アドレスまたはホスト名がわからない場合、
Hostカラム値が'%'の行をuserテーブル内に作成するようにします。 そして、そのクライアントマシンから接続しようとしたあとで、SELECT USER()クエリーを使用して、実際にどのように接続したかを確認します。 そのあと、userテーブル行の'%'を、ログに表示されている実際のホスト名に変更します。 そうしない場合、特定のユーザー名について任意のホストからの接続が可能になるため、システムはセキュアでない状態のままになります。Linux では、このエラーが発生する可能性がある別の理由として、使用中のバージョンとは異なるバージョンの
glibcライブラリでコンパイルされたバイナリ MySQL バージョンを使用しているということがあります。 この場合、オペレーティングシステムまたはglibcをアップグレードするか、MySQL のソース配布バージョンをダウンロードして自分でコンパイルします。 ソース RPM のコンパイルおよびインストールは通常簡単であるため、これは大きな問題ではありません。 -
接続しようとしたときにホスト名を指定したが、ホスト名が非表示または IP アドレスとなっているエラーメッセージを受け取った場合、MySQL サーバーはクライアントホストの IP アドレスを名前に解決しようとしたときにエラーを受け取ったことを意味します。
shell> mysqladmin -u root -pxxxx -h some_hostname ver Access denied for user 'root'@'' (using password: YES)rootとして接続しようとして次のエラーを受け取った場合、Userカラム値が'root'の行がuserテーブルになく、mysqld がクライアントに対してホスト名を解決できないことを意味します。Access denied for user ''@'unknown'これらのエラーは DNS の問題を示しています。 これを修正するには、mysqladmin flush-hosts を実行して内部 DNS ホストキャッシュをリセットします。 セクション5.1.12.3「DNS ルックアップとホストキャッシュ」を参照してください。
いくつかの永続的な解決策を次に示します。
DNS サーバーの問題を判別して修正します。
MySQL 付与テーブルにホスト名の代わりに IP アドレスを指定します。
クライアントマシン名に対するエントリを、Unix の場合は
/etc/hostsに、Windows の場合は\windows\hostsに配置します。skip_name_resolveシステム変数を有効にして mysqld を起動します。mysqld を
--skip-host-cacheオプションで起動します。Unix で、サーバーとクライアントを同じマシンで実行している場合、
localhostに接続します。localhostへの接続の場合、MySQL プログラムは、クライアントが TCP/IP 接続を確立するための接続パラメータが指定されていないかぎり、Unix ソケットファイルを使用してローカルサーバーへの接続を試みます。 詳細は、セクション4.2.4「コマンドオプションを使用した MySQL Server への接続」を参照してください。Windows で、サーバーとクライアントを同じマシンで実行していて、サーバーが名前付きパイプ接続をサポートしている場合、ホスト名
.(ピリオド) に接続します。.への接続には、TCP/IP ではなく名前付きパイプが使用されます。
mysql -u rootは動作するが、mysql -hによってyour_hostname-u rootAccess denied(your_hostnameはローカルホストの実際のホスト名) が生成される場合、userテーブルにホストの正しい名前がない可能性があります。 このときよくある問題として、userテーブル行のHost値は、修飾されていないホスト名を指定しているが、システムの名前解決ルーチンは完全修飾ドメイン名を返すということ (またはその逆) があります。 たとえば、userテーブルにホスト'pluto'を含む行があり、ホスト名が'pluto.example.com'であることを DNS が MySQL に通知した場合、その行は機能しません。 ホストの IP アドレスをHostカラム値として含む行をuserテーブルに追加してみます。 (または、ワイルドカードを含むHost値 ('pluto.%'など) を使用して、userテーブルに行を追加できます。 ただし、%で終わるHost値を使用することは安全でないため推奨されません。)mysql -uは動作するが、user_namemysql -uは動作しない場合、user_namesome_dbsome_dbという名前のデータベースに対する特定のユーザーへのアクセス権を付与していません。mysql -uをサーバーホスト上で実行したときに動作するが、user_namemysql -hをリモートクライアントホスト上で実行したときに動作しない場合、特定のユーザー名についてリモートホストからサーバーへのアクセスを有効にしていません。host_name-uuser_nameAccess deniedを取得する理由がわからない場合は、ワイルドカード ('%'または'_'文字を含む行) を含むHost値を持つすべての行をuserテーブルから削除します。 非常に一般的なエラーは、Host='%'およびUser='を使用して新しい行を挿入することです。これにより、some_user'localhostを指定して同じマシンから接続できると考えられます。 これが機能しない理由は、デフォルトの権限にHost='localhost'およびUser=''の行が含まれているためです。 その行には'%'よりも具体的なHost値'localhost'があるため、localhostから接続するときに新しい行よりも優先して使用されます。 正しい手順は、Host='localhost'およびUser='を使用して 2 行目を挿入するか、some_user'Host='localhost'およびUser=''を使用して行を削除することです。 行を削除した後は、必ずFLUSH PRIVILEGESステートメントを発行して付与テーブルをリロードしてください。 セクション6.2.6「アクセス制御、ステージ 1: 接続の検証」も参照してください。MySQL サーバーに接続できても、
SELECT ... INTO OUTFILEまたはLOAD DATAステートメントを発行するたびにAccess deniedメッセージが表示される場合、userテーブルの行でFILE権限が有効になっていません。付与テーブルを直接 (たとえば、
INSERT、UPDATE、またはDELETEステートメントを使用して) 変更し、変更が無視されたように思われる場合、サーバーに権限テーブルをリロードさせるためにFLUSH PRIVILEGESステートメントまたは mysqladmin flush-privileges コマンドを実行する必要があることを覚えておいてください。 そうしない場合、サーバーが次回再起動するまで変更の影響はありません。UPDATEステートメントを使用してrootのパスワードを変更した後は、権限をフラッシュするまで新しいパスワードを指定する必要はありません。これは、パスワードを変更するまでサーバーが認識しないためです。セッションの最中に権限が変更されたと思われる場合、MySQL 管理者によって権限が変更された可能性があります。 付与テーブルのリロードは、新しいクライアント接続に影響しますが、セクション6.2.13「権限変更が有効化される時期」に示すように既存の接続にも影響します。
Perl、PHP、Python または ODBC プログラムでアクセスの問題が発生した場合は、
mysql -uまたはuser_namedb_namemysql -uを使用してサーバーに接続してみてください。 mysql クライアントを使用して接続できる場合、問題はアクセス権限ではなくプログラムにあります。 (user_name-ppassworddb_name-pとパスワードの間に空白はありません。--password=構文を使用してパスワードを指定することもできます。password-pまたは--passwordオプションを使用してパスワード値を指定しない場合、MySQL はパスワードを要求します。)テスト目的で、
--skip-grant-tablesオプションを指定して mysqld サーバーを起動します。 これにより、MySQL 付与テーブルを変更でき、SHOW GRANTSステートメントを使用して、変更による望ましい影響があるかどうかを確認することができます。 変更に満足したら、mysqladmin flush-privileges を実行して、権限をリロードするよう mysqld サーバーに指示します。 これにより、サーバーを停止して再起動することなく新しい付与テーブルの内容の使用を開始することができます。すべてが失敗する場合、mysqld サーバーをデバッグオプション (
--debug=d,general,queryなど) で起動します。 これによって、発行された各コマンドに関する情報のほかに、試行された接続についてのホストおよびユーザー情報が出力されます。 セクション5.9.4「DBUG パッケージ」を参照してください。MySQL 付与テーブルにその他の問題があり、MySQL Community Slack で確認する場合は、常に MySQL 付与テーブルのダンプを提供してください。 mysqldump mysql コマンドでテーブルをダンプできます。 バグレポートを提出するには、セクション1.6「質問またはバグをレポートする方法」の説明を参照してください。 mysqldump を実行するには
--skip-grant-tablesを指定して mysqld を再起動することが必要な場合もあります。