许多网站和应用程序一开始都将网络服务器和数据库后台托管在同一台机器上。然而,随着时间的推移,这样的设置会变得繁琐且难以扩展。一种常见的解决方案是通过建立远程数据库来分离这些功能,让服务器和数据库在各自的机器上以自己的速度发展。
用户在尝试建立远程 MySQL 数据库时遇到的一个比较常见的问题是,他们的 MySQL 实例只配置为侦听本地连接。这是 MySQL 的默认设置,但它不适用于远程数据库设置,因为 MySQL 必须能够监听服务器可以到达的外部 IP 地址。要启用此功能,请打开 mysqld.cnf
文件:
1sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
导航至以 bind-address
指令开头的一行。如下所示
1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2. . .
3lc-messages-dir = /usr/share/mysql
4skip-external-locking
5#
6# Instead of skip-networking the default is now to listen only on
7# localhost which is more compatible and is not less secure.
8bind-address = 127.0.0.1
9. . .
默认情况下,该值设置为 "127.0.0.1",这意味着服务器将只寻找本地连接。您需要更改此指令以引用外部 IP 地址。为了排除故障,可以将此指令设置为通配符 IP 地址,如 *
、::
或 0.0.0.0
:
1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2. . .
3lc-messages-dir = /usr/share/mysql
4skip-external-locking
5#
6# Instead of skip-networking the default is now to listen only on
7# localhost which is more compatible and is not less secure.
8bind-address = 0.0.0.0
9. . .
<$>[注] 注意: 在某些版本的 MySQL 中,"bind-address "指令可能默认不在 "mysqld.cnf "文件中。在这种情况下,请在文件底部添加以下突出显示行:
1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2. . .
3[mysqld]
4pid-file = /var/run/mysqld/mysqld.pid
5socket = /var/run/mysqld/mysqld.sock
6datadir = /var/lib/mysql
7log-error = /var/log/mysql/error.log
8bind-address = 0.0.0.0
<$>
更改这一行后,保存并关闭文件(CTRL + X
, Y
, 然后ENTER
,如果用nano
编辑的话)。
然后重启 MySQL 服务,使对 mysqld.cnf
所做的更改生效:
1sudo systemctl restart mysql
如果你有一个现有的 MySQL 用户账户,而你打算用它从远程主机连接数据库,你需要重新配置该账户,以便从远程服务器而不是本地主机 连接。为此,请以** 根** MySQL 用户或其他有权限的用户账户打开 MySQL 客户端:
1sudo mysql
如果已为 root 启用密码验证,则需要使用以下命令来访问 MySQL shell:
1mysql -u root -p
要更改用户的主机,可以使用 MySQL 的 RENAME USER
命令。运行以下命令,确保将 sammy
改为 MySQL 用户账户的名称,将 remote_server_ip
改为远程服务器的 IP 地址:
1RENAME USER 'sammy'@'localhost' TO 'sammy'@'remote_server_ip';
或者,你也可以使用以下命令创建一个只能从远程主机连接的新用户账户:
1CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED BY 'password';
<$>[注] 注意 :此命令将创建一个使用 MySQL 默认身份验证插件 "caching_sha2_password "进行身份验证的用户。但是,某些版本的 PHP 存在一个已知问题,可能会导致该插件出现问题。
如果您打算在 PHP 应用程序(例如 phpMyAdmin)中使用该数据库,您可能需要创建一个远程用户,使用旧版本的 "mysql_native_password "插件(虽然仍然安全)进行身份验证:
1CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
如果不确定,可以先创建一个使用 caching_sha2_plugin
进行身份验证的用户,然后使用此命令对其进行 ALTER
操作:
1ALTER USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
<$>
然后根据具体需要授予新用户相应的权限。下面的示例授予用户创建
、更改
和删除
数据库、表和用户的全局权限,以及从服务器上的任何表中插入
、更新
和删除
数据的权力。它还赋予用户使用 SELECT
查询数据、使用 REFERENCES
关键字创建外键和使用 RELOAD
权限执行 FLUSH
操作的能力。不过,你应该只授予用户他们所需的权限,所以你可以根据需要调整自己用户的权限。
1GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'remote_server_ip' WITH GRANT OPTION;
在此之后,最好运行 FLUSH PRIVILEGES
命令。这将释放服务器因前面的 CREATE USER
和 GRANT
语句而缓存的内存:
1FLUSH PRIVILEGES;
然后退出 MySQL 客户端:
1exit
最后,假设您已在数据库服务器上配置了防火墙,您还需要打开端口 3306
- MySQL 的默认端口 - 以允许 MySQL 的流量。
如果只计划从一台特定机器访问数据库服务器,则可以使用以下命令授予该机器远程连接数据库的独占权限。确保将 remote_IP_address
替换为计划连接的机器的实际 IP 地址:
1sudo ufw allow from remote_IP_address to any port 3306
如果将来需要从其他机器访问数据库,可以使用此命令临时授予它们访问权限。只需记住包含它们各自的 IP 地址即可。
另外,您也可以使用以下命令允许从_any_ IP 地址连接到 MySQL 数据库:
<$>[警告] 警告 :此命令将允许任何人访问您的 MySQL 数据库。** 如果您的数据库存有任何敏感数据,请勿** 运行该命令。 <$>
1sudo ufw allow 3306
然后,尝试从另一台机器远程访问数据库:
<$>[注] 注意 :如果添加了防火墙规则,只允许来自特定 IP 地址的连接,则必须尝试使用与该地址相关联的机器访问数据库。 <$>
1[environment second]
2mysql -u user -h database_server_ip -p
如果您能访问数据库,就说明配置文件中的 bind-address
指令出现了问题。但请注意,将 "bind-address "设置为 "0.0.0.0 "是不安全的,因为它允许从任何 IP 地址连接到服务器。另一方面,如果您仍然无法远程访问数据库,那么可能是其他原因造成的。无论哪种情况,你都可以参考我们的指南如何在 Ubuntu 18.04 上使用 MySQL 设置远程数据库以优化网站性能,设置更安全的远程数据库配置。