MySQL root用户登录的几个小问题(r12笔记第67天)

今天和同事聊了聊技术的事情,聊到BAT里面的一些高大上的系统和设计,相比总是会有些差距,不过像那样体量的公司知识沉淀很深,所以能够做好我们力所能及的事情,把它细化做好,也是一种进步和改进。

如果你老是觉得自己的环境受限,有各种KPI或者是成本的考量,做事情从下往上去推动很难,这些都是实际的困难,很多公司都是存在这样的问题的。在资源受限方面,我尤其纠结,举个有意思的小例子,如果我收到一条报警,提示数据库表空间不足了,那就添加一个数据文件呗,结果数据库层面的空间问题解决了,而马上会收到一个系统空间不足的报警,碰到这种情况,你自己体会,心情肯定是很复杂的。

今天碰到的一个案例比较特别,是关于MySQL登录的,数据库环境是5.6版本。

> select version();
+-----------------+
| version()       |
+-----------------+
| 5.6.23-72.1-log |
+-----------------+
1 row in set (0.01 sec)

今天同事问我一个问题,想让我看看某个数据库用户的权限问题,我登录到服务器端之后,一切都很顺利。

# mysql
Logging to file '/home/mysql/query.log'
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 52625
Server version: 5.6.23-72.1-log Percona Server (GPL), Release 72.1, Revision 0503478

一切都很正常,然后我准备看看连接到数据库的线程情况。

> show processlist; ERROR 1227 (42000): Access denied; you need (at least one of) the PROCESS privilege(s) for this operation竟然抛出了这个奇怪的错误,如果想查看数据字典中的信息,也被禁止了。

> select user,host from mysql.user; ERROR 1142 (42000): SELECT command denied to user ''@'localhost' for table 'user'

这个时候就很纠结了,我堂堂的root用户竟然登录不了MySQL了,别说给同事排除故障,自己都登录不了了。

带着疑问,我查看了error log,竟然没有发现什么相关的异常信息。

这个问题该怎么继续往下走,如果要做改动,影响到现有的测试用户就不好了,尽管是测试环境,重启服务之类的还是要和开发同学充分沟通之后才能动手,况且我是帮忙查看这个环境,更不能随便改动了。

对于这个问题让我有些焦虑的时候,我想到之前还真给自己留了一道后门,那就是之前帮他们处理问题的时候,我在自己的服务器端设定了一个用户,来测试数据库的连接情况,没想到这样一个无心之举就成了分析这个问题的最后一把钥匙。

很快,我从安全认证的中控客户端登录到了这台MySQL服务器,连接数有100多个。一边感叹自己的英明,一边速速分析问题。

这个数据库中有10个左右的数据库用户,大体是这样的内容,做了修改。

> select user,host from mysql.user;
+----------------+-----------------------------+
| user           | host                        |
+----------------+-----------------------------+
| cloud_test     | %                           |
| cloudcs_app    | %                           |
| root           | %                           |
| cloud_test     | 10.127.138.107              |
| root           | 10.127.138.107              |
|                | localhost                   |
| jeanron        | test_user%                  |
+----------------+-----------------------------+

查看show process的信息,看到是用户是root

| 52629 | root           | localhost       
+-------+----------------+------------

查看root@localhost的权限,竟然没有。

> show grants for root@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'root' on host 'localhost'

这个时候我们停一下,在这个场景中,系统mysql命令直接连接进来的是root@localhost吗?从错误日志来看不是,而从线程信息来看是,所以我们需要进一步分析一下,问题在哪里。

虽然服务端直接mysql命令登录后,查看不了线程情况,查看不了数据字典,但是show grants这个命令是可以的。

> show grants;
+------------------------
| Grants for @localhost                                                    
+------------------------
| GRANT USAGE ON *.* TO ''@'localhost'

可以看出来,登录的用户是''@'localhost',而不是root@'localhost',这个环境中没有配置root@'localhost'用户。

然后再次查看mysql.user的情况,就会发现下面的配置比较特别。root使用了宽泛的域名方式,允许不同的IP来访问,而另外有一条记录是指定的IP。

| root           | %                           |
| root           | 10.127.138.107              |
|                | localhost                   |

