检查 root 用户的权限
查看该用户针对这个数据库的权限
-- 如果在终端连接mysql时需要
mysql -u root -p
-- 查看用户权限
SELECT user, host FROM mysql.user WHERE user = 'root';
可以看的出来root有他的访问权限,如过没有localhost或者% 说明没有访问权限
添加权限
数据库权限包括:
SELECT:允许用户读取数据。
INSERT:允许用户插入数据。
UPDATE:允许用户更新数据。
DELETE:允许用户删除数据。
CREATE:允许用户创建数据库和表。
DROP:允许用户删除数据库和表。
ALTER:允许用户修改表结构。
INDEX:允许用户创建或删除索引。
EXECUTE:允许用户执行存储过程。
FILE:允许用户在服务器上读写文件。
GRANT OPTION:允许用户授予或撤销其他用户的权限。
如果需要如果允许所有机器那么用%,可以执行如下语句添加权限
分配权限语句:
GRANT 权限列表 ON 数据库.表 TO ‘用户名’@‘主机’;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
执行了GRANT语句后,你需要使用FLUSH PRIVILEGES;命令来使权限更改立即生效(尤其是在直接编辑MySQL的授权表后):
FLUSH PRIVILEGES;
重置root 密码
停止 MySQL 服务
sudo systemctl stop mysql
以安全模式启动 MySQL
sudo mysqld_safe --skip-grant-tables &
登录 MySQL(无需密码)
mysql -u root
重置 root 密码
USE mysql;
UPDATE user SET authentication_string=PASSWORD(‘new_password’) WHERE User=‘root’;
FLUSH PRIVILEGES;
EXIT;
重启 MySQL 服务
sudo systemctl restart mysql
root 用户已经允许从任意主机(%)和本地(localhost)登录,但仍然无法远程连接,
防火墙配置
检查服务器防火墙
确保服务器的防火墙允许 MySQL 端口(默认是 3306)的入站连接。例如
如果使用 ufw(Ubuntu):
sudo ufw allow 3306/tcp
如果使用 firewalld(CentOS):
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
检查云服务器安全组
如果使用云服务器(如 AWS、阿里云等),确保安全组规则允许从远程 IP 地址访问 MySQL 端口(3306)
MySQL 配置问题
检查 bind-address 配置
1、MySQL 默认只监听本地地址(127.0.0.1),需要修改配置以允许远程连接。
2、打开 MySQL 配置文件(通常是 /etc/my.cnf 或 /etc/mysql/my.cnf)。
找到 bind-address 配置项,将其改为 0.0.0.0(监听所有网络接口)或服务器的公网 IP 地址
[mysqld]
bind-address = 0.0.0.0
#保存文件并重启 MySQL 服务
sudo systemctl restart mysql
检查 skip-networking 配置
确保 MySQL 配置文件中没有启用 skip-networking。如果存在该配置项,将其注释或删除
#skip-networking