我通常会正确设置 MySQL 以实现远程访问。
但是目前我遇到了 MySQL 8 的问题。
首先,在 mysql.conf.d/mysqld.cnf 文件中,我没有任何 bind-address 行,所以我手动添加了它 (bind-address 0.0.0.0) 并授予了 '%' 用户的访问权限。
当我连接时,收到了 "身份验证失败" 的消息。
但在本地主机/命令行上却可以正常工作。
我通常会正确设置 MySQL 以实现远程访问。
但是目前我遇到了 MySQL 8 的问题。
首先,在 mysql.conf.d/mysqld.cnf 文件中,我没有任何 bind-address 行,所以我手动添加了它 (bind-address 0.0.0.0) 并授予了 '%' 用户的访问权限。
当我连接时,收到了 "身份验证失败" 的消息。
但在本地主机/命令行上却可以正常工作。
my.ini
文件中删除或注释掉bind_address
参数。(该文件名因操作系统而异。在Linux上,
my.ini
实际上是位于目录/etc/mysql/下的my.cnf文件。)
创建root
用户(是新用户,因为现有的用户是'root@localhost',仅限本地访问):
CREATE USER 'root'@'%' IDENTIFIED BY '123';
赋予权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
对于DBA用户,在末尾添加
WITH GRANT OPTION
。例如:
CREATE USER 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
因为使用 CREATE with GRANT 没有效果吗?
MySQL 8不能再使用GRANT
创建用户,因此如果您尝试与GRANT
一起使用IDENTIFIED BY '123'
,则会出现错误,这是最常见的错误。
WITH GRANT OPTION
子句不适用于CREATE USER
语句,而适用于GRANT
语句。 - malloc4kMySQL 8中的远程访问:
1) 允许任意主机访问
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
2) 允许用户从任何地方访问:
mysql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
UPDATE mysql.user SET host='%' WHERE user='root';
3) 更改认证方式为密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ThePassword';
root
账户进行这样的操作,否则这只会打开另一个攻击向量。创建一个新账户,仅授予其所需的访问权限,而不是使用超级用户(SUPER User)。 - RiggsFollysudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
修改或添加 bind-address 选项:
[mysqld]
bind-address = 0.0.0.0
重启 mysql 服务
sudo service mysql restart