Laravel多数据库连接:第二个MySQL连接权限拒绝错误求助
Docker-Compose下Laravel迁移报MySQL权限错误排查方案
错误信息
| 2023-07-03T08:31:47.529482Z 3 [Note] Access denied for user 'feeds_user'@'xxxxx' (using password: YES) |
|---|
| Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user 'feeds_user'@'172.18.0.3' (using password: YES) |
核心问题
MySQL容器仅初始化了admin数据库和admin_user用户,feeds数据库及feeds_user用户未被创建,导致Laravel连接时权限验证失败。
修复步骤
1. 修正MySQL容器初始化配置
当前docker-compose.yaml中MySQL只初始化了admin相关资源,需添加feeds的初始化参数:
修改mysql-db服务的environment节点:
environment: - MYSQL_ROOT_PASSWORD=xxxxx - MYSQL_DATABASE=${DB_DATABASE},${FEEDS_DB_DATABASE} - MYSQL_USER=${DB_USERNAME},${FEEDS_DB_USERNAME} - MYSQL_PASSWORD=${DB_PASSWORD},${FEEDS_DB_PASSWORD}
注:MySQL 5.7支持用逗号分隔多数据库/用户,若此方式不生效,改用初始化脚本方案。
2. 用初始化脚本创建多用户和数据库
创建docker/mysql/init.sql脚本:
CREATE DATABASE IF NOT EXISTS feeds; CREATE USER IF NOT EXISTS 'feeds_user'@'%' IDENTIFIED BY 'xxxxx'; GRANT ALL PRIVILEGES ON feeds.* TO 'feeds_user'@'%'; FLUSH PRIVILEGES;
在docker-compose.yaml的mysql-db服务中添加脚本挂载:
volumes: - dbdata:/var/lib/mysql - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
MySQL启动时会自动执行该脚本创建所需资源。
3. 清理旧数据卷(关键操作)
已存在的dbdata卷保留了旧的初始化数据,需删除后重新构建:
docker-compose down -v docker-compose up -d
4. 优化Laravel配置
- 移除
.env中数据库配置的多余引号(如"admin"改为admin),避免解析异常 - 确认
database.php中feeds连接的host为mysql-db(Docker内部服务名,无需改为localhost/127.0.0.1)
5. 验证连接并执行迁移
进入Laravel容器测试连接:
docker exec -it laravel-app bash php artisan tinker DB::connection('feeds')->getPdo();
连接成功后执行迁移:
php artisan migrate --database=feeds
内容的提问来源于stack exchange,提问作者shk
相关产品推荐
相关产品推荐

