如何允许远程访问MySQL

许多网站和应用程序从他们的Web服务器和数据库后端开始托管在同一台机器上。但是,随着时间的推移,这样的设置会变得很麻烦并且难以扩展。一个常见的解决方案是通过设置远程数据库来分离这些功能,允许服务器......

本系列的一部分: 如何解决MySQL中的问题

本指南旨在用作诊断MySQL设置时的故障排除资源和起点。 我们将讨论许多MySQL用户遇到的一些问题,并提供解决特定问题的指导。 我们还将包含指向DigitalOcean教程的链接以及在某些情况下可能有用的官方MySQL文档。

许多网站和应用程序从他们的Web服务器和数据库后端开始托管在同一台机器上。 但是,随着时间的推移,这样的设置会变得很麻烦并且难以扩展。 常见的解决方案是通过设置远程数据库来分离这些功能,从而允许服务器和数据库在自己的计算机上按照自己的进度增长。

用户在尝试设置远程MySQL数据库时遇到的一个常见问题是,他们的MySQL实例仅配置为监听本地连接。 这是MySQL的默认设置,但它不适用于远程数据库设置,因为MySQL必须能够监听可以访问服务器的外部 IP地址。 要启用此功能,请打开mysqld.cnf文件:

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

导航到以bind-address指令开头的行。 它看起来像这样:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
. . .

默认情况下,此值设置为127.0.0.1 ,这意味着服务器将仅查找本地连接。 您需要更改此指令以引用外部IP地址。 出于故障排除的目的,您可以将此指令设置为通配符IP地址, *::0.0.0.0

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 0.0.0.0
. . .

注意:如果您运行的是MySQL 8+,默认情况下bind-address指令不会出现在mysqld.cnf文件中。 在这种情况下,将以下突出显示的行添加到文件的底部:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
bind-address            = 0.0.0.0

更改此行后,保存并关闭该文件,然后重新启动MySQL服务:

sudo systemctl restart mysql

在此之后,尝试从另一台机器远程访问您的数据库:

mysql -u user -h database_server_ip -p

如果您能够访问数据库,则会确认配置文件中的bind-address指令是问题所在。 但请注意,将bind-address设置为0.0.0.0是不安全的,因为它允许从任何IP地址连接到您的服务器。 另一方面,如果您仍然无法远程访问数据库,则可能会出现其他问题。 在任何一种情况下,您可能会发现在Ubuntu 18.04上按照我们的如何设置远程数据库以使用MySQL优化站点性能的指南来设置更安全的远程数据库配置会很有帮助。