読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

MySQLのユーザー作成でハマったこと解決策メモ。

<スポンサーリンク>

MySQLで新規ユーザーを作成する方法

ツイッターで新規ユーザを作成するためのコマンドは以下のとおり。

CREATE USER user IDENTIFIED BY 'password';

実行例)

mysql> CREATE USER test IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.00 sec)

ユーザー権限を設定する。

GRANT 与える権限 ON データベース名.テーブル名 TO ユーザー名

与える権限は、SELECT,UPDATEなどのように、許可するコマンドを指定する。
全て許可する場合は、以下のようにALLとする。

mysql> GRANT ALL ON *.* TO test;
Query OK, 0 rows affected (0.00 sec)

一回ログアウトして、先ほど作成したユーザでログインしようとすると、

>mysql -u test -ptest
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: Y
ES)

こんなエラーが。
原因は以下の様なものが考えられる。

  • パスワードを間違った
  • パスワードが設定されていないのに「-p」オプションをつけた
  • MySQLのパスが正しく設定されていない。

今回は、「-p」を指定しなかったらなぜかログインできたので、パスワードが設定されていなかったことがわかった。
なんかパスワードが設定されていないのも嫌なので、改めてパスワードを設定する。
rootでログインして、ユーザー名を確認してみる。

mysql> SELECT host,user,password FROM mysql.user;
+-----------+------+-------------------------------------------+
| host      | user | password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *A4B6157319038724E3560894F7F932C8886EBFCF |
| linux     | root |                                           |
| localhost |      |                                           |
| linux     |      |                                           |
| localhost | pma  |                                           |
| %         | test | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |
+-----------+------+-------------------------------------------+

あれ、テストユーザにパスワード設定されてるっぽいけど・・・?どういうことだ・・・(正解は、「匿名ユーザーが悪さをしている」。それについては後述。)

とりあえず、再度パスワードを設定してみる。

> SET PASSWORD FOR test@"%"=PASSWORD('test');
Query OK, 0 rows affected (0.00 sec)

で、もう一回ログインしようとしたけれど、以下のようなエラーが。

ERROR 1045 (28000): Access denied for user 'test@%'@'localhost' (using password:
 YES)

うーーーん。
以下を参照。
http://dev.mysql.com/doc/refman/5.6/en/default-privileges.html

> SET PASSWORD FOR 'test'@'%' = PASSWORD('test');

うーーん。違うのも参照。
http://dev.mysql.com/doc/refman/5.6/en/set-password.html
以下のようにやってもダメ。

GRANT USAGE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';

なんでtestユーザーでログイン出来ないんだーと途方に暮れていたら、
「b.l0g.jp」様がものすごく丁寧に解説してくれていた。
http://b.l0g.jp/mysql/user-at-localhost/
ありがとうございます。参考にさせて頂きました。
匿名ユーザーが悪さをしていたっぽい。
以下のように、明示的に「localhostのtestユーザに権限を与える」とすればいい。

mysql> grant select on mydb.* to test@'localhost' identified by 'test';
Query OK, 0 rows affected (0.00 sec)

やっとログインできた!!

C:>mysql -u test -ptest
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.32

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserve

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statem

詳しくは、引用先の「b.l0g.jp」様の記事をご参照ください。
すごくわかりやすい解説をしてくれています。
ありがとうございます。

ただ、今度はこんなエラーが。

mysql> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    27
Current database: *** NONE ***

ERROR 1184 (08S01): Aborted connection 27 to db: 'unconnected' user: 'test' host: 'localhost' (init_connect command failed)

init_connectコマンドが失敗したらしい。
これについての対処法は以下のURLに記載されていて、このStackOverFlowの通りにコマンドを実行したらうまくいった。
http://stackoverflow.com/questions/9353087/reset-mysql-init-connect-values

(その他の参考)
http://dev.mysql.com/doc/refman/4.1/ja/communication-errors.html

何をしたかというと・・・

mysql> SHOW GLOBAL VARIABLES LIKE "init%";
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| init_connect  | 'SET NAMES utf8' |
| init_file     |                  |
| init_slave    |                  |
+---------------+------------------+
3 rows in set (0.00 sec)

mysql>
mysql> SET GLOBAL init_connect='';
Query OK, 0 rows affected (0.00 sec)

上記のコマンドを実行し、init_connectをリセットした。
すると、テストユーザーでもちゃんと接続できた。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| test               |
+--------------------+
3 rows in set (0.01 sec)

感謝のプログラミング

今回で感謝のプログラミングは【567時間目】
10000時間まで、あと【9433時間】