加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中怎么取得权限信息

发布时间:2022-02-12 09:09:18 所属栏目:MySql教程 来源:互联网
导读:这期内容当中小编将会给大家带来有关MySQL中怎么获取权限信息,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 最近在做一次MySQL数据迁移的时候,突然发现自己遗漏了一个地方,那就是权限信息没有导出,如果我们使用
        这期内容当中小编将会给大家带来有关MySQL中怎么获取权限信息,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
 
        最近在做一次MySQL数据迁移的时候,突然发现自己遗漏了一个地方,那就是权限信息没有导出,如果我们使用mysqldump --all-databases的时候没有添加--flush-privileges的时候,导出的数据中是不会包含mysql数据库的。
 
       而我其实是比较懒的,不想因为这个重新导出一次,那么我就有几种方式选择。
 
       如果在MySQL 5.5,5.6的版本中,我可以直接导出mysql.user的数据即可。
 
      如果使用脚本化完成,基本是这样的形式即可,本意其实就是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中都是可行的,但是迁移的数据库是5.7的,看到下面导出的语句,我感觉不对劲,难道都不要密码,如果确实没有,这是一个多么大的坑。
 
GRANT USAGE ON *.* TO 'phplamp'@'localhost'
GRANT ALL PRIVILEGES ON `phplampDB`.* TO 'phplamp'@'localhost'    我知道5.7做了一些改进,本身对于show grants也有一些限制,没想到真碰上这种情况,教训是如此的深刻。
 
    所以回到问题,如果现在要解决,就有大体的三种方式来同步权限;
方法1:重新导出导入整个数据库    不评论,我绝对不会这么做,只是看起来是一个完整的过程,但是无用功太多,很容易被鄙视
方法2:导出mysql的权限配置    如果是在5.5,5.6的环境,直接导出mysql.user表数据即可,但是在5.7中可不行,一种方式就是导出整个mysql库的数据
方法3:pt工具导出         使用自定义脚本或者pt工具来导出权限信息
 
当然解决方法很多,我就说说方法2,方法3
 
我对比了5.6和5.7 的表结构情况。不看不知道,一看差别还真不小。
 
MySQL 5.7的mysql.user表含有45个字段
MySQL 5.6的mysql.user表含有43个字段
 
这是表面现象,不是5.7多两个字段这么简单,真实情况如下:
 
1) MySQL5.7中多了下面的3个字段,字段和数据类型如下:
 
 password_last_changed  | timestamp            
 password_lifetime      | smallint(5) unsigned
 account_locked         | enum('N','Y')
2)这么一看总数对不上,这是因为MySQL 5.7相比5.6少了password字段
 
3)还有个细节可能被忽略,那就是MySQL 5.7的字段user相比MySQL 5.6长度从16字符增长到了32字符。
 
   这就奇怪了,为什么没有了password字段呢,没有了password字段,这个功能该怎么补充呢?
 
MySQL5.6中查看mysql.user的数据结果如下:
 
> select user,password,authentication_string from mysql.user;               
| user           | password               | authentication_string |
| app_live_im    | *E96DB97255EF3ED52454A10EDA1AE7BABC8D3700 |    |
| mysqlmon       | *0571D080430BC7B60A3F4D41A8D71501E6B8FDAA |    | 而在MySQL 5.7中,结果却有所不同
 
+-----------------+-------------------------------------------+
| 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的结果少了很多,只包含基本的权限信息。        
 
> show grants for 'webadmin'@'10.12.20.133';
| GRANT ALL PRIVILEGES ON *.* TO 'webadmin'@'10.12.xx.xxx' |   为什么使用pt工具能够得到更多,不是这个工具有多神奇,而是里面充分利用了新特性的东西。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读