千家信息网

MySQL中怎么获取权限信息

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这期内容当中小编将会给大家带来有关MySQL中怎么获取权限信息,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。最近在做一次MySQL数据迁移的时候,突然发现自己遗漏了
千家信息网最后更新 2025年01月20日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

运行后的语句大体是如下的形式:

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工具能够得到更多,不是这个工具有多神奇,而是里面充分利用了新特性的东西。

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'得到的结果如下:

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

语句看起来丰满了很多,但是似乎还是少了些权限的信息,

这是因为5.7里面完整的信息是通过show create user和show grants for 'xx'这两种方式完成的,而在5.6中只需要通过show grants for 'xxx'即可。

上述就是小编为大家分享的MySQL中怎么获取权限信息了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

字段 数据 信息 权限 就是 方式 方法 语句 工具 结果 这是 形式 情况 数据库 时候 内容 字符 差别 是在 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国内顶尖的网络安全企业 网络安全市场环境 产业活动单位的数据库 无法与服务器进行安全的链接 福建通用软件开发收费 育苗通无法连接服务器是什么意思 苏州软件开发公司报价 物探研究院做软件开发好不好 数据库原理与技术课程推荐书 21春学期网络技术与应用答案 功能权限管理数据库设计 武警网络安全形势分析 小公司嵌入式软件开发 大话西游2服务器时间查询 vf工作区能打开数据库吗 不用数据库的用户登入 域服务器的445端口有什么用 上网提示网络安全性低 网络技术部门对联大全 互联网网络技术咨询诚信服务 国产 网络安全 股票 无法与服务器进行安全的链接 同花顺连接不了服务器什么问题 汽车电子行业软件开发 湘西网络安全培训班 初一信息技术网络技术基础 网络技术对大学生的有利 通信信息网络技术专业就业前景 外贸用哪些软件开发客户 国家网络安全周闭幕式几点
0