Closed5
Prismaのマイグレーションで詰まった作業ログ
Prismaを触っていて、マイグレーションで詰まったのでメモ。(スクラップ書き始め段階では未解決)
起きている問題
npx prisma migrate dev
を実行したら
Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at https://pris.ly/d/migrate-shadow
Original error: Error code: P1010
User `user` was denied access on the database `new`
error Command failed with exit code 1.
このようなエラーが発生する
環境
- M1 Max
- Lima上でDocker起動してMySQL8を動かしている
- MySQLにはdocker-composeでroot以外のユーザを追加している
environment: TZ: "Asia/Tokyo" MYSQL_ROOT_PASSWORD: password MYSQL_USER: user MYSQL_PASSWORD: user_password MYSQL_DATABASE: new
- envファイルでDBの接続情報は書けている.env
DATABASE_URL="mysql://user:user_password@127.0.0.1:3306/new"
エラーの内容的にユーザにDBへの書き込み権限が無さそうと感じて、確認したところ権限はありそう
mysql> show grants for user;
+---------------------------------------------------+
| Grants for user@% |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `user`@`%` |
| GRANT ALL PRIVILEGES ON `new`.* TO `user`@`%` |
+---------------------------------------------------+
2 rows in set (0.00 sec)
スクラップ書き始め時の調査状況
Limaを使用しているため、同じ環境ではないが、ファイルシステムの問題の可能性もあり得そう?
この記事でファイルシステムが...のようなことを書かれていたので、LimaであることやM1であることが問題かと思い、IntelマシンでDocker Desktopを使用して同様の作業を行ったところ、変わらずマイグレーションに失敗した。
このqiitaで
Shadow databaseを作成する必要があるので、DBのUSERにcreate database権限が必要
さらに上記Databaseを閲覧する権限も必要
このように書かれていた(公式DOCでは探せていないけど...)
権限として、CREATEの権限を付与してみた
mysql
mysql> grant create on *.* to user;
mysql> show grants for user;
+--------------------------------------------------+
| Grants for user@% |
+--------------------------------------------------+
| GRANT CREATE ON *.* TO `user`@`%` |
| GRANT ALL PRIVILEGES ON `new`.* TO `user`@`%` |
+--------------------------------------------------+
2 rows in set (0.00 sec)
この状態でもマイグレーションに失敗した。
権限についてで絞って調べたところ
このnoteを見つけた。この通り、mysql
mysql> grant create, alter, drop, references on *.* to user;
mysql> show grants for user;
+--------------------------------------------------------------+
| Grants for user@% |
+--------------------------------------------------------------+
| GRANT CREATE, DROP, REFERENCES, ALTER ON *.* TO `user`@`%` |
| GRANT ALL PRIVILEGES ON `new`.* TO `user`@`%` |
+--------------------------------------------------------------+
2 rows in set (0.02 sec)
この状態でマイグレーションを実行したところ成功した🎉🎉
けれど、CREATE
DROP
REFERENCES
ALTER
の4つの権限にする理由がイマイチ理解できていない...
shadow databaseというものを作成するために必要だというのは理解したが、
shadow databaseを作成するときには、この4権限のみが必要で、rootが持っているような他の権限は不要なのだろうか?🤔
※shadow databaseというものについてもイマイチ理解できていない...
公式DOC読んでいたら
ここでMySQLの場合はDatabase user must have CREATE, ALTER, DROP, REFERENCES ON . privileges
このように書かれている。
このスクラップは2022/05/16にクローズされました