![Can't Connect to MySQL Server on IP Address (10061) 错误的解决方案](https://kalacloud.com/static/ec10753d046e32ab397d2bda4155b339/ef245/head.jpg)
本文首发于卡拉云技术博客:[《MySQL ERROR 10061 错误的解决方案》](https://kalacloud.com/blog/can-t-connect-to-mysql-server-on-ipaddress-10061)
如果你打算从[远程连接 MySQL 服务器](https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/)的话,有可能会碰到 10061 错误,这个错误特别常见,通常的错误提示是「Driver Error, Can’t connect to MySQL server on ‘YOUR_IP_ADDRESS’ (10061)」
导致 10061 这个错误的情况有两种
- 登录账号远程访问权限问题
- MySQL 配置文件设置问题
本教程将详细讲解,如何针对这两种情况进行配置,以修正 10061 错误。
特别提示:关于如何打开 MySQL 远程访问功能,可看这篇《[如何远程连接 MySQL 数据库,阿里云腾讯云外网连接教程](https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/)》,如果想开启服务器可查看这份教程,本篇教程只讲开启后,为什么会出现 10061 错误。另外推荐一下卡拉云,只要你能写 SQL ,不会任何前端也可以用[卡拉云](https://kalacloud.com/)快速搭建属于自己的后台管理系统,详见本文文末
## 一. 授权登录 MySQL 服务器的账号远程访问权限
如果账号没有远程访问权限或 host 配置错误,会导致 10061 错误。我们可以新建一个账号用于远程登录,也可以修改已有账号的 host 配置,使它可以远程访问。
### 1. 新建用于远程登录的 MySQL 账号
MySQL 用户账号是否可以远程登录,取决于账号中的 **host** 配置。host 指定该账号在哪些主机上可以登录,如果是本地用户可用 **localhost,** 如果是远程用户,需要指定远程计算机的 IP,如果想任意主机均可登录,那么可以使用通配符 %
本教程使用通配符 % 来作为账号 host 的设置,你可以根据自己的情况将 % 改为指定主机 IP,这样可以是 MySQL 远程登录更加安全。
首先登录 MySQL Server
```
mysql -u root -p
```
然后新建一个用于远程登录的 MySQL 账号,这里的「password」换成你的密码,如果MySQL 设置为严格密码的话,需要「数字+英文大小写+符号」
```
CREATE USER 'kalacloud.com-remote'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
```
接着,根据自己的需要,给你用于远程访问的账号赋予权限。下面的例子是给账号全局权限,包括创建(`CREATE`)、修改(`ALTER`)、删除(`DROP`) 数据库、表、用户,任意表的插入(`INSERT`)、更新(`UPDATE`)、删除(`DELETE`)操作权限。可以使用 `SELECT` 查询数据,使用 `REFERENCES` 建立外键关系权限,以及使用 `RELOAD` 权限执行 `FLUSH` 操作的权限。
当然,你也可以根据自己都需求,对账号权限进行调整。
```
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'kalacloud.com-remote'@'%' WITH GRANT OPTION;
```
最后,运行 FLUSH PRIVILEGES 命令,刷新 MySQL 的系统权限相关表,更新缓存。
```
FLUSH PRIVILEGES;
```
扩展阅读:[最好用的 10 款 MySQL / MariaDB 管理工具横向测评](https://kalacloud.com/blog/best-mysql-gui-tools/) - 免费和付费到底怎么选?
### 2\. 将已有账号更改为可远程登录的账号
如果你不想新建账号,只是想沿用已经有的MySQL 登录账号,那么我们也可以直接把它改为可远程登录的账号。
首先,我们**查看 MySQL 所有账号**
```
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
```
![SELECT-DISTINCT-CONCAT](https://kalacloud.com/static/ccb3b9785d374e6f46bf20c1b0baf19f/c1b63/01-SELECT-DISTINCT-CONCAT.png)
接下来,我们把 `'kalacloud.com'@'localhost'` 这个账号改为可远程登录的账号。我们把这个账号 host 改为任意主机(%)或者是固定主机 ip 。可以使用 RENAME USER 命令来实现:
```
RENAME USER 'kalacloud.com'@'localhost' TO 'kalacloud.com'@'%';
```
执行后,再查看 MySQL 所有账号列表
```
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
```
![kalacloud-users-mysql](https://kalacloud.com/static/e6ce7b2ea4ec46507556e888b4316fcf/c1b63/02-kalacloud-users-mysql.png)
我们可以看到 `'kalacloud.com'@'localhost'` 已经变为 `'kalacloud.com'@'%'` 了。
**特别提示**:如果你使用的是 MySQL 8.0,使用这个账号远程登录可能会出现`caching_sha2_password` 报错,这是因为 MySQL 8.0 默认认证方式改为 `SHA2` 了,如果不支持 `SHA2` 插件认证方式,那么就会报错,比如使用 Workbench 和 Squel Pro 登录时,如下图。
```
MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/lib/plugin/caching_sha2_password.so, 2): image not found
```
![sequel-pro](https://kalacloud.com/static/ece301011f40bdbe1a5fb718096b3d42/e5166/03-sequel-pro.jpg)
我们可以把使用 `caching_sha2_plugin` 认证的`'kalacloud'@'%'`账号改为使用密码认证。
```
ALTER USER 'kalacloud.com'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
```
最后运行 `FLUSH PRIVILEGES`命令 刷新 MySQL 系统权限相关表,更新缓存
```
FLUSH PRIVILEGES;
```
至此,MySQL 远程登录账号部分就配置完成了,如果还是报 10061 错误,那么你还应该检查 MySQL 配置文件是否有问题。
扩展阅读:[MySQL Workbench 中文使用指南](https://kalacloud.com/blog/mysql-workbench-tutorial/)
## 二. 改 MySQL 配置文件
在默认情况下,MySQL 数据库仅监听本地连接。如果想让外网远程连接到数据库,我们需要修改配置文件,让 MySQL 可以监听远程固定 ip 或者监听所有远程 ip。
首先打开 `mysqld.cnf` 配置文件。
```
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
```
找到 bind - address 这一行,如下图所示。
![mysqld](https://kalacloud.com/static/d44f35877e139986a0d7d50efb26a099/6ed34/04-mysqld.jpg)
默认情况下, bind - address 的值为 127.0.0.1 ,所以只能监听本地连接。我们需要将这个值改为远程连接 ip 可访问,可使用通配符 ip 地址 `*`, `::`, `0.0.0.0` ,当然也可以是单独的固定 ip,这样就仅允许指定 ip 连接,更加安全。
![mysqld-bind-address](https://kalacloud.com/static/4b89be8dbd5e34ca7883d013eaa1de9f/6ed34/05-mysqld-bind-address.jpg)
提示:在某些 MySQL 版本的配置文件中,没有 bind - address 这一行,这种情况下,在合适的位置加上就可以了。
**提示:** 在某些 MySQL 版本的配置文件中,没有 bind - address 这一行,这种情况下,在合适的位置加上就可以了。
更改后,保存并退出编辑器(使用 CTRL+X 保存并退出 nano 编辑器。)
然后重启 MySQL 服务,使刚刚编辑的 `mysqld.cnf` 文件生效:
```
sudo systemctl restart mysql
```
扩展阅读:[如何在 MySQL / MariaDB 中查找和删除重复记录?](https://kalacloud.com/blog/mysql-remove-duplicate-records/)
## 三. 总结
到这里,只要你跟着教程走,一定已经解决了 MySQL 10061 错误。
MySQL 除了远程连接这类适合使用终端命令操作外,大多数对 MySQL / MariaDB 数据导入导出操作还是为了数据展示、分析、协同共享等产品和运营层面的应用场景。
比如后端工程师接到产品需求,协助导出某类数据等场景,如果这类需求频繁出现,推荐使用我开发的卡拉云。卡拉云是新一代低代码开发工具,免安装部署,可一键接入包括 MySQL 在内的常见数据库及 API。
卡拉云不仅可以像命令行一样灵活,还可根据自己的工作流,定制开发。无需繁琐的前端开发,只需要简单拖拽,即可快速搭建企业内部工具。**数月的开发工作量,使用卡拉云后可缩减至数天,[欢迎免费试用卡拉云](https://kalacloud.com/)。**
![卡拉云可快速接入的常见数据库及 API](https://kalacloud.com/static/18822b2a23183deb7d11dd484a7f65aa/71c1d/97-kalacloud-sql.png)
卡拉云可快速接入的常见数据库及 API
卡拉云可根据公司工作流需求,轻松搭建数据看板,并且可分享给组内的小伙伴共享数据
![仅需拖拽一键生成前端代码](https://kalacloud.com/5400a60956e16d655e0297c5d6e5a8d2/98-kalacloud-gif.gif)
仅需拖拽一键生成前端代码,简单一行代码即可映射数据到指定组件中。
![卡拉云快速搭建企业内部工具](https://kalacloud.com/static/34625d3adaea4ed250ff3f05b863e47c/cca35/99-kalacloud-sql-index.png)
卡拉云可直接添加导出按钮,导出适用于各类分析软件的数据格式,方便快捷。[立即开通卡拉云](https://kalacloud.com/?utm_medium=register),搭建属于自己的后台管理工具。
如果觉得我的文章对你有帮助,还请点个赞再走。欢迎评论区一起交流。
有疑问加站长微信联系(非本文作者))