起因
今天在 ubuntu16.04 环境下通过 mysql workbench 访问远程数据库时, 发现无法连接问题, 解决思路及方法记录如下, 不足之处, 请多指教.
问题
通过 workbench 输入密码访问时报这个错:
Your connection attempt failed for user 'root' from your host to server at 118.89.153.162:3306: Access denied for user 'root'@'118.89.153.162' (using password: YES)
思路
网络问题, 更换网络之后重启 workbench 和 MySQL 服务进行连接, 依旧是这个错.
密码错误, 通过 ssh 远程登录服务器查看远程 mysql 的 password, 发现所填密码正确.
远程 mysql 没有访问权限, 一般有两种方法: 改表法和授权法 :
授权法:
第一步: 尝试打开 / etc/mysql/my.cnf 配置文件, 若文件不存在或者内容为空, 则打开下面的文件路径:
- sudo vim /etc/mysql/my.cnf
- // 或:
- sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
第二步: 在文件中查找下面一行, 如果该行前没有加 #, 可在该行前添加 #进行注释, 保存退出.
bind-address = 127.0.0.1
改表法:
- mysql>use mysql;
- mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION // 赋予任何主机访问以及修改所有数据的权限
- // 例如, 你想 root 用户使用 root 从任何主机连接到 mysql 服务器的话.
- //GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
- // 如果你想允许用户 root 从 ip 为 192.168.1.124 的主机连接到 mysql 服务器, 并使用 123456 作为密码
- //GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.124'IDENTIFIED BY '123456' WITH GRANT OPTION;
- mysql>flush privileges // 权限刷新, 使修改立即生效
- sudo /etc/init.d/mysql restart // 或: service mysql restart 重启 mysql 服务
两种方法我尝试了一下, 错误类型变成了:
Can't connect to MySQL server on ...
看到这个错误我想到了远程服务器防火墙的原因, 于是我有了下面的思路:
4. 远程 ubuntu 服务器的防火墙原因导致无法本地访问远程的 3306 端口
sudo ufw disable // 关闭防火墙, 该命令需在 root 权限下执行, 慎用
再次通过 workbench 连接远程 mysql, 连接成功.
原因
我的本地无法连接远程是因为远程 ubuntu 服务器防火墙默认禁止外部访问 3306 端口.
做法
- sudo ufw enable // 开启防火墙
- sudo ufw allow 3306 // 允许外部访问 3306 端口
总结
1. 一般的无法连接远程 mysql 问题是由上面四个愿意导致的, 这里不做赘述.
2. 在遇到一个问题时首先要做的不是立刻找做法解决这个问题, 而应该是思考为什么会出现这个问题, 产生这个问题的原因, 做到对症下药.
3. 自己还有很多不足, 戒骄戒躁才能进步.
附赠
Ubuntu 常用 ufw 防火墙命令
- // 安装方法
- sudo apt-get install ufw
- // 启用
- sudo ufw enable
- sudo ufw default deny // 开启了防火墙并随系统启动同时关闭所有外部对本机的访问, 本机访问外部正常.
- // 关闭
- sudo ufw disable
- // 查看防火墙状态
- sudo ufw status
- // 开启 / 禁用相应端口或服务举例
- sudo ufw allow 3306 // 允许外部访问 3306 端口
sudo ufw delete allow 3306 禁止外部访问 3306 端口
- sudo ufw allow from 118.89.153.162 // 允许此 IP 访问所有的本机端口
- sudo ufw deny smtp // 禁止外部访问 smtp 服务
- sudo ufw delete allow smtp // 删除上面建立的某条规则
- sudo ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 22 // 要拒绝所有的 TCP 流量从 10.0.0.0/8 到 192.168.0.1 地址的 22 端口
- // 推荐使用
- sudo apt-get install ufw
- sudo ufw enable
- sudo ufw default deny
参考博客: https://www.cnblogs.com/kluan/p/5993767.html
来源: https://www.cnblogs.com/lishanlei/p/8933269.html