mysql远程登陆权限问题汇总,%和localhost

时间:2021-02-13 16:07:59

刚刚安装好mysql时,root用户是没有密码的,可以直接用 mysql -u root -p 然后回车登陆,用set password for root@localhost=password('root'); 将root用户密码设置为root。退出。重新登陆,输入密码root,进入mysql。至此mysql的root用户密码设置成功。


但是,如果我想用另一个ip来访问这个mysql,发现access denied。这是因为mysql默认不支持远程访问,需要给root用户输入以下命令


grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;

flush privileges;


这样给所有用户都赋予了远程登录root账户的权限,登陆的时候输入密码root即可。我们也可以创建一个别的账户hive,create user 'hive' identified by 'hive'; 然后也给予它权限,grant all privileges on *.* to 'hive'@'djt11' identified by 'hive'; 如果想让所有ip都能登陆,将djt11换成%即可。

我们这时可以来看看用户表,select host,user from mysql.user;

mysql远程登陆权限问题汇总,%和localhost

mysql远程登陆权限问题汇总,%和localhost

看起来很完美对吗?的确,通常这样设置后,也不会出现什么错误了。但是,如果我们足够细心的话,用不同的方式登陆,会发现很多不能理解的地方。


比如我这样登陆 mysql -h djt11 -u hive -p,然后输入密码,是可以登陆的,show databases可以看到root用户一样的界面

mysql远程登陆权限问题汇总,%和localhost

这是因为我们之前将mysql所有权限都赋予了hive用户。

如果我们这样登陆,mysql -u hive,发现这样是可以直接登陆mysql的,不需要输入密码。然而登陆进去以后show databases,却只能看到如下内容

mysql远程登陆权限问题汇总,%和localhost

我猜测这个登录方式可能是在刚刚创建hive用户时产生的,这时我们还没有给hive用户什么权限,所以登陆进来看到的界面跟root用户是不一样的。不过这个并不影响什么。


接下来我尝试了这样登陆, mysql -h djt11 -u hive,出现了错误提示

mysql远程登陆权限问题汇总,%和localhost

好像有点奇怪,为什么mysql -u hive可以登陆,而加个远程访问 -h djt11就不行了呢?这是因为我们之前的命令grant all privileges on *.* to 'hive'@'djt11' identified by 'hive';严格限制了用 -h djt11 登陆hive用户必须用密码。同样,我们还设置了‘hive’@‘%’,所以任何远程访问都必须要输入密码。mysql -u hive 这种登陆方式我们可以暂时不管,因为我们需要的就是hive用户拥有所有mysql权限,所以我们并不会用到mysql -u hive这种登陆方式,它也不会对我们的操作产生任何影响。远程访问时,老老实实输入 mysql -h djt11 -u hive -p然后输入密码即可。


那么,我们再回过头来看看用户表

mysql远程登陆权限问题汇总,%和localhost

mysql远程登陆权限问题汇总,%和localhost
mysql远程登陆权限问题汇总,%和localhost
mysql远程登陆权限问题汇总,%和localhost

root用户的host,有%、127.0.0.1、localhost、djt11,看上去无懈可击,怎么登陆都行。但其实有很多奇怪的地方。

比如我这样登陆,mysql -h djt11,发现不用输入密码也可以登陆root账户。这可能是因为之前grant权限时没有限定要输入密码,改过来即可。

同理,如果输入 mysql -h djt11 -u root也可以直接登陆,因为不输入-u root时默认登陆root账户,也是由于grant root@% 时没有限定要输入密码的问题。

但是,如果输入 mysql -h localhost -u root却发现不能直接登陆。输入 mysql -u root也不能直接登陆。很奇怪,既然grant root@%时没有限定要输入密码,为什么 -h djt11可以登陆, -h localhost就不行呢? “%”不是代表所有ip吗?


查询mysql官方文档可以发现,%并不包括localhost!!

所以,如果想同意远程访问和本地访问的访问方式,一定要分别对%和localhost进行授权!!

mysql远程登陆权限问题汇总,%和localhost


这样,无论是远程访问还是本地访问,都要 mysql -h djt11 -u root -p 输入密码登陆,djt11换成localhost也可以了。

这有什么好处呢?

当我们在搭建hadoop分布式集群时,会将mysql安装在其中一个节点上。如果用sqoop import一个数据表时,会涉及到登陆要不要密码的问题,如果没有上面这些设置,会出现各种错误。如果将%和localhost都设置好权限,则不会出现任何登陆权限问题。