该系列的一部分:
如何对 MySQL 中的问题进行故障排除
本指南旨在作为诊断 MySQL 设置时的故障排除资源和起点。我们将讨论许多 MySQL 用户遇到的一些问题,并提供对特定问题进行故障排除的指导。我们还将包含指向 DigitalOcean 教程和官方 MySQL 文档的链接,这些链接可能在某些情况下有用。
许多网站和应用程序的 Web 服务器和数据库后端都托管在同一台机器上。但是,随着时间的推移,这样的设置会变得繁琐且难以扩展。一个常见的解决方案是通过设置远程数据库将这些功能分开,允许服务器和数据库在自己的机器上按自己的节奏增长。
用户在尝试设置远程 MySQL 数据库时遇到的更常见问题之一是他们的 MySQL 实例仅配置为侦听本地连接。这是 MySQL 的默认设置,但它不适用于远程数据库设置,因为 MySQL 必须能够侦听可以访问服务器的外部IP 地址。要启用此功能,请打开您的mysqld.cnf
文件:
- sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
导航到以bind-address
指令开头的行。它看起来像这样:
. . .
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
:
. . .
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
. . .
注意:在某些版本的 MySQLbind-address
中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
更改此行后,保存并关闭文件(CTRL + X
, Y
,ENTER
如果您使用 编辑它nano
)。
然后重新启动 MySQL 服务以使您所做的更改mysqld.cnf
生效:
- sudo systemctl restart mysql
如果您有一个现有的 MySQL 用户帐户,您打算使用该帐户从远程主机连接到数据库,则需要重新配置该帐户以从远程服务器而不是localhost进行连接。为此,请以您的 MySQL根用户或其他特权用户帐户打开 MySQL 客户端:
- sudo mysql
如果您为root启用了密码身份验证,则需要使用以下命令来访问 MySQL shell:
- mysql -u root -p
要更改用户的主机,您可以使用 MySQL 的RENAME USER
命令。运行以下命令,确保更改sammy
为您的 MySQL 用户帐户的名称和remote_server_ip
远程服务器的 IP 地址:
- RENAME USER 'sammy'@'localhost' TO 'sammy'@'remote_server_ip';
或者,您可以创建一个新的用户帐户,该帐户只能使用以下命令从远程主机连接:
- CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED BY 'password';
注意:此命令将创建一个使用 MySQL 的默认身份验证插件进行身份验证的用户caching_sha2_password
。但是,某些版本的 PHP 存在一个已知问题,可能会导致此插件出现问题。
如果您计划将此数据库与 PHP 应用程序(例如 phpMyAdmin)一起使用,您可能希望创建一个远程用户,该用户将使用旧的但仍然安全的mysql_native_password
插件进行身份验证:
- CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
如果您不确定,您始终可以创建一个用户,caching_sha2_plugin
然后ALTER
使用以下命令进行身份验证:
- ALTER USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
然后根据您的特定需要授予新用户适当的权限。下面的例子授予用户全局权限来CREATE
,ALTER
和DROP
数据库,表,和用户,以及权力INSERT
,UPDATE
以及DELETE
数据从服务器上的任何表。它还授予用户使用 查询数据SELECT
、使用REFERENCES
关键字创建外键以及FLUSH
使用RELOAD
特权执行操作的能力。但是,您应该只授予用户他们需要的权限,因此可以根据需要随意调整自己用户的权限。
- GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'remote_server_ip' WITH GRANT OPTION;
在此之后,运行该FLUSH PRIVILEGES
命令是一种很好的做法。这将释放服务器因上述CREATE USER
andGRANT
语句而缓存的任何内存:
- FLUSH PRIVILEGES;
然后就可以退出 MySQL 客户端了:
- exit
最后,假设您已经在数据库服务器上配置了防火墙,您还需要打开端口3306
——MySQL 的默认端口——以允许到 MySQL 的流量。
如果您只打算从一台特定的机器访问数据库服务器,您可以使用以下命令授予该机器独占权限以远程连接到数据库。确保替换remote_IP_address
为您计划连接的机器的实际 IP 地址:
- sudo ufw allow from remote_IP_address to any port 3306
如果您以后需要从其他机器访问数据库,您可以使用此命令临时授予他们访问权限。请记住包括他们各自的 IP 地址。
或者,您可以使用以下命令允许从任何IP 地址连接到 MySQL 数据库:
警告:此命令将使任何人都可以访问您的 MySQL 数据库。如果您的数据库包含任何敏感数据,请不要运行它。
- sudo ufw allow 3306
在此之后,尝试从另一台机器远程访问您的数据库:
注意:如果您添加了防火墙规则以仅允许来自特定 IP 地址的连接,您必须尝试使用与该地址关联的计算机访问数据库。
- mysql -u user -h database_server_ip -p
如果您能够访问您的数据库,则它确认bind-address
您的配置文件中的指令是问题所在。请注意,虽然,设置bind-address
到0.0.0.0
是不安全的,因为它允许从任何IP地址的服务器连接。另一方面,如果您仍然无法远程访问数据库,则可能是其他原因导致了问题。在任何一种情况下,您可能会发现遵循我们关于如何在 Ubuntu 18.04 上使用 MySQL 设置远程数据库来优化站点性能的指南来设置更安全的远程数据库配置会很有帮助。