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

mysql 外部サーバーからアクセス可能なユーザーを作成する

mysql

別サーバー(host2)から、例えばlocalhostからしかアクセスできないユーザー(user1)でDBサーバー(host1)にログインしてみる。

$ mysql -uuser1 -ppass -h host1
ERROR 1045 (28000): Access denied for user 'user1'@'host2' (using password: YES)

このようにエラーが出るため、host2からアクセス可能なユーザー(user2)を作成する(全DBにアクセス可能)

grant all privileges on *.* to user2@"host2のIP" identified by 'pass';

参考サイト
外部サーバのMySQLに接続を試すの巻


15/11/21追記
もうちょっと詳細なメモ。
外部サーバーから、3306のポートが開いていない状態でmysql接続しようとすると処理待ち状態(応答が無い)となる。
3306ポートが開いていて、bind-addressがローカルのみになっている場合、以下のエラーが発生

ERROR 2003 (HY000): Can't connect to MySQL server on 'ipアドレス'

さらにbind-addressの記載がなく、ユーザーにip許可設定がされていないと最初のエラーが発生

ERROR 1045 (28000): Access denied for user 'user1'@'host2' (using password: YES)

以下、既存のUSAGE権限を持つユーザーでlocalhostのみアクセス可能な場合に、host2からのアクセスを許可する設定を追加する例

#userにhost2からのアクセスを許可する設定
GRANT USAGE ON *.* TO 'user'@'host2のIP' IDENTIFIED BY PASSWORD '*F30D6ECDSE53234662CE57F1FB663523523SS';
#sampleデータベースへの権限を付与する設定
GRANT ALL PRIVILEGES ON `sample`.* TO 'user'@'host2のIP';

passwordは平文だと怒られるため暗号化した値(もしくはdumpした値)を指定すること。

参考サイト
MySQL ユーザのホストをワイルドカードで指定してもlocalhostは含まれない | b.l0g.jp
syaka-syakaブログ: mysql5.6でユーザー作成したらエラーになった


16/7/28追記
今回も上記と同様の事象が起きたんだけどエラー文言が違ったのでメモ。今回出たエラーは以下。

ERROR 1130 (HY000): Host 'ipアドレス' is not allowed to connect to this MySQL server

この場合も上記同様にgrant all privilegesで権限を付与してやればよい。なお権限を削除したいときは↓でユーザー自身を削除する。

// 現在のユーザー
select Host, User, Password from mysql.user;
// ユーザー削除(クウォートの位置に注意)
drop user 'user'@'host';

・・これで接続できると思いきや以下のエラーが発生

ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)

どうやら新しいmysqlから古いmysqlへ接続しに行こうとするとエラーになるらしい。具体的にはmysql.user.Passwordが16桁だと発生するらしい。なので以下のように41桁でパスワードを作り直せばok

SET SESSION old_passwords=0;
SET PASSWORD FOR 'user'@'host' = PASSWORD('password');