如何允许远程连接 MySQL 数据库服务器

2023-10-31

默认情况下,MySQL 服务器仅侦听来自本地主机的连接,这意味着它只能由同一主机上运行的应用程序访问。

然而,在某些情况下,需要从远程位置访问MySQL服务器。例如,您可能需要从本地系统或多服务器部署连接到远程 MySQL 服务器,其中应用程序与数据库服务器运行在不同的计算机上。一种选择是访问通过 SSH 隧道的 MySQL 服务器,另一个是配置MySQL服务器接受远程连接。

本文介绍了允许远程连接到 MySQL 服务器所需的步骤。相同的说明适用于 MariaDB。

配置 MySQL 服务器#

第一步是将MySQL服务器设置为侦听特定IP地址或机器上的所有IP地址。

如果MySQL服务器和客户端可以通过私有网络进行通信,最好的选择是将MySQL服务器设置为仅侦听私有IP。

否则,如果要通过公共网络连接到服务器,请将 MySQL 服务器设置为侦听计算机上的所有 IP 地址。为此,您需要编辑 MySQL 配置文件并添加或更改bind-address选项。您可以设置单个 IP 地址和 IP 范围。如果地址是0.0.0.0,MySQL 服务器接受所有主机 IPv4 接口上的连接。如果您的系统上配置了 IPv6,则无需0.0.0.0, use ::.

MySQL 配置文件的位置因发行版而异。在 Ubuntu 和 Debian 中,该文件位于/etc/mysql/mysql.conf.d/mysqld.cnf,而在基于 Red Hat 的发行版(例如 CentOS)中,该文件位于/etc/my.cnf.

使用您的打开文件文本编辑器 :

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

搜索以以下内容开头的行bind-address并将其值设置为 MySQL 服务器应侦听的 IP 地址。

默认情况下,该值设置为127.0.0.1(仅在本地主机中侦听)。

在此示例中,我们将设置 MySQL 服务器以侦听所有 IPv4 接口,方法是将值更改为0.0.0.0

mysqld.cnf
bind-address           = 0.0.0.0
# skip-networking

如果有一行包含skip-networking,删除它或通过添加注释掉它#在该行的开头。

在 MySQL 8.0 及更高版本中,bind-address指令可能不存在。在这种情况下,将其添加到[mysqld]部分。

完成后,重新启动 MySQL 服务以使更改生效。仅 root 或具有以下权限的用户sudo权限可以重启服务。

要在 Debian 或 Ubuntu 上重新启动 MySQL 服务,请键入:

sudo systemctl restart mysql

在基于 RedHat 的发行版(例如 CentOS)上重新启动服务运行:

sudo systemctl restart mysqld

从远程计算机授予用户访问权限#

下一步是允许远程用户访问数据库。

以 root 用户身份登录 MySQL 服务器,输入:

sudo mysql

如果您使用旧的本机 MySQL 身份验证插件以 root 身份登录,请运行以下命令并在出现提示时输入密码:

mysql -uroot -p

从 MySQL shell 内部,使用GRANT声明给授予访问权限给远程用户。

GRANT ALL ON database_name.* TO user_name@'ip_address' IDENTIFIED BY 'user_password';

Where:

  • database_name是用户将连接到的数据库的名称。
  • user_name是 MySQL 用户的名称。
  • ip_address is the IP地址用户将从其中进行连接。使用%允许用户从任何 IP 地址进行连接。
  • user_password是用户密码。

例如,授予对数据库的访问权限dbname给一个名为foo有密码my_passwd从具有 IP 的客户端计算机10.8.0.5,你会运行:

GRANT ALL ON dbname.* TO foo@'10.8.0.5' IDENTIFIED BY 'my_passwd';

配置防火墙#

最后一步是配置防火墙以允许端口上的流量3306(MySQL 默认端口)来自远程计算机。

iptables#

如果您正在使用iptables作为您的防火墙,以下命令将允许从 Internet 上的任何 IP 地址访问 MySQL 端口。这是非常没有安全感的。

sudo iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT

允许来自特定IP地址的访问:

sudo iptables -A INPUT -s 10.8.0.5 -p tcp --destination-port 3306 -j ACCEPT

UFW #

UFW是Ubuntu中默认的防火墙工具。要允许从 Internet 上的任何 IP 地址进行访问(非常不安全),请运行:

sudo ufw allow 3306/tcp

允许来自特定IP地址的访问:

sudo ufw allow from 10.8.0.5 to any port 3306

防火墙D#

防火墙D是CentOS中默认的防火墙管理工具。要允许从 Internet 上的任何 IP 地址进行访问(非常不安全),请输入:

sudo firewall-cmd --permanent --zone=public --add-port=3306/tcpsudo firewall-cmd --reload

