故障现象
- 宝塔面板 phpMyAdmin 输入正确的 root 密码,提示无法登录
- 宝塔后台部分数据库管理功能失效
- WordPress 等网站数据库调用正常(通过 TCP 连接)
- 更新宝塔面板无效
故障特征:一个关键矛盾点
网站能正常访问数据库,但 phpMyAdmin 和宝塔面板不行。
这个矛盾直接指向问题不在 MySQL/MariaDB 本身,而在于连接方式的差异:
| 连接方式 | 使用方 | 状态 |
|---|---|---|
| TCP (127.0.0.1:3306) | WordPress 等 PHP 应用 | ✅ 正常 |
| Unix Socket (localhost) | phpMyAdmin、宝塔面板 | ❌ 失败 |
排查思路
第一步:确认数据库进程是否存活
ps aux | grep -E 'mysql|maria'
netstat -tlnp | grep 3306
如果进程在运行、端口在监听,说明数据库本身没挂。问题出在连接路径上。
第二步:验证 TCP 连接和密码
mysql -uroot -p'你的密码' -h 127.0.0.1 -P 3306
如果能连上,说明密码正确、TCP 通道正常。问题锁定在 socket 通道。
第三步:检查 socket 文件是否存在(根因定位)
ls -la /tmp/mysql.sock
# 或者检查配置文件中 socket 的路径
mysql -uroot -p -e "SHOW VARIABLES LIKE 'socket';"
如果 socket 文件不存在,这就是根因。
phpMyAdmin 默认配置 host = localhost,PHP 的 mysqli 驱动遇到 localhost 会走 Unix socket 而非 TCP。socket 文件一旦丢失,即使密码完全正确也无法连接。
第四步:确认 socket 为何丢失
# 检查 systemd-tmpfiles 定时器
systemctl status systemd-tmpfiles-clean.timer
systemctl list-timers systemd-tmpfiles-clean.timer
# 查看临时文件清理规则
cat /usr/lib/tmpfiles.d/tmp.conf | grep -i tmp
根因:systemd-tmpfiles-clean.timer 是系统自带的临时文件清理服务,默认每天运行一次,会清理 /tmp 目录下超过一定时间未被访问的文件。MariaDB 的 socket 文件放在 /tmp/mysql.sock,在数据库长时间运行且没有新的 socket 连接时,可能被判定为"陈旧文件"而删除。
修复方案
方案一:重启 MariaDB 重建 socket(立即修复)
# 通过 TCP 优雅关闭(避免 kill 导致数据损坏)
mysqladmin -uroot -p'你的密码' -h 127.0.0.1 shutdown
# 通过 init.d 脚本启动(会重建 socket 文件)
/etc/init.d/mysqld start
# 验证 socket 已重建
ls -la /tmp/mysql.sock
如果 systemd 服务状态显示 failed(init.d 脚本与 systemd 冲突导致),需要清理 systemd 状态:
systemctl reset-failed mysqld
方案二:修改 phpMyAdmin 配置走 TCP(绕过 socket)
编辑 phpMyAdmin 配置文件:
# 找到配置文件(宝塔环境路径类似如下)
find /www/server/phpmyadmin/ -name config.inc.php
修改 host 配置:
// 将 localhost 改为 127.0.0.1,强制走 TCP
$cfg['Servers'][$i]['host'] = '127.0.0.1';
这个方案能立即解决 phpMyAdmin 登录问题,但宝塔面板自身的数据库管理功能仍依赖 socket,所以建议两个方案配合使用。
方案三:添加 tmpfiles 规则防止 socket 再次被清理(根治)
# 创建排除规则,告诉 systemd-tmpfiles 不要清理 MySQL socket
cat > /etc/tmpfiles.d/mysql.conf << 'EOF'
# 保护 MariaDB/MySQL socket 不被 systemd-tmpfiles-clean 清理
x /tmp/mysql.sock
EOF
x 类型的规则表示"排除"——在清理时跳过匹配的文件。
验证清单
修复后逐项验证:
# 1. Socket 连接
mysql -uroot -p -e "SELECT 1;"
# 2. TCP 连接
mysql -uroot -p -h 127.0.0.1 -e "SELECT 1;"
# 3. 数据库完整性
mysql -uroot -p -e "SHOW DATABASES;" | wc -l
# 4. 网站可访问性
curl -o /dev/null -s -w "%{http_code}" http://你的网站域名/
# 5. phpMyAdmin 页面可访问
curl -o /dev/null -s -w "%{http_code}" http://127.0.0.1:888/phpmyadmin_路径/
# 6. systemd 服务状态
systemctl status mysqld
附:同类问题的其他常见原因
如果 socket 文件存在但 phpMyAdmin 仍无法登录,检查以下原因:
1. MySQL 8.0 认证插件不兼容
mysql -uroot -p -e "SELECT user, host, plugin FROM mysql.user WHERE user='root';"
如果 plugin 是 caching_sha2_password,phpMyAdmin 旧版本不兼容:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
2. 宝塔面板 root 密码与实际密码不同步
宝塔面板存储了一份 root 密码副本。如果通过命令行修改了 MySQL 密码但未同步到宝塔,phpMyAdmin 会使用旧密码导致认证失败。
解决: 宝塔面板 → 数据库 → 管理 → root 密码 → 重新设置(会同时更新 MySQL 和宝塔存储的密码)。
3. phpMyAdmin 访问授权限制
宝塔对 phpMyAdmin 有独立 IP 授权机制:
宝塔面板 → 网站 → phpMyAdmin → 访问授权 → 确保你的 IP 在允许列表中。
4. PHP session 目录不可写
# 检查 PHP session 保存路径
php -r "echo session_save_path() . PHP_EOL;"
# 如果为空或目录不存在,phpMyAdmin 的 cookie 认证会失败
总结
| 问题层级 | 现象 | 根因 | 解决 |
|---|---|---|---|
| 表层 | phpMyAdmin 密码正确无法登录 | socket 连接失败 | 改 host 为 127.0.0.1 |
| 中层 | 宝塔面板数据库功能异常 | systemd 服务状态 failed | reset-failed + 重启 |
| 根层 | socket 反复丢失 | systemd-tmpfiles-clean 清理 /tmp | 添加 /etc/tmpfiles.d/mysql.conf 排除规则 |
核心原则:看到"密码正确但无法登录",先区分 TCP 和 socket 两种连接路径,定位就会快很多。