5

如何允许远程访问 MySQL

 8 months ago
source link: https://blog.51cto.com/TiMi/9192160
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。 点击跳转到网站

如何允许远程访问 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 中,默认情况下该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 用户帐户,打算用于从远程主机连接到数据库,则需要重新配置该帐户以从远程服务器而不是localhost进行连接。则使用 MySQL root 用户或其他特权用户帐户打开 MySQL 客户端:

sudo mysql

如果root启用了密码身份验证,则需要使用以下命令来访问 MySQL shell:

mysql -u root -p

运行以下命令,确保更改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';

如果不确定,则可以创建一个用户进行身份验证,例如使用以下命令进行身份验证:(注意用户和IP)

ALTER USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';

然后根据特定需求授予新用户适当的权限。授权这玩意到处都用,下面是一个示例:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'remote_server_ip' WITH GRANT OPTION;

然后刷新权限:

FLUSH PRIVILEGES;

然后就可以退出MySQL客户端了:

exit

最后,假设已经在数据库服务器上配置了防火墙,打开了端口3306(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-address0.0.0.0不安全的,因为它允许从任何 IP 地址连接到服务器。另一方面,如果仍然无法远程访问数据库,则可能是其他原因导致了该问题。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK