概要
Dockerコンテナで起動しているMysql8.0のDBをDBEAVERで開いて、レストアすると以下のエラーになりました。
一応解決できたので紹介します。
/opt/homebrew/Cellar/mysql/8.1.0/bin/mysql -u root --host=localhost --port=3304 -v sampledb Task 'MySQL restore' started at Thu Sep 05 14:49:35 JST 2024 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
原因と対策
DBeaverでDBにはアクセスできるし、root
ユーザーの権限を確認したが問題なし。
どうしてレストア時のみ失敗するのだろう?
まず同じコマンドをターミナルからやってみる。
/opt/homebrew/Cellar/mysql/8.1.0/bin/mysql -u root --host=localhost --port=3304 -v sampledb -p
同じようにAccess denied
と出てきました。
普通にmysqlコマンドで入れば正常にログインできたので、おそらくレストア時に使っているローカルクライアントの/opt/homebrew/Cellar/mysql/8.1.0/bin/mysql
を使っていることで影響が出ているらしいと推測。
調べていると、localhost
ではなくて127.0.0.1
に変更するとTCP/IPを明示的に使用できることがある、というのを見つけたので、127.0.0.1
にして以下実行。
/opt/homebrew/Cellar/mysql/8.1.0/bin/mysql -u root --host=127.0.0.1 --port=3304 -v sampledb -p
するとmysqlにログインできました!
DBEAVERでも同様にDB設定でlocalhost
から127.0.0.1
としたら、レストアが正常に実行されるようになりました。
しかし、127.0.0.1
にすることで解決したのはなぜなのだろう...
localhost
はUNIXドメインソケットを使用して接続し、127.0.0.1
(ループバックアドレスとも呼ばれる)はTCP/IPを使用して接続する、という違いがあるよう。
ローカルのMySQLの設定ファイルは以下のようになっていました。localhost
を指定した場合でも、実際には127.0.0.1
にリダイレクトされるため、TCP/IP接続が使用される...はず?
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
character-set-server = utf8mb4
[client]
default-character-set = utf8mb4
socket=/tmp/mysql.sock
を追加してみましたが同じでした。
ソケットファイルあたりに原因があったのだろうか...?
真因がわかったら更新します。