Mac+MariadbでAccess denied for user 'root'@'localhost'


現象

Mac(M1)にhome brewからmariadbをインストール。rootで接続しテーブルとユーザーを作成後、GRANTしようと思ったらAccess denied for user 'root'@'localhost' database ***で権限付与できない。

mysql -u root mysql
CREATE USER 'profit-admin'@'localhost';
CREATE DATABASE IF NOT EXISTS `dev-profit` DEFAULT CHARACTER SET utf8;
GRANT ALL ON `dev-profit`.* to 'profit-admin'@'localhost';
Access denied for user 'root'@'localhost' database dev-profit

という感じです。

今まではrootが自動的に特権ユーザーになっていて、なんでも出来たんですが、バージョンの問題か、何か手順がもれたのか原因はいまいちはっきりしてません。

構成はこんな感じです。

  • macOS 12.0.1
  • Homebrew 3.3.9
  • Server version: 10.6.4-MariaDB Homebrew

解決した手順

  • ps -ef | grep mariadb--datadirを確認しておく。
  • brew services stop mariadbでmariadbをストップ。
  • mysqld_safe --skip-grant-tables --datadir=/path/to/datadirで権限無視モードで起動する。
  • sudo mysql -u rootで接続。sudoは必要ないかも。
  • flush privileges;を実行(必要ないかも)。
  • DROP USER 'root'@'localhost'ADD USER 'root'@'localhost'で作り直す。これも必要ないかも。色々試したので一応リセットしてみた。
  • flush privileges;を実行(必要ないかも)。
  • GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTIONを実行。ここのWITH GRANT OPTIONが重要だと思われる。
  • flush privileges;を実行。
  • ログアウト後--skip-grant-tablesで起動したmariadbを止める。
  • brew services start mariadbで自動起動をON.

解説(というか感想)

Access denied for user 'root'@'localhost'で検索するといっぱい情報が出てくるけど、どれをやってもダメでイライラいました😝

多いのはmysqld_safe --skip-grant-tablesで起動してGRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'で行けるという奴。

ところがmysqld_safe --skip-grant-tablesで起動するとuse mysqlすらできない。これはdatadirの指定で見えるようになりました。

さらにGRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'するとThe MariaDB server is running with the --skip-grant-tables option so it cannot execute this statementというエラーになってできませんでした。正直これを突破した原因はいまいちわかってないのですが、mysqld_safe --skip-grant-tablesで起動後にflush privilegesを実行したからか、sudo mysql -u rootで接続したからか、どっちかだと思います。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'が実行できたのですが、目的のテーブルにgrantしようと思ったら相変わらず下記のエラーが。

Access denied for user 'root'@'localhost' database dev-profit

最終的に以下のコマンドでできるようになりました。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

WITH GRANT OPTIONをつけてやる必要があります。

こちらのサイトで情報見つけました。ありがたや。ありがたや。