在 CentOS + LAMP 环境下“连接不上 MySQL”是比较常见的问题,通常不是单一原因。下面按最常见原因 → 排查方法 → 解决方式来整理,你可以对照一步步检查。
systemctl status mysqld
# 或
systemctl status mariadb
systemctl start mysqld
systemctl enable mysqld
netstat -tunlp | grep 3306
# 或
ss -tunlp | grep 3306
常见问题:
127.0.0.1:3306 → 只能本机连0.0.0.0:3306 → 可远程连编辑配置文件:
vi /etc/my.cnf
# 或
vi /etc/my.cnf.d/server.cnf
找到:
bind-address = 127.0.0.1
改为:
bind-address = 0.0.0.0
重启 MySQL:
systemctl restart mysqld
firewall-cmd --list-all
允许 3306:
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
或临时关闭测试:
systemctl stop firewalld
getenforce
临时关闭:
setenforce 0
长期关闭(不推荐生产):
vi /etc/selinux/config
SELINUX=disabled
Access denied for user 'root'@'localhost'Unknown MySQL server hostSELECT user, host FROM mysql.user;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;
✅ 推荐:新建专用用户
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL PRIVILEGES ON dbname.* TO 'webuser'@'localhost';
mysqlipdo_mysqlphp -m | grep -i mysql
yum install php-mysqlnd
systemctl restart httpd
$conn = new mysqli("127.0.0.1", "webuser", "pass", "dbname");
❌ 错误示例:
localhost # 有时走 socket,容易出错
mysql -e "SHOW VARIABLES LIKE 'socket';"
PHP 中可指定:
new mysqli("localhost", "user", "pass", "db", 3306, "/var/lib/mysql/mysql.sock");
如果你愿意,可以把具体报错信息(如 PHP 报错、MySQL 报错、是否本地/远程)发出来,我可以直接帮你精准定位。