天天看點

mysql遠端登陸權限問題彙總,%和localhost

剛剛安裝好mysql時,root使用者是沒有密碼的,可以直接用 mysql -u root -p 然後回車登陸,用set password for [email protected]=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

root使用者的host,有%、127.0.0.1、localhost、djt11,看上去無懈可擊,怎麼登陸都行。但其實有很多奇怪的地方。

比如我這樣登陸,mysql -h djt11,發現不用輸入密碼也可以登陸root賬戶。這可能是因為之前grant權限時沒有限定要輸入密碼,改過來即可。

同理,如果輸入 mysql -h djt11 -u root也可以直接登陸,因為不輸入-u root時預設登陸root賬戶,也是由于grant [email protected]% 時沒有限定要輸入密碼的問題。

但是,如果輸入 mysql -h localhost -u root卻發現不能直接登陸。輸入 mysql -u root也不能直接登陸。很奇怪,既然grant [email protected]%時沒有限定要輸入密碼,為什麼 -h djt11可以登陸, -h localhost就不行呢? “%”不是代表所有ip嗎?

查詢mysql官方文檔可以發現,%并不包括localhost!!

是以,如果想同意遠端通路和本地通路的通路方式,一定要分别對%和localhost進行授權!!

mysql遠端登陸權限問題彙總,%和localhost

這樣,無論是遠端通路還是本地通路,都要 mysql -h djt11 -u root -p 輸入密碼登陸,djt11換成localhost也可以了。

這有什麼好處呢?

當我們在搭建hadoop分布式叢集時,會将mysql安裝在其中一個節點上。如果用sqoop import一個資料表時,會涉及到登陸要不要密碼的問題,如果沒有上面這些設定,會出現各種錯誤。如果将%和localhost都設定好權限,則不會出現任何登陸權限問題。

繼續閱讀