Laravelを開発する際にDockerを用いてLaravel sailを使う方は非常に多いでしょう。
その際にphpMyAdminも併せてインストールをして、Web上から簡単にデータベースの追加・削除などを行い、色々とテストを行おうかと考えた時。
sailアカウントにデータベースを操作する権限が付与されておらず困ったことがありましたので、その解決方法を今回紹介します。
phpMyAdminで操作不可

phpMyAdminにログインをして、データベースの項目を見てみましょう。
操作権限が付与されているならば、既存のデータベースを削除できるチェックボックスがデータベースの名前横に表示されるのですが見当たりません。
下記の操作を行って、データベースの作成・削除が出来るようにしてみましょう。
mysqlの確認
docker-compose.ymlのmysqlの確認を先ずしておきましょう。
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: '%'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- 'sail-mysql:/var/lib/mysql'
- './docker/8.2/my.cnf:/etc/my.cnf'
- './docker/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
networks:
- sail
healthcheck:
test:
- CMD
- mysqladmin
- ping
- '-p${DB_PASSWORD}'
retries: 3
timeout: 5slaravelのバージョンや私が少しカスタマイズした部分もあるので、表記が違う部分もあるでしょう。
違っていても、さして問題はありませんので気にしないで下さい。
今回見るところはmysqlにログインするためのIDとPASSを確認する必要があります。
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: '%'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1environmentを見てみると変数で指定されています。
.envファイルの設定項目を見てみましょう。
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=sail
DB_PASSWORD=passwordDB_USERNAMEとDB_PASSWORDをここでは確認し、次のmysqlに進みましょう。
rootユーザーでmysqlにログイン
先程確認したDB_USERNAMEのsailに権限を付与するにはrootでmysqlにログインする必要があります。
sail exec mysql mysql -uroot -ppassword上記のコマンドで以下のようにログインできます。
owner@PC:~/test$ sail exec mysql mysql -uroot -ppassword
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>sailユーザーの権限確認
現在のsailに付与されている権限を確認してみましょう。
SHOW GRANTS FOR 'sail'@'%';以下のように現在の権限が確認できます。
mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
3 rows in set (0.00 sec)'sail'@'%'@前半はユーザー名、後半はホスト名です。
sailユーザーに全権限付与
phpMyAdminで操作するために手っ取り早く全権限をsailユーザーに付与します。
GRANT ALL ON *.* TO 'sail'@'%';GRANT [権限] ON [データベース].[テーブル] TO '[ユーザー名]'@'[ホスト名]';[権限]は付与する権限(例:SELECT, INSERT, UPDATE, DELETE, ALLなど)を指定します。[データベース]と[テーブル]は、権限を付与するデータベースとテーブルを指定します。すべてのデータベースやテーブルに対して権限を付与する場合は、*.*を使用します。'ユーザー名'@'ホスト名'は、権限を付与するユーザーを指定します。
無事権限が付与できた場合の表示は以下になります。
mysql> GRANT ALL ON *.* TO 'sail'@'%';
Query OK, 0 rows affected (0.03 sec)上記のコマンドはセキュリティがガバガバなのでローカルなどテスト環境のみでお使い下さい。
本番環境では適切に権限を付与する必要があり、上記のコマンドを使うとセキュリティが著しく落ちて危険ですので使わないで下さい。
sailユーザーの権限を再確認
実際に付与されているか権限を再確認してみましょう。
SHOW GRANTS FOR 'sail'@'%';確認すると以下のような表示が確認できました。
mysql> SHOW GRANTS FOR 'sail'@'%';
+------------------------------------------------------------------------------+
| Grants for sail@% |
+------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS,
FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES,
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,
SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER,
CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `sail`@`%` |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,
AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,
CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,
FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,
GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,
INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,
REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,
RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,
SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,
SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,
XA_RECOVER_ADMIN ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+------------------------------------------------------------------------------+
4 rows in set (0.00 sec)phpMyAdminでの権限確認