要允许从特定端口上的特定 IP 地址进行访问,您可以创建新的 FirewallD 区域或使用丰富的规则。我们创建一个名为的新区域mysqlzone:

sudo firewall-cmd --new-zone=mysqlzone --permanentsudo firewall-cmd --reloadsudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.8.0.5/32sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcpsudo firewall-cmd --reload

验证更改#

要验证远程用户是否可以连接到 MySQL 服务器,请运行以下命令:

mysql -u user_name -h mysql_server_ip -p

Where user_name是您授予访问权限的用户的名称,并且mysql_server_ip是MySQL服务器运行的主机的IP地址。

如果一切设置正确,您将能够登录远程 MySQL 服务器。

如果您收到如下错误,那么3306端口未开放,或者 MySQL 服务器不是监听IP地址 .

ERROR 2003 (HY000): Can't connect to MySQL server on '10.8.0.5' (111)"

以下错误表明您尝试登录的用户没有访问远程 MySQL 服务器的权限。

"ERROR 1130 (HY000): Host ‘10.8.0.5’ is not allowed to connect to this MySQL server" 

结论#

MySQL 是默认情况下最流行的开源数据库服务器,仅侦听本地主机上的传入连接。

要允许远程连接MySQL服务器,您需要执行以下步骤:

  1. 配置 MySQL 服务器以侦听所有或特定接口。
  2. 授予远程用户访问权限。
  3. 在防火墙中打开 MySQL 端口。

如果您有疑问,请随时在下面发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何允许远程连接 MySQL 数据库服务器 的相关文章

  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • MySQL 存储过程将值分配给 select 语句中的多个变量

    这是我的存储过程 我在为声明的变量赋值时遇到问题 当我执行它时 插入和更新命令工作正常 但声明变量的值保持为 0 但我在数据库中有一些价值 我怎样才能正确地做到这一点 BEGIN DECLARE PaidFee INT DEFAULT 0
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 比特纳米。重置mysql根密码

    我如何重置 MySQL 中的 root 密码和帐户 因为我按照如何为其他服务器授予权限的说明操作 并且意外地将 root 用户 Mysql 绑定到其他 IP 地址 现在看来我无法在 localhost 上以管理员身份登录 Thanks 您有
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen

