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)

スクラップ書き始め時の調査状況

https://zenn.dev/wooootack/articles/e7fc45f50d0f57
この記事がヒットした。
Limaを使用しているため、同じ環境ではないが、ファイルシステムの問題の可能性もあり得そう?

https://zenn.dev/wooootack/articles/e7fc45f50d0f57
この記事でファイルシステムが...のようなことを書かれていたので、LimaであることやM1であることが問題かと思い、IntelマシンでDocker Desktopを使用して同様の作業を行ったところ、変わらずマイグレーションに失敗した。

https://qiita.com/makoll/items/4df94068f570aebf39af
この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)

この状態でもマイグレーションに失敗した。

権限についてで絞って調べたところ

https://note.com/tomosuke_8/n/n96dd9d10a8a1
この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というものについてもイマイチ理解できていない...

このスクラップは1ヶ月前にクローズされました
ログインするとコメントできます