這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)MySQL中怎么獲取權(quán)限信息,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
社旗ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
最近在做一次MySQL數(shù)據(jù)遷移的時(shí)候,突然發(fā)現(xiàn)自己遺漏了一個(gè)地方,那就是權(quán)限信息沒(méi)有導(dǎo)出,如果我們使用mysqldump --all-databases的時(shí)候沒(méi)有添加--flush-privileges的時(shí)候,導(dǎo)出的數(shù)據(jù)中是不會(huì)包含mysql數(shù)據(jù)庫(kù)的。
而我其實(shí)是比較懶的,不想因?yàn)檫@個(gè)重新導(dǎo)出一次,那么我就有幾種方式選擇。
如果在MySQL 5.5,5.6的版本中,我可以直接導(dǎo)出mysql.user的數(shù)據(jù)即可。
如果使用腳本化完成,基本是這樣的形式即可,本意其實(shí)就是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
運(yùn)行后的語(yǔ)句大體是如下的形式:
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ù)庫(kù)是5.7的,看到下面導(dǎo)出的語(yǔ)句,我感覺(jué)不對(duì)勁,難道都不要密碼,如果確實(shí)沒(méi)有,這是一個(gè)多么大的坑。
GRANT USAGE ON *.* TO 'phplamp'@'localhost'
GRANT ALL PRIVILEGES ON `phplampDB`.* TO 'phplamp'@'localhost' 我知道5.7做了一些改進(jìn),本身對(duì)于show grants也有一些限制,沒(méi)想到真碰上這種情況,教訓(xùn)是如此的深刻。
所以回到問(wèn)題,如果現(xiàn)在要解決,就有大體的三種方式來(lái)同步權(quán)限;
方法1:重新導(dǎo)出導(dǎo)入整個(gè)數(shù)據(jù)庫(kù) 不評(píng)論,我絕對(duì)不會(huì)這么做,只是看起來(lái)是一個(gè)完整的過(guò)程,但是無(wú)用功太多,很容易被鄙視
方法2:導(dǎo)出mysql的權(quán)限配置 如果是在5.5,5.6的環(huán)境,直接導(dǎo)出mysql.user表數(shù)據(jù)即可,但是在5.7中可不行,一種方式就是導(dǎo)出整個(gè)mysql庫(kù)的數(shù)據(jù)
方法3:pt工具導(dǎo)出 使用自定義腳本或者pt工具來(lái)導(dǎo)出權(quán)限信息
當(dāng)然解決方法很多,我就說(shuō)說(shuō)方法2,方法3
我對(duì)比了5.6和5.7 的表結(jié)構(gòu)情況。不看不知道,一看差別還真不小。
MySQL 5.7的mysql.user表含有45個(gè)字段
MySQL 5.6的mysql.user表含有43個(gè)字段
這是表面現(xiàn)象,不是5.7多兩個(gè)字段這么簡(jiǎn)單,真實(shí)情況如下:
1)MySQL5.7中多了下面的3個(gè)字段,字段和數(shù)據(jù)類型如下:
password_last_changed | timestamp
password_lifetime | smallint(5) unsigned
account_locked | enum('N','Y')
2)這么一看總數(shù)對(duì)不上,這是因?yàn)镸ySQL 5.7相比5.6少了password字段
3)還有個(gè)細(xì)節(jié)可能被忽略,那就是MySQL 5.7的字段user相比MySQL 5.6長(zhǎng)度從16字符增長(zhǎng)到了32字符。
這就奇怪了,為什么沒(méi)有了password字段呢,沒(méi)有了password字段,這個(gè)功能該怎么補(bǔ)充呢?
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 |一個(gè)重要差別就在于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
基于這個(gè)安全策略,可以做很多的事情,5.7默認(rèn)就是這種模式。
看起來(lái)之前的那種show grants得到的信息很有限,那么我們來(lái)看看pt工具的效果,直接運(yùn)行./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';
這樣的語(yǔ)句相對(duì)來(lái)說(shuō)就是完整的,使用show grants的結(jié)果少了很多,只包含基本的權(quán)限信息。
> show grants for 'webadmin'@'10.12.20.133';
| GRANT ALL PRIVILEGES ON *.* TO 'webadmin'@'10.12.xx.xxx' | 為什么使用pt工具能夠得到更多,不是這個(gè)工具有多神奇,而是里面充分利用了新特性的東西。
pt-show-grants里面是這樣寫的,對(duì)于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));
}
簡(jiǎn)化一下就是使用show create user這種方式,在這個(gè)基礎(chǔ)上額外補(bǔ)充一下,使得這個(gè)語(yǔ)句更加健壯。
我們使用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 |
語(yǔ)句看起來(lái)豐滿了很多,但是似乎還是少了些權(quán)限的信息,
這是因?yàn)?.7里面完整的信息是通過(guò)show create user和show grants for 'xx'這兩種方式完成的,而在5.6中只需要通過(guò)show grants for 'xxx’即可。
上述就是小編為大家分享的MySQL中怎么獲取權(quán)限信息了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。