作者介绍:何剑敏 Oracle ACS华南区售后团队,首席技术工程师。多年从事一线的数据库运维工作,有丰富项目经验、维护经验和调优经验,专注于数据库的整体运维。

越来越多的互联网企业在使用postgresql数据库,我们也不例外。接下来分享一个反复授权排查权限消失的案例。

发现问题

昨天开发请我建立了一个只读用户abc_tmp_test用户,并且将mkl_rw用户下的32个表授权给只读用户用。ok,请简单轻松的一个需求,很快就完成了。但是今天开发来和我说,昨天授权的几个表中,有部分表还是没有权限去读取,让我帮忙看看。

排查问题
>>>>

第一次授权

一开始,我以为是昨天遗漏了,先道了一个歉,再次进行了授权,授权完成之后,检查了32个表,都能被只读用户查询,于是放心的告诉开发,昨天的所有表都已经授权好了,我也检查过一次了。这次肯定不会漏了。

万万没想到,半小时后,开发来和我说,不行,还是有其中几个表没有权限。我之前的连接还没断开,再次跑了一遍之前的检查语句,确实没有权限了。卧槽?这是咋回事?数据库中有雷锋了?

>>>>

第二次授权

我再次授权了一次,并且检查了information_schema.table_privileges,确认了再次授权后,是新增了32行记录。这次我没有先通知开发,说已经授权完成了,而是过了一会,我再次去查,变成了28行,又过了一会,变成了16行!

也就是我授权的32个表的select权限给只读用户,过一段时间之后,这32个表中的一些表的权限会慢慢消失!而且消失权限的表,也没有发现先授权的先消失,后授权的后消息的规律,但是可以发现最终剩下的,就是那16个表。我开始怀疑起人生了……

难道是pg中授权的表的数量有限?不能超过16个?也没查到相关的参数啊。

难道是那16个表有什么特殊设置?从建表语句中也没看到啊。

难道授权之后需要checkpoint刷盘?测试了checkpoint还是一样丢权限。

难道真的有雷锋出现啊。还说什么pg和oracle一样牛,一样稳定,连基本的授权都会丢。

正在逐个检查参数之际,同事通过检查log,发现了drop table的语句……

测试模拟

原来如此,这个案例,可以用下面的测试过程模拟出来了:

是的,如果table被drop了之后,再次重建,此时原本授权给只读用户的权限,也会消失。

向开发确认,是否有drop之后重建表的操作,开发确认,有段程序确实会定期的逐个drop表后重建表!!

为什么要进行drop表之后重建表的操作?开发说是通过调用框架清理数据,框架就是这么干的。

ok,明白了目的是为了清理数据,而不涉及到表结构的修改,那么其实用truncate来清理就可以了。如下测试,权限不会丢。

最终,开发修改了代码,再次授权那32张表之后,权限不再慢慢消失了。

总结教训

1. 大千世界无奇不有,数据库中没有雷锋,而是有各种万万没想到的逻辑。
2. 幸亏我们在建库的时候,建库标准要求设置了log_statement=ddl, 才能在log中发现线索。(其实我们oracle和pg的建库标准,都设置了记录ddl)

相关阅读:

Oracle 12.2 新特性:只读分区的使用和维护

Oracle12.2 多租户环境下的授权管理

听说你最喜欢给所有用户授DBA的权限

聊一聊Oracle数据库的用户权限

资源下载

关注公众号:数据和云(OraNews)回复关键字获取

‘2017DTC’,2017DTC大会PPT

‘DBALIFE’,“DBA的一天”海报

‘DBA04’,DBA手记4经典篇章电子书

‘RACV1’, RAC系列课程视频及ppt

‘122ARCH’,Oracle 12.2体系结构图

‘2017OOW’,Oracle OpenWorld资料

‘PRELECTION’,大讲堂讲师课程资料

