MySQL サーバに接続しようとして Access
denied
エラーが発生した場合の対処法を、以下に示します。
MySQL
のインストール後、mysql_install_db
スクリプトを実行して権限テーブルを初期設定していなければ、これを行う。
See 項4.4.4. 「MySQL 権限の初期設定」。
以下のコマンドを実行して初期権限をテストする。
shell> mysql -u root test
エラーが発生することなく接続できるはずである。また、MySQL
データベースディレクトリに
user.MYD
ファイルがあることを確認する。
通常、これは
PATH/var/mysql/user.MYD
である。ここで PATH
は、MySQL
インストール先ディレクトリのパス名である。
初期インストール後、サーバに接続してユーザとそのアクセス権をセットアップする。
shell> mysql -u root mysql
MySQL root
ユーザには、最初パスワードがないため、問題なく接続できるはずである。これはセキュリティ上のリスクでもあるため、他の
MySQL ユーザをセットアップするとき、同時に
root
パスワードも設定すべきである。
root
として接続しようとして以下のエラーが表示された場合
Access denied for user: '@unknown' to database mysql
これは、user
テーブルの
User
カラムに
'root'
値がなく、mysqld
がクライアントのホスト名を解決できないことを意味する。この場合、--skip-grant-tables
オプションでサーバを再起動し、/etc/hosts
ファイルまたは \windows\hosts
ファイルを編集してホストのエントリを追加する必要がある。
以下のエラーが発生した場合
shell> mysqladmin -u root -pxxxx ver
Access denied for user: 'root@localhost' (Using password: YES)
入力したパスワードが正しくないことを意味する。 See 項4.4.8. 「パスワードの設定」。
root
のパスワードを忘れた場合、--skip-grant-tables
オプションで mysqld
を再起動してパスワードを変更できる。 See
項A.4.2. 「忘れたルートパスワードをリセットする方法」。
パスワードを指定していないにもかかわらず上記のエラーが発生する場合、何らかの
my.cnf
ファイルに正しくないパスワードが存在していることを意味する。See
項4.1.2. 「my.cnf
オプション設定ファイル」。 以下のように
--no-defaults
オプションを使用すると、オプション設定ファイルの使用を避けることができる。
shell> mysqladmin --no-defaults -u root ver
既存の MySQL インストールを、バージョン
3.22.11 より前からバージョン 3.22.11
以降にアップグレードした後で、mysql_fix_privilege_tables
スクリプトを実行していなければ、これを実行する。GRANT
ステートメントが導入された MySQL
バージョン 3.22.11
では、権限テーブルの構造が変更されている。
See 項2.5.6. 「権限テーブルのアップグレード」。
セッション途中で権限が変更されているようであれば、スーパーユーザが変更した可能性がある。権限テーブルを再読み込みすると、新しいクライアント接続に影響し、また、項4.4.3. 「権限の変更はいつ反映されるか」 で説明されているように、既存の接続にも影響する。
パスワードが機能しない場合に
INSERT
、UPDATE
、または
SET PASSWORD
ステートメントを使用してパスワードを設定する際には
PASSWORD()
関数を使用することが必要である。GRANT
... IDENTIFIED BY
ステートメントまたは
mysqladmin password
コマンドを使用してパスワードを指定する場合には、PASSWORD()
関数は不要である。 See
項4.4.8. 「パスワードの設定」。
localhost
は、ユーザのローカルホスト名のシノニムである。また、ホストを明示的に指定せずにクライアントが接続しようとした場合のデフォルトホストでもある。ただし、MIT-pthread
を使用するバージョン 3.23.27 より前の MySQL
を使用している場合、localhost
への接続は行われない(localhost
接続は Unix
ソケットを使用して行われるが、これは当時の
MIT-pthread
にはサポートされていなかった)。このようなシステムでこの問題を回避するには、--host
オプションを使用してサーバホストを明示的に指定する。これにより、mysqld
サーバへの TCP/IP
接続が行われる。この場合、サーバホストの
user
テーブルエントリに実際のホスト名があることが必要である(これは、サーバと同じホスト上でクライアントプログラムを実行している場合も同様である)。
mysql -u user_name db_name
でデータベースに接続しようとして
Access denied
エラーが発生する場合、user
テーブルに問題がある可能性がある。mysql
-u root mysql
を実行し、以下の SQL
ステートメントを実行して、これをチェックする。
mysql> SELECT * FROM user;
この結果に、使用コンピュータのホスト名および
MySQL ユーザ名とマッチする Host
カラムおよび User
カラムのエントリが含まれていなければならない。
Access denied
エラーメッセージには、ログインしようとしているユーザ名、接続元のホスト、およびパスワードを使用したかどうかが示される。通常、エラーメッセージで表示されたホスト名とユーザ名に完全にマッチするエントリが
1 つ、user
テーブルに存在していなければならない。Using
password: NO
を含むエラーメッセージが表示された場合、パスワードなしでログインしようとしたことを意味する。
MySQL
サーバを実行しているホスト以外のホストから接続しようとして以下のエラーが発生する場合、そのホストと一致するレコードが
user
テーブルにないということである。
Host ... is not allowed to connect to this MySQL server
これを解決するには、コマンドラインツール
mysql
をサーバホスト上で使用して、user
、db
、または
host
テーブルに、接続しようとしているユーザとホスト名の組み合わせのレコードを追加し、mysqladmin
flush-privileges
を実行する。
実行している MySQL がバージョン 3.22
ではなく、接続しようとしているコンピュータの
IP
アドレスまたはホスト名がわからない場合、user
テーブルの Host
カラムに
'%'
を設定し、サーバマシン上で
--log
オプションを使用して
mysqld
を再起動する。クライアントマシンから接続を試行すると、MySQL
ログの情報により、実際の接続がどのように行われたかわかる。次に、user
テーブルエントリの '%'
の値を、ログで表示された実際のホスト名に置き換える。そうしないと、システムのセキュリティを保てない。
Linux 上でこの問題が発生した場合、考えられる他の原因としては、使用している glibc とは違うバージョンの glibc でコンパイルされたバイナリ MySQL バージョンを使用していることが挙げられる。この場合、OS/glibc をアップグレードするか、ソース MySQL バージョンをダウンロードして自分でコンパイルする。ソース RPM は通常、コンパイルおよびインストールが簡単なので、これは大きな問題ではない。
ホスト名で接続しようとしたにもかかわらず、エラーメッセージにホスト名が表示されない、またはホスト名が IP で表示される場合
shell> mysqladmin -u root -pxxxx -h some-hostname ver
Access denied for user: 'root@' (Using password: YES)
これは、IP
からホスト名に逆引きしようとしたときに
MySQL
でエラーが発生したことを意味する。この場合、mysqladmin
flush-hosts
を実行して内部 DNS
キャッシュをリセットすることができる。
See 項5.5.5. 「MySQL の DNS の使用」。
恒久的な解決方法
DNS サーバでの問題点を見つけ、それを修正する。
MySQL 権限テーブルで、ホスト名の代わりに IP を指定する。
--skip-name-resolve
オプションで
mysqld
を開始する。
--skip-host-cache
オプションで
mysqld
を開始する。
同じマシン上でサーバとクライアントを実行している場合は、localhost
に接続する。
/etc/hosts
にクライアントマシン名を記入する。
mysql -u root test
は正常終了するのに mysql -h your_hostname
-u root test
では Access
denied
となる場合、user
テーブルに正しいホスト名がない可能性がある。
通常、このような場合、user
テーブルエントリの Host
値が完全修飾されていないホスト名を指定し、システムの名前解決ルーチンが完全修飾されたドメイン名を返している(またはその逆)。
たとえば、user
テーブルにホスト 'tcx'
のエントリがあるが、DNS に MySQL
にホスト名として 'tcx.subnet.se'
を指示した場合、これは機能しない。この場合、Host
カラム値としてホストの IP アドレスを持つ
user
テーブルエントリを追加してみる。または、Host
値として 'tcx.%'
などのワイルドカードを含む
user
テーブルエントリを追加することもできる。ただし、‘%
’
で終わるホスト名の使用は、安全ではないので、推奨できない。
mysql -u user_name test
は正常終了するのに、mysql -u user_name
other_db_name
ではエラーが発生する場合、db
テーブルに other_db_name
のエントリがない。
サーバマシンでは mysql -u user_name
db_name
が動作するのに、別のクライアントマシンでは
mysql -h host_name -u user_name db_name
が動作しない場合、user
テーブルまたは db
テーブルにクライアントマシンが登録されていない。
Access denied
の原因がわからない場合は、user
テーブルから Host
値にワイルドカードが含まれているエントリ(‘%
’
または ‘_
’
を含むエントリ)をすべて削除する。
よくある間違いは、Host
='%'
および User
='some
user'
の新規エントリを挿入し、これで、同一マシンから接続する際には
localhost
を指定できると考えていることである。これがうまくいかない理由は、デフォルト権限として、Host
='localhost'
および User
=''
のエントリが含まれているためである。Host
値が 'localhost'
の場合、'%'
よりも具体的なため、localhost
からの接続時に新しいエントリよりもデフォルト権限が優先される。正しい指定の方法は、Host
='localhost'
および
User
='some_user'
の 2
つ目のエントリを挿入するか、Host
='localhost'
および User
=''
のエントリを削除することである。
以下のエラーが発生した場合、db
テーブルまたは host
テーブルに問題がある可能性がある。
Access to database denied
db
テーブルの
Host
カラムに空白値がある場合、その
db
テーブルエントリに対してホストを指定するエントリが
1 つ以上、host
テーブルに存在していることを確認する。
SQL コマンド SELECT ...INTO OUTFILE
または LOAD DATA INFILE
使用時にエラーが発生する場合、user
テーブルの該当エントリで FILE
権限が有効化されていないと考えられる。
クライアントプログラムは、オプション設定ファイルまたは環境変数で指定された接続パラメータを使用する。See
付録 F. 環境変数。
コマンドラインで接続パラメータを指定しなかったときに、クライアントが間違ったデフォルトの接続パラメータを送っているようであれば、ホームディレクトリの
.my.cnf
ファイルおよび環境変数を確認する。システムレベルの
MySQL
オプション設定ファイルも確認できるが、ここでクライアント接続パラメータが指定されている可能性は低い。See
項4.1.2. 「my.cnf
オプション設定ファイル」。
クライアントをオプションなしで実行して
Access denied
が発生する場合、オプション設定ファイルに古いパスワードが指定されていないか確認する。
See 項4.1.2. 「my.cnf
オプション設定ファイル」。
権限テーブルを(INSERT
または
UPDATE
ステートメントを使用して)直接変更した場合、その変更は無視されたように見えることがある。サーバに権限テーブルを再読み込みさせるには、FLUSH
PRIVILEGES
ステートメントを発行するか
mysqladmin flush-privileges
コマンドを実行する必要がある。このことを行わない場合、変更は次回のサーバ再起動時まで有効とならない。UPDATE
コマンドで root
パスワードを設定しても、権限をフラッシュするまでは、パスワードが変更されたことをサーバがまだ認識しないため、そのパスワードを指定する必要はない。
Perl、PHP、Ruby、Python、または ODBC
プログラムでアクセスに問題があった場合、mysql
-u user_name db_name
または mysql -u
user_name -pyour_pass db_name
を使用して接続してみる。mysql
クライアントを使用して接続できる場合、問題はプログラムにあり、アクセス権限にはない。
注意: -p
とパスワードの間にスペースは入れない。また、--password=your_pass
構文を使用してパスワードを指定することもできる。-p
オプションだけを使用した場合、パスワードが要求される。
テスト用に、--skip-grant-tables
オプションで mysqld
デーモンを開始する。次に MySQL
権限テーブルを変更し、変更によって意図した結果が得られているかどうか
mysqlaccess
スクリプトを使用してチェックできる。変更が意図したとおりであれば、mysqladmin
flush-privileges
を実行し、新しい権限テーブルを使用して起動するように
mysqld
サーバに指示する。注意:
権限テーブルを再読み込みすると、--skip-grant-tables
オプションが無効になる。これにより、サーバをシャットダウンして再起動することなく、権限テーブルの使用を始めることができる。
上記のいずれでもうまくいかない場合は、デバッグオプション(--debug=d,general,query
など)で mysqld
デーモンを開始する。試された接続に関するホスト情報、ユーザ情報、および発行された各コマンドに関する情報が出力される。
See 項E.1.2. 「トレースファイルの作成」。
MySQL
権限テーブルに関するその他の問題が発生し、その旨メーリングリストに投稿する場合は、MySQL
権限テーブルのダンプも必ず提供すること。mysqldump
mysql
コマンドを使用すれば権限テーブルをダンプできる。問題を投稿するときは、必ず
mysqlbug
スクリプトを使用すること。See
項1.7.1.3. 「バグまたは問題を報告する方法」。
mysqldump
を実行する際、--skip-grant-tables
で mysqld
を再起動することが必要な場合もある。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.