(先吐槽一下,为啥CSDN博客的标题里的双引号和单引号总不能正常显示,这个太扯了)
这个博客也觉得挺无语的。由于实验需要,临时在一台笔记本上装了MySQL 8.0.22-0ubuntu0.20.04.3 (Ubuntu),结果发现不能从远程连接,报:
pymysql.err.OperationalError: (1130, "192.168.0.113' is not allowed to connect to this MySQL server") 这种错(我这里也不隐藏用户名密码IP之类的了,因为都是内网,也仅仅是为了做实验用),结果网上大部分教程是类似于这么说的:
2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY
'mypassword' WITH GRANT OPTION;
结果我尝试运行了:
GRANT ALL PRIVILEGES ON *.* TO 'vulclone'@'%' IDENTIFIED BY '1234' with grant option;
类似于这样的命令,结果MySQL报:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '1234' with grant option' at line 1
真的是太奇怪了,但是看网上的哥们都是这样说的,例如这里:https://blog.csdn.net/july_2/article/details/41896295
另外,像这里的底下评论也是这么说的:https://blog.csdn.net/weixx3/article/details/80782479
以及:https://www.cnblogs.com/xbxxf/p/9174028.html
又费劲找了找,终于发现了原因:https://blog.csdn.net/lizz2276/article/details/111312815
https://blog.csdn.net/a2814282061/article/details/108208070
而MySQL8.0及之后的,设置远程连接权限要用下面的语句才可以。
所以正确的做法如下(假设我想使用vulclone这个用户名,密码1234从内网中的任意IP访问):
create user vulclone@'%' identified by '1234';grant all privileges on *.* to vulclone@'%' with grant option;
执行完了之后我们可以通过下列方法查看结果:
use mysql;select host,user from user;
下面截图是我这里返回的结果:
注意最上面那个百分号才表示了可以从任意IP访问。当然,在尝试这些的同时我还进行了以下操作,所以有可能大家也需要都执行一下:
确定MySQL的端口是不是3306:
show global variables like 'port';
打开配置文件:
sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf
然后注释掉了这两个配置(这是注释以后的样子):
# 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
# mysqlx-bind-address = 127.0.0.1
然后再重启了MySQL服务(不确定是不是必须要重启,但是这些步骤都尝试过一遍):
service mysql restart
说实话,MySQL这个update还是挺坑的。
如果大家也用Python,可以用类似于下面的代码检查是否配置成功:
import pymysqlconn = pymysql.connect(host="192.168.0.123",user="vulclone",password="1234",database="vulclonedb",charset="utf8")
cursor = conn.cursor()
sql = "SELECT current_user;"
cursor.execute(sql)
ret = cursor.fetchone()
print(ret)
cursor.close()
conn.close()
另外,在Ubuntu上彻底删除MySQL可以参考这里:https://www.cnblogs.com/duolamengxiong/p/13650684.html
查看本机的IP可以参考这里:https://blog.csdn.net/zhangvalue/article/details/80270169