pg数据库有雷锋?用户已有权限为何无故消失?相关推荐

  1. 查看MYSQL数据库中所有用户及拥有权限

    查看MYSQL数据库中所有用户 mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM m ...

  2. 【Linux】【服务器】 CentOS7下远程访问mysql数据库_创建用户及授予权限_查看用户、修改密码详细步骤

    一.创建用户 CREATE USER 'username'@'%' IDENTIFIED BY 'password'; username:你将创建的用户名: %:指定该用户在哪个主机上可以登录,%表示 ...

  3. 如何找到哪些数据库中哪些用户有DBA权限

      如何找到哪些用户有DBA权限 我们有时候需要找到数据库服务器中,哪些用户具有DBA权限,以便于有关安全与权限管理. 通常可以使用以下简单方法可以得到答案: 选择当前数据库, 执行SQL: 选择当前 ...

  4. 获取mysql所有用户权限_查看MYSQL数据库中所有用户及拥有权限

    查看MYSQL数据库中所有用户 mysql>SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM my ...

  5. mysql s授权所有用户_查看MYSQL数据库中所有用户及拥有权限

    查看MYSQL数据库中所有用户 mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM m ...

  6. 达梦数据库,给用户赋予系统权限 Any 时报“授权者没有此授权权限”

    原因是达梦数据库默认把Any的授权给禁用了,需要先进行开启 方法 1:在 dm.ini 文件中修改参数 ENABLE_DDL_ANY_PRIV 为 1. 方法 2: 通过以下语句修改参数 ENABLE ...

  7. 查看mysql数据用户权限_查看MYSQL数据库中所有用户及拥有权限

    查看user表结构 需要具体的项可结合表结构来查询 mysql> desc mysql.user; +-----------------------+---------------------- ...

  8. Mysql8数据库如何给用户授权

    查看用户已有权限 SHOW GRANTS FOR [用户名]; 使用root用户授予所有权限 -- 授权 GRANT ALL PRIVILEGES ON [数据库名].[表明] TO '[用户名]'@ ...

  9. 【Mongodb】用户和认证 权限总结

       开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库!    在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时a ...

最新文章

  1. 第一天   Linux基本操作
  2. JavaScript 小记 之 闭包(Closures)
  3. Web安全之命令执行漏洞
  4. 拉取远程分支到本地分支_保险公司在本地没有分支机构可以投保吗?异地投保会影响理赔吗?...
  5. 二叉树小球下落问题c语言,#C++初学记录(树和二叉树)
  6. 经典面试题(43):以下代码将输出的结果是什么?
  7. 一份完整的问卷模板_如何写出一份优秀的个人简历?
  8. html 自动跳转到不同页面,html跳转到同一个页面的不同位置_html/css_WEB-ITnose
  9. Linux基本命令 帮助命令
  10. 更好的使用Java集合(三)
  11. 他面前有一个人,有一把刀
  12. 《思维训练500题》
  13. 关于jxls2.6.0的学习以及遇到的问题(八)
  14. GB28181国标流媒体服务(LiveGBS)-支持海康8700等联网网关通过接入实现web端无插件直播...
  15. 大数据技术之名词解释
  16. 数字信号处理实验4:用窗口法设计FIR滤波器
  17. Python Numpy .npy文件打开
  18. 网络安全HW系列之应急响应方法论思维导图
  19. Swi-Prolog借助XPCE可视化-显示图片
  20. PowerBuilder 进度条

热门文章

  1. system health_Health Hack 2014:开源,开放数据和跨学科协作的力量
  2. 建议 | 在中国不是程序猿,不建议你用序列化!
  3. TypeScript 中类型 any,void,unknown,never之间的区别
  4. Bootstrap 按钮菜单的尺寸
  5. Git笔记(38) 凭证存储
  6. xcode 工程没有模拟器_Xcode只允许我运行iOS设备(没有模拟器)
  7. Gradle[1]gradle distZip时,增加目录信息到zip中
  8. IE11浏览器:请不要再叫我IE,谢谢
  9. 小端字节序和大端字节序
  10. 【tool】常见功能测试点