这个能够说明什么呢,也就是说使用root@localhost的效果和root@'%'是类似的。而这个''@localhost目前是默认的连接方式,需要说的是,在这个配置下是优先的。

我们初始化一个mysql环境后,一般mysql.user的内容是这样的,比如一个5.7的环境。

mysql> select user,host from mysql.user;
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+
2 rows in set (0.00 sec)

默认的连接方式是root@'localhost'

而在上面的场景中,没有root@'localhost'的配置,就优先使用了''@'localhost'这个用户。

为什么会有这个问题呢,和开发同学沟通之后,定位分析,发现原来之前这个服务器的IP发生过变化。后来开发同学自己也做了一些修改和配置,就是现在的情况了。

对于这种情况怎么修复呢,我的想法是删除匿名用户,服务端不启用密码,即root@'localhost',而客户端连接则使用域名解析的方式,但是对开发同学不开放root权限,所以我们删除root@'%' 用户。

删除匿名用户''@'localhost'

> drop user ''@localhost; 删除最高权限的root用户,不对外提供任意的权限访问。

drop user root@'%';修改那个IP发生变化的服务器配置,修改为localhost

> update mysql.user set host='localhost' where user='root' and host='10.127.138.107';

设置密码为空,最后使用flush privileges即可。

这样一来,我们的预期效果就达到了,使用mysql登录即可。

> show grants; +---------------------------- | Grants for root@localhost

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-05-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java思维导图

从一笔金币充值去思考分布式事务

考虑支付重构的时候,自然想到原本属于一个本地事务中的处理,现在要跨应用了要怎么处理。拿充值订单举个栗子吧,假设:原本订单模块和账户模块是放在一起的,现在需要做服...

10140
来自专栏杨建荣的学习笔记

通过shell脚本检测MySQL服务信息

第一部分是通过系统层面来解析MySQL的基本信息,方式是通过ps -ef|grep mysql得到的信息来解析。

13720
来自专栏架构师小秘圈

大型网站图片服务器架构的演进

作者:丁浪,非著名架构师。关注高并发、高可用的架构设计,对系统服务化、分库分表、性能调优等方面有深入研究和丰富实践经验。热衷于技术研究和分享。 声明:版权归丁浪...

86040
来自专栏Python攻城狮

GitHub 系列之「团队合作利器 Branch」1.什么是分支?2.分支的常用操作3.基本的团队协作流程4.Git Flow

Git 相比于 SVN 最强大的一个地方就在于「分支」,Git 的分支操作简直不要太方便,而实际项目开发中团队合作最依赖的莫过于分支了,关于分支前面的系列也提到...

9510
来自专栏杨建荣的学习笔记

MySQL Cloud Service体验小结

今天体验了下MySQL Cloud的一些服务,除了网络卡顿延迟比较大之外,其他的体验还可以,简单来说下这个过程。

13020
来自专栏喔家ArchiSelf

老曹眼中的缓存技术

缓存是系统快速响应中的一种关键技术,是一组被保存起来以备将来使用的东西,介于应用开发和系统开发之间,是产品经理们经常顾及不到的地方,算是技术架构中的非功能性约束...

17720
来自专栏数据和云

利用硬链接和truncate降低drop table对线上环境的影响

作者简介 ? 肖鹏 微博研发中心数据库技术负责人,主要负责微博数据库(MySQL/Reids/HBase/Memcached)相关的业务保障,性能优化,架构设计...

38690
来自专栏杨建荣的学习笔记

Windows环境下搭建Oracle 12c的体验

昨天准备一个Oracle环境,结果看起来是很简单的事情,却因为各种各样的原因耽搁了一些时间,从下载到安装部署,已经几个小时过去了,抬头看看,已经是凌晨快2点了。...

13600
来自专栏机器学习实践二三事

Mac无法升级six, numpy等

OS 10.10以上,会出现你无法直接使用pip升级向six, numpy等,报错就是各种权限不够,加上sudo结果也一样,原因就是MacOS的系统完整性保护(...

31080
来自专栏颇忒脱的技术博客

事务 - Saga模式

1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long live...

39430

扫码关注云+社区

领取腾讯云代金券