连接远程mysql数据库失败常见原因及解决办法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 1. 没有开启 MySQL 的远程登陆帐号。1.找到mysql数据库的user表。在user表中新建一条数据,设置User(username)和Host(开放访问MySQL的IP:例如123.118.17.201)以及登录密码。这样就设置了允许访问的用户名和IP地址(若想所有IP都可以访问,则可将Host设置为‘%’,但是这样很危险,不建议)。


1. 没有开启 MySQL 的远程登陆帐号。



1.找到mysql数据库的user表。在user表中新建一条数据,设置User(username)和Host(开放访问MySQL的IP:例如123.118.17.201)以及登录密码。这样就设置了允许访问的用户名和IP地址(若想所有IP都可以访问,则可将Host设置为‘%’,但是这样很危险,不建议)。

若想myuser使用mypassword从任何主机连接到mysql服务器

mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

若想仅允许用户myuser从ip为 123.57.20.21 的主机连接到mysql服务器,并使用mypassword作为密码

mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'123.57.20.21' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

2.修改完user表后执行 flush privileges 刷新权限。


2. 配置文件限制远程访问。



1.使用 ss -tlnp 命令查看网络接口开启状态

image.png

若如上图所示,或者没有开启3306端口。则mysql仅允许服务器本地访问。


2.打开 MySQL 配置文件 my.cnf(/etc/mysql/my.cnf)

找到

bind-address = 127.0.0.1

或者

skip-networking

直接注释掉,然后重启mysql。

skip-networking : 开启 skip-networking 选项可以彻底关闭MySQL的TCP/IP连接方式。

再使用 ss -tlnp 命令查看网络接口开启状态

image.png


3. iptables (防火墙) 限制了外部访问MySQL接口。



首先声明,此步骤修改要慎重,千万不要轻易使用sudo iptables -F命令清空iptables,很可能造成服务器拒绝所有端口访问(包括80端口,也就是服务器上的网站无法访问了),ssh断开连接(无法远程控制),只能通过重启服务器才能恢复正常。


1.使用 sudo iptables -L -n 查看iptables设置

%sudo iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:21
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

发现服务器仅开放了21(ftp),22(ssh),和80(http)端口。


2.修改 iptables

#将iptables配置存储到一个文件
%sudo iptables-save > ~/iptables.save
# 编辑这个文件
%sudo vim ~/iptables.save
# Generated by iptables-save v1.4.21 on Tue Sep 13 09:00:12 2016
*filter
:INPUT DROP [31186:1828159]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [73190648:74353549865]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Sep 13 09:00:12 2016

做出如下修改:

# Generated by iptables-save v1.4.21 on Tue Sep 13 09:00:12 2016
*filter
:INPUT DROP [31186:1828159]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [73190648:74353549865]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
#-s 后为允许访问的IP 
-A INPUT -p tcp -m tcp -s 123.57.20.21 --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp -s 123.57.20.21 --dport 3306 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Sep 13 09:00:12 2016
保存


3.将iptables.save中的配置应用到服务器的iptables中

%sudo cat ~/iptables.save | sudo iptables-restore
#(注意:这样修改iptables只能临时生效,重启服务器后会失效,要想永久生效,需要修改开机启动时iptables默认读取的文件)

此时使用 sudo iptables -L -n 查看iptables设置

%sudo iptables -L -n 
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:21
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  123.57.20.21         0.0.0.0/0            tcp dpt:3306
ACCEPT     tcp  --  123.57.20.21         0.0.0.0/0            tcp dpt:3306
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
存储 Go API
使用GoFrame连接和操作TDengine时序数据库
通过使用GoFrame框架和TDengine Go驱动,我们可以方便地连接和操作TDengine时序数据库。无论是插入、查询还是分析时序数据,都可以通过简单的API调用来实现。GoFrame提供了强大的Web开发功能,结合TDengine的高性能时序数据存储和查询能力,可以构建高效、可扩展的时序数据应用。
|
13天前
|
NoSQL 关系型数据库 PHP
php连接数据库
要使用PHP连接PolarDB或MongoDB数据库,需先准备连接信息,并编写相应代码。对于PolarDB,需设置主机地址、端口、数据库名及凭据,使用`pg_connect`函数建立连接;而对于MongoDB副本集,需安装MongoDB PHP驱动,通过`MongoDB\Client`连接指定的副本集实例。请确保替换示例代码中的占位符为实际值,并正确配置副本集名称和主机信息。更多详细信息与示例代码,请参考相关链接。
124 72
|
20天前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
Java开发者必知:JDBC连接数据库的“三大法宝”
17 7
|
22天前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
25天前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
42 3
|
26天前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
19天前
|
SQL 数据库 开发者
|
19天前
|
存储 SQL 数据库
自连接:数据库查询中的镜像技术
【8月更文挑战第31天】
9 0
|
26天前
|
关系型数据库 MySQL Java
【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error
【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error
|
3天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。