随机推荐

  • 如何在 Linux 中编译和安装最新的 Redis

    Redis 是一种开源内存数据结构存储 可用作数据库 缓存和消息代理 它以其高性能 可扩展性和易用性而闻名 在本文中 我们将指导您完成在 Linux 上编译和安装最新 Redis 版本的过程 在开始之前 请确保您拥有 Linux 服务器的管
  • 如何计算 Linux 中文件的行数

    有时您可能需要计算 Unix Linux 系统中文件的总行数 本教程帮助您通过命令行使用多种方法来统计 Linux 系统中文件的行数 计算行数wc Command The wc命令是 Unix Linux 系统的 字计数器 这是 Linux
  • 检查脚本是否在 Linux 中以 root 用户身份运行

    有时 shell 脚本需要以 root 用户身份运行才能以管理员权限执行某些任务 通常 可以使用 Sudo 命令来完成该任务 如果在某些情况下您仍然需要强制用户以 root 用户身份运行脚本 您可以向脚本添加代码来检查脚本是否以 root
  • 如何在 CentOS/RHEL 7.5 和 6.9 上安装 PHP 7.2、Apache 2.4、MySQL 5.6

    PHP团队已经发布了升级版本7 2 与 5 X 版本相比 它有许多变化和改进 本文将帮助您在 CentOS RHEL 7 6 操作系统上安装 PHP 7 Apache 2 4 和 MySQL 5 6 本教程已在CentOS 7 4上进行测试
  • 如何清除 Windows 中的 ASP.NET 临时文件

    开发 ASP NET 应用程序时 框架会编译并存储临时文件以提高性能 随着时间的推移 这些文件可能会累积并占用大量存储空间 定期清除 ASP NET 临时文件可以帮助维护您的开发环境并释放宝贵的磁盘空间 本文提供了有关如何在 Windows
  • 允许 ssm:GetParameter 的 AWS IAM 策略

    AWS Systems Manager SSM Parameter Store 提供集中式安全存储解决方案 用于管理您的配置数据 机密和应用程序设置 使用 SSM Parameter Store 时可能执行的关键操作之一是检索参数的值 在本
  • PHP 技巧:使用分隔符将字符串拆分为数组

    在 PHP 中 将字符串拆分为数组是一项常见任务 可以使用各种函数和技术来完成 这 explode 函数是一个方便高效的选项 它允许您根据分隔符将字符串拆分为数组 在本文中 我们将探讨如何在 PHP 中使用explode 函数将字符串拆分为
  • Visual Studio Code 中 Git 集成的快捷方式

    Git 是一种流行的版本控制系统 开发人员使用它来跟踪代码更改并与其他人在项目上进行协作 Visual Studio Code VS Code 具有内置的 Git 集成 可以轻松地直接从编辑器管理和提交更改 在本文中 我们将讨论 Visua
  • 如何通过 SSH 下载和上传文件

    SSH 是访问远程服务器最安全的协议 它通过通信通道提供最高级别的端到端数据安全性 这SCP 安全复制 命令使用 SSH 协议在远程和本地服务器之间复制文件 远程服务器必须有正在运行的 SSH 服务器 本教程将帮助您了解通过 SSH 协议下
  • 如何在 CentOS/RHEL 7 上创建没有 Shell 访问权限的 SFTP 用户

    本教程将帮助您在 CentOS 和 RedHat 系统上创建仅 SFTP 用户 无 ssh 访问权限 用户只能通过SFTP访问连接服务器 并允许访问指定目录 用户无法通过 SSH 访问服务器 按照以下教程创建仅限 sftp 的帐户 第 1
  • 如何在 Linux 中编译和运行 C/C++ 程序

    C 是一种强大的结构化编程语言 用于开发系统软件 根据设计 C 提供了可以有效映射到典型机器指令的结构 它是由丹尼斯 里奇在贝尔实验室 C 程序源是自由格式的文本 使用分号作为语句终止符 使用大括号对条件 函数或循环等语句块进行分组 C 是
  • 如何在 CentOS 7 上安装 Drupal

    Drupal 是全球领先的开源 CMS 平台之一 它灵活 可扩展 可用于构建不同类型的网站 从小型个人博客到大型企业 政治和政府网站 在本教程中 我们将解释如何在 CentOS 7 上安装 Drupal 8 6 安装 Drupal 的方法有
  • 如何删除 Docker 容器、映像、卷和网络

    Docker 是一个开源容器化平台 允许您快速构建 测试和部署应用程序作为几乎可以在任何地方运行的便携式容器 使用 Docker 时 您可以快速积累大量未使用的对象 这些对象会消耗大量磁盘空间并使 Docker 命令生成的输出变得混乱 Do
  • 如何删除 Git 中未跟踪的文件

    Git 工作目录中的文件可以是跟踪的 也可以是非跟踪的 跟踪的文件是 Git 知道的已添加和提交的文件 跟踪的文件可以是未修改的 已修改的或暂存的 工作目录中的所有其他文件都未被跟踪 并且 git 不知道这些文件 有时 您的 git 工作目
  • 如何在 Bash 中逐行读取文件

    在编写 Bash 脚本时 有时您会发现自己需要逐行读取文件 例如 您可能有一个文本文件 其中包含应由脚本处理的数据 在本教程中 我们将讨论如何在 Bash 中逐行读取文件 逐行读取文件语法 逐行读取文件的最通用语法如下 while IFS
  • 如何在 CentOS 8 上安装 MySQL

    MySQL是最流行的开源关系数据库管理系统 最新版本的 MySQL 数据库服务器 8 0 版可从默认的 CentOS 8 存储库安装 MySQL 8 0引入了许多新功能和更改 这使得一些应用程序与该版本不兼容 在选择要安装的 MySQL 版
  • 如何在 Python 中删除(移除)文件和目录

    Python 有一些内置模块 允许您删除文件和目录 本教程介绍如何使用以下函数删除文件和目录os pathlib and shutil模块 删除文件 在Python中你可以使用os remove os unlink pathlib Path
  • 如何在CentOS上安装RPM包

    RPM 是 Red Hat 及其衍生产品 例如 CentOS 和 Fedora 使用的打包系统 CentOS 官方存储库包含数千个 RPM 软件包 可以使用yum命令行实用程序 通过启用适当的存储库 可以轻松安装标准 CentOS 存储库中
  • 如何在 Ubuntu 18.04 上安装 MongoDB

    MongoDB 是一个免费的开源文档数据库 它属于 NoSQL 数据库家族 与 MySQL 和 PostgreSQL 等传统的基于表的 SQL 数据库不同 在 MongoDB 中 数据存储在灵活的 类似 JSON字段可能因文档而异的文档 它
  • 如何允许远程连接 MySQL 数据库服务器

    默认情况下 MySQL 服务器仅侦听来自本地主机的连接 这意味着它只能由同一主机上运行的应用程序访问 然而 在某些情况下 需要从远程位置访问MySQL服务器 例如 您可能需要从本地系统或多服务器部署连接到远程 MySQL 服务器 其中应用程