操作権限が問題なく付与されたので、phpMyAdminから既存のデータベースを削除できるチェックボックスが表示される様になりました。
データベースの新規作成も正常に行なえる様になっていますので、データベースをガシガシ使い捨てながらローカル開発を行っていきましょう。
権限を削除し元の状態にする方法
権限を増やしすぎて元の状態にしたい。初期化したいと考えた時の修正方法です。
手順としてはsailの権限を全て削除した後、以前付与されていたデータベースへの権限を個別に付与(修正)していく形となります。
sailの権限を全て削除
REVOKE ALL ON *.* FROM 'sail'@'%';個別にデータベースの権限付与
GRANT ALL PRIVILEGES ON test.* TO 'sail'@'%';一連の流れを実行した作業例は以下となります。
mysql> REVOKE ALL ON *.* FROM 'sail'@'%';
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------+
| Grants for sail@% |
+----------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
+----------------------------------+
1 row in set (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON test.* TO 'sail'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON testing.* TO 'sail'@'%';
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW GRANTS FOR 'sail'@'%';
+---------------------------------------------------+
| Grants for sail@% |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing`.* TO `sail`@`%` |
+---------------------------------------------------+
3 rows in set (0.00 sec)コマンドのみでデータベースを編集する方法
phpMyAdminでデータベースを編集するなら上記の説明で事足りるのですが、コマンドのみで操作をしてみたい。本番環境の練習のためCLIで済ましたいという方のために簡単な操作を紹介しておきます。
データベースの一覧を表示
まず現在のデータベースの一覧を確認してみましょう。
SHOW DATABASES;現在作成されているデータベース一覧を取得できます。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| testing |
+--------------------+
6 rows in set (0.00 sec)データベースを新規作成
CREATE DATABASE new_db;作成後、データベースの一覧を再取得してみると、新規に追加されているのが確認できます。
mysql> CREATE DATABASE new_db;
Query OK, 1 row affected (0.07 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| new_db |
| performance_schema |
| sys |
| test |
| testing |
+--------------------+
7 rows in set (0.00 sec)sailユーザーに新規作成したDBのフル権限を付与
データベースを新規作成しただけでは、sailユーザーには先程作成したデータベースの操作権限が無いため、プログラムから操作を行おうとしてもエラーが出て何も出来ません。
新たにsailユーザーに先ほど作成したデータベースへの権限を付与してみましょう。
GRANT ALL PRIVILEGES ON new_db.* TO 'sail'@'%';権限を付与前、権限を付与、権限を付与後の実行例が以下です。
mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
3 rows in set (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON new_db.* TO 'sail'@'%';
Query OK, 0 rows affected (0.04 sec)
mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `new_db`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
4 rows in set (0.01 sec)データベース削除
やっぱりデータベースを作ったけど削除してやり直したい時は以下のコマンドを使います。
DROP DATABASE new_db;削除前、データベースを削除、削除後のデータベース一覧取得の実行例が以下です。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| new_db |
| performance_schema |
| sys |
| test |
| testing |
+--------------------+
7 rows in set (0.00 sec)
mysql> DROP DATABASE new_db;
Query OK, 0 rows affected (0.13 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| testing |
+--------------------+
6 rows in set (0.00 sec)sailユーザーから削除したDBの権限削除
データベースを削除してもsailに付与した権限は一緒に削除はされませんので以下のコマンドで権限も削除しましょう。
REVOKE ALL PRIVILEGES ON new_db.* FROM 'sail'@'%';削除前、権限を削除、削除後のsailユーザーの権限取得の実行例が以下です。
mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `new_db`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
4 rows in set (0.00 sec)
mysql> REVOKE ALL PRIVILEGES ON new_db.* FROM 'sail'@'%';
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
3 rows in set (0.00 sec)あとがき

権限を付与した後sail php artisan migrateを行う場合、必ずデータベースを手動で予め作成して下さい。
全権付与したので問題なくデータベースも作成されるかな?とマイグレーションを叩いても、データベースが存在しないとエラーが出て怒られます。
データベースを予めphpMyAdminで作るなり、直接コマンドを叩いて作成するなりしてからlaravelのコマンドを叩きましょう。


コメント