You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:52:28