溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中怎么獲取權(quán)限信息

發(fā)布時間:2021-07-26 11:22:21 來源:億速云 閱讀:140 作者:Leah 欄目:MySQL數(shù)據(jù)庫

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)MySQL中怎么獲取權(quán)限信息,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

    最近在做一次MySQL數(shù)據(jù)遷移的時候,突然發(fā)現(xiàn)自己遺漏了一個地方,那就是權(quán)限信息沒有導出,如果我們使用mysqldump --all-databases的時候沒有添加--flush-privileges的時候,導出的數(shù)據(jù)中是不會包含mysql數(shù)據(jù)庫的。

   而我其實是比較懶的,不想因為這個重新導出一次,那么我就有幾種方式選擇。

   如果在MySQL 5.5,5.6的版本中,我可以直接導出mysql.user的數(shù)據(jù)即可。

   如果使用腳本化完成,基本是這樣的形式即可,本意其實就是show grants for 'xxx'的組合形式,不斷拼接解析。

mysql -e "SELECT DISTINCT CONCAT('show grants for ','''',user,'''@''',host,'''',';') AS query FROM mysql.user where user!='root'" | grep -v query >/tmp/showgrants.sql && mysql </tmp/showgrants.sql | egrep -v 'Grants for|query'

    運行后的語句大體是如下的形式:

GRANT ALL PRIVILEGES ON *.* TO 'adm'@'localhost' IDENTIFIED BY PASSWORD '*3DCFB64FE0CB05D63B9AF64492B5CD6269D82EE8'
GRANT ALL PRIVILEGES ON `Cyou_DAS`.* TO 'adm'@'localhost'
GRANT USAGE ON *.* TO ''@'mysqlactivity'

    這一招在5.5,5.6中都是可行的,但是遷移的數(shù)據(jù)庫是5.7的,看到下面導出的語句,我感覺不對勁,難道都不要密碼,如果確實沒有,這是一個多么大的坑。

GRANT USAGE ON *.* TO 'phplamp'@'localhost'
GRANT ALL PRIVILEGES ON `phplampDB`.* TO 'phplamp'@'localhost'    我知道5.7做了一些改進,本身對于show grants也有一些限制,沒想到真碰上這種情況,教訓是如此的深刻。

    所以回到問題,如果現(xiàn)在要解決,就有大體的三種方式來同步權(quán)限;
方法1:重新導出導入整個數(shù)據(jù)庫    不評論,我絕對不會這么做,只是看起來是一個完整的過程,但是無用功太多,很容易被鄙視
方法2:導出mysql的權(quán)限配置    如果是在5.5,5.6的環(huán)境,直接導出mysql.user表數(shù)據(jù)即可,但是在5.7中可不行,一種方式就是導出整個mysql庫的數(shù)據(jù)
方法3:pt工具導出         使用自定義腳本或者pt工具來導出權(quán)限信息

當然解決方法很多,我就說說方法2,方法3

我對比了5.6和5.7 的表結(jié)構(gòu)情況。不看不知道,一看差別還真不小。

MySQL 5.7的mysql.user表含有45個字段
MySQL 5.6的mysql.user表含有43個字段

這是表面現(xiàn)象,不是5.7多兩個字段這么簡單,真實情況如下:

1) MySQL5.7中多了下面的3個字段,字段和數(shù)據(jù)類型如下:

 password_last_changed  | timestamp            
 password_lifetime      | smallint(5) unsigned
 account_locked         | enum('N','Y') 
2)這么一看總數(shù)對不上,這是因為MySQL 5.7相比5.6少了password字段

3)還有個細節(jié)可能被忽略,那就是MySQL 5.7的字段user相比MySQL 5.6長度從16字符增長到了32字符。

   這就奇怪了,為什么沒有了password字段呢,沒有了password字段,這個功能該怎么補充呢

MySQL5.6中查看mysql.user的數(shù)據(jù)結(jié)果如下:

> select user,password,authentication_string from mysql.user;               
| user           | password               | authentication_string |
| app_live_im    | *E96DB97255EF3ED52454A10EDA1AE7BABC8D3700 |    |
| mysqlmon       | *0571D080430BC7B60A3F4D41A8D71501E6B8FDAA |    | 而在MySQL 5.7中,結(jié)果卻有所不同

+-----------------+-------------------------------------------+
| user            | authentication_string                     |
+-----------------+-------------------------------------------+
| gym             | *0CD6502815166F2C7E17B630C3248B900065FCEA |
| actv_test       | *82A4DC7B3F5E73E822529E9EF4DE8C042253445A |一個重要差別就在于mysql.user表的字段值 plugin

 max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N
 password_last_changed: 2016-11-09 11:38:39
     password_lifetime: 0

 基于這個安全策略,可以做很多的事情,5.7默認就是這種模式。

   看起來之前的那種show grants得到的信息很有限,那么我們來看看pt工具的效果,直接運行./pt-show-grants即可

-- Grants for 'webadmin'@'10.127.8.207'                             
CREATE USER IF NOT EXISTS 'webadmin'@'10.127.8.207';  
ALTER USER 'webadmin'@'10.127.8.207' IDENTIFIED WITH 'mysql_native_password' AS '*DA43F144DD67A3F00F086B0DA1288C1D5DA7251F' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT ALL PRIVILEGES ON *.* TO 'webadmin'@'10.127.xx.xx';            

 這樣的語句相對來說就是完整的,使用show grants的結(jié)果少了很多,只包含基本的權(quán)限信息。        

> show grants for 'webadmin'@'10.12.20.133';
| GRANT ALL PRIVILEGES ON *.* TO 'webadmin'@'10.12.xx.xxx' |   為什么使用pt工具能夠得到更多,不是這個工具有多神奇,而是里面充分利用了新特性的東西。

pt-show-grants里面是這樣寫的,對于MySQL 5.7的處理方式。

      # If MySQL 5.7.6+ then we need to use SHOW CREATE USER
      my @create_user;
      if ( VersionCompare::cmp($version, '5.7.6') >= 0 ) {
         eval {
            @create_user = @{ $dbh->selectcol_arrayref("SHOW CREATE USER $user_host") };
         };
         if ( $EVAL_ERROR ) {
            PTDEBUG && _d($EVAL_ERROR);
            $exit_status = 1;
         }
         PTDEBUG && _d('CreateUser:', Dumper(\@create_user));
         # make this replication safe converting the CREATE USER into
         # CREATE USER IF NOT EXISTS and then doing an ALTER USER
            my $create = $create_user[0];
            my $alter  = $create;
            $create =~ s{CREATE USER}{CREATE USER IF NOT EXISTS};
            $create =~ s{ IDENTIFIED .*}{};
            $alter  =~ s{CREATE USER}{ALTER USER};
            @create_user = ( $create, $alter );
            PTDEBUG && _d('AdjustedCreateUser:', Dumper(\@create_user));
      }

簡化一下就是使用show create user這種方式,在這個基礎上額外補充一下,使得這個語句更加健壯。

我們使用show create user 'webadmin'@'10.12.20.133'得到的結(jié)果如下:

| CREATE USER 'webadmin'@'10.12.20.133' IDENTIFIED WITH 'mysql_native_password' AS '*DA43F144DD67A3F00F086B0DA1288C1D5DA7251F' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK |

語句看起來豐滿了很多,但是似乎還是少了些權(quán)限的信息,

這是因為5.7里面完整的信息是通過show create user和show grants for 'xx'這兩種方式完成的,而在5.6中只需要通過show grants for 'xxx’即可。

上述就是小編為大家分享的MySQL中怎么獲取權(quán)限信息了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI