前々回から何回かに分けて、mysql.
テーブルについて説明しました。今回は
第17回から引き続き、
筆者がCentOS 6.
$ sudo yum install -y http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm $ sudo yum install -y --disablerepo=mysql57-community --enablerepo=mysql56-community mysql-community-server $ sudo service mysqld start
root@127.0.0.1とroot@localhostは別アカウントか
前々回説明した通り、
TCP経由でローカルホストに接続する場合は
上記の説明が原則ではあるのですが、
TCP経由で接続する
まずは原則通り動くケースとして、/etc/
の[mysqld]
セクションにskip_
オプションを追記してMySQLを再起動します。
$ sudo vim /etc/my.cnf .. [mysqld] skip_name_resolve .. $ sudo service mysqld restart
この状態でTCP接続を試してみましょう。MySQLサーバが動いているマシン上で明示的にTCP接続を指定するためには、--protocol=tcp
オプションまたは-h127.
オプションを使用します。
$ mysql -uroot -h127.0.0.1 mysql> SELECT current_user(); +----------------+ | current_user() | +----------------+ | root@127.0.0.1 | +----------------+ 1 row in set (0.00 sec)
ちなみにIPv6形式で-h::1
と指定した場合、
$ mysql -uroot -h::1 mysql> SELECT current_user(); +----------------+ | current_user() | +----------------+ | root@::1 | +----------------+ 1 row in set (0.00 sec)
UNIXソケットで接続する
同じくUNIXソケット接続ではこのようになります。ローカルホストへの接続は、-h
オプションで明示的にIPアドレス形式を取るか、--protocol=tcp
オプションを指定しない限り、
$ mysql -uroot mysql> SELECT current_user(); +----------------+ | current_user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec)
root@localhostアカウントを削除する
この状態で、DROP USER
してみましょう。
mysql> DROP USER root@localhost; Query OK, 0 rows affected (0.01 sec)
これで、
$ mysql -uroot -h127.0.0.1 -sse "SELECT current_user()" root@127.0.0.1 $ mysql -uroot -sse "SELECT current_user()" @localhost
TCP接続は変わらずroot@127.
匿名アカウントはDROP
したことで、
root@127.0.0.1アカウントを削除する
逆を試してみましょう。root@localhostを作成しなおして、skip_
は設定したままです。
mysql> SELECT user, host FROM user; +------+-----------+ | user | host | +------+-----------+ | root | 127.0.0.1 | | root | ::1 | | | centos | | root | centos | | | localhost | +------+-----------+ 5 rows in set (0.00 sec) mysql> SELECT current_user(); +----------------+ | current_user() | +----------------+ | root@127.0.0.1 | +----------------+ 1 row in set (0.00 sec) mysql> CREATE USER root@localhost; Query OK, 0 rows affected (0.01 sec) mysql> GRANT ALL ON *.* TO root@localhost WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) mysql> DROP USER root@127.0.0.1; Query OK, 0 rows affected (0.01 sec) mysql> SELECT user, host FROM user; +------+-----------+ | user | host | +------+-----------+ | root | ::1 | | | centos | | root | centos | | | localhost | | root | localhost | +------+-----------+ 5 rows in set (0.00 sec)
再び、
$ mysql -uroot -h127.0.0.1 -sse "SELECT current_user()" ERROR 1130 (HY000): Host '127.0.0.1' is not allowed to connect to this MySQL server $ mysql -uroot -sse "SELECT current_user()" root@localhost
今度はわかりやすい形でroot@127.mysql.
テーブル
MySQLの名前解決機能をオンにする
ここまでのテストでは、skip_
をmy.
$ sudo vim /etc/my.cnf .. [mysqld] #skip_name_resolve .. $ sudo service mysqld restart
さて、
$ mysql -uroot -h127.0.0.1 -sse "SELECT current_user()" root@localhost $ mysql -uroot -sse "SELECT current_user()" root@localhost
ここがよくある誤解のもとです。デフォルトであるskip_
なしの状態では、
もう少し詳しく状況を把握するために、
mysql> CREATE USER root@127.0.0.1 IDENTIFIED BY 'tcp'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT ALL ON *.* TO root@127.0.0.1 WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) mysql> SET PASSWORD FOR root@localhost = PASSWORD('socket'); Query OK, 0 rows affected (0.00 sec)
結果は次の表の通りとなりました。
-hオプション | パスワード | 結果 |
---|---|---|
-h指定なし | socket | root@localhost |
-h指定なし | tcp | Access denied for user 'root'@'localhost' |
-h127. | socket | root@localhost |
-h127. | tcp | Access denied for user 'root'@'localhost' |
やはり表示上の問題などではなく、
skip_
パラメータの有無で結果が変わることから推測できると思いますが、skip_
を設定しない状態
まとめ
MySQLのアカウント上では"root@localhost"と"root@127.
次々回では、