Laravel执行php artisan migrate出现SQLSTATE[HY000] [2002]连接错误
问题解决步骤
问题根因说明
你遇到的两类报错+root用户无需密码即可登录的异常,核心来自两个配置问题:
- MariaDB默认开启root用户的
unix_socket身份认证,仅允许本地系统root用户通过套接字免密登录,不支持密码验证的TCP连接 - MariaDB服务端监听配置、PHP的MySQL套接字路径不匹配,导致TCP/UNIX连接分别报错
分步解决方法
1. 确认MariaDB服务监听状态
执行以下命令查看3306端口监听情况:
netstat -tulpn | grep 3306
如果输出中没有127.0.0.1:3306的监听记录,编辑MariaDB配置文件(通常路径为/etc/mysql/mariadb.conf.d/50-server.cnf或/etc/my.cnf),找到bind-address配置项修改为:
bind-address = 127.0.0.1
修改完成后重启服务生效:
sudo systemctl restart mariadb
2. 修复root用户身份认证规则
直接使用系统权限登录MariaDB:
sudo mysql -u root
执行SQL查看当前root用户的认证方式:
SELECT user, host, plugin FROM mysql.user WHERE user='root';
如果plugin字段值为unix_socket/auth_socket,执行以下命令修改为密码认证,并设置实际登录密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的实际数据库密码'; FLUSH PRIVILEGES; EXIT;
修改完成后验证登录逻辑是否正常:
- 执行
mysql -u root -p错误密码会提示拒绝访问 - 执行
mysql -u root -p你设置的正确密码可正常登录,说明认证规则修复完成
3. 提前创建目标数据库
Laravel迁移不会自动创建数据库,登录MariaDB后执行SQL建库:
CREATE DATABASE IF NOT EXISTS liberty_comerce DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
4. 修正Laravel .env配置
方案A:使用TCP连接(推荐,兼容性更好)
修改.env数据库配置如下:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=liberty_comerce DB_USERNAME=root DB_PASSWORD=你刚才设置的实际数据库密码
无需额外配置套接字参数。
方案B:使用UNIX套接字连接
如果要保留DB_HOST=localhost,需要先查询MariaDB的套接字实际路径:
mysql_config --socket
将返回的路径(通常为/run/mysqld/mysqld.sock)添加到.env配置中:
DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=liberty_comerce DB_USERNAME=root DB_PASSWORD=你刚才设置的实际数据库密码 DB_SOCKET=你查询到的套接字路径
5. 清理Laravel配置缓存
注意修改.env后不要先执行config:cache,会固化旧配置,正确执行顺序:
php artisan config:clear php artisan cache:clear
确认配置生效后可执行php artisan config:cache生成生产环境缓存。
6. 测试迁移
执行迁移命令验证连接:
php artisan migrate
内容的提问来源于stack exchange,提问作者Scotty
相关产品推荐
相关产品推荐

