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
    

时间: 2024-09-26 18:52:48

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

更改Mysql root用户密码_Mysql

新下载了mysql,口令为空,如何修改root口令: 首先登陆mysql use mysql; update user set password=password('new_password') where user='root'; flush privileges; 注意需要 flush privileges; 更改Mysql root用户口令的内容小编就给大家介绍到这里,希望对大家有所帮助! 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用

服务器root用户登录不了 linux普通用户如何修改passwd文件

今天一台服务器root用户登录不了,普通用户可以登录. 普通用户su到root用户也报错 su: bash: No such file or directory 查看下passwd文件 oracle@linux-35:~> cat /etc/passwd|grep root root:x:0:0:root:/root:cd root的shell竟然被人改成cd了,难怪报上面的错. 直接用oracle用户修改passwd文件还不行,没有修改权限. 所以我们得用sudoedit oracle@lin

Ubuntu keylin 14.04 怎么使用root用户登录?

  Ubuntu(乌班图)是一个以桌面应用为主的Linux操作系统.Ubuntu基于Debian发行版和GNOME桌面环境,而从11.04版起,Ubuntu发行版放弃了Gnome桌面环境,改为Unity,与Debian的不同在于它每6个月会发布一个新版本. ubuntu-Kylin中国定制版的Ubuntu桌面Linux系统,融入中国独有的特色. ubuntu默认是不能用root用户登录的,对于个人来说没有root用户权限非常麻烦.这里我将介绍Ubuntu keylin 14.04开启root用户

linux root用户登录后界面卡住不动

问题描述 linux root用户登录后界面卡住不动 其他用户登录也同样卡住不动 解决方案 卡住不动是什么意思?图形界面还是字符界面?截个图 解决方案二: linux有无穷的发行版,计算机又有无数硬件组合.你又可能做了无数的配置或者使用了无数种可能的软件. 结果就是根据你说的,我只能知道你一窍不通,所以建议你雇佣一个系统管理员帮你. 解决方案三: 系统有问题了,修复一下.查看系统启动提示信息等 解决方案四: 参考Boot problems; no login screen 是不是配置文件损坏了?

php+mysql 用户登录-php+mysql、用户登录界面,

问题描述 php+mysql.用户登录界面, php+mysql设计一个用户登录界面,能登陆注册,有验证码,有数据库的建立和代码的详细步骤请给个详细的数据库的建立和正确的代码,我是新手,数据库表的建立和代码始终连接不上,请指教 解决方案 CSdn资源下载找找,里面很多

php+mysql大量用户登录解决方案分析_php技巧

本文实例分析了php+mysql大量用户登录解决方案.分享给大家供大家参考.具体分析如下: 百度.QQ.360等大公司都拥有上亿的用户量,不仅所有子网站都通过一个账号登录,而且还开放用户平台,提供给其他网站使用,这种级别的数据量和访问量,如果不做优化,估计很快就会宕机,这些公司都是一个专门的团队,维护一个注册登录,细节设计的非常优秀,现在粗略谈下他们的设计方案. 大数据的时候,压力不在PHP,主要在MySQL,PHP可以做负载均衡,10台机器抗不住就用20台或者100台,这都不是瓶颈. 但是My

Fedora10无法使用root用户登录的解决方案

本文为原创,如需转载,请注明作者和出处,谢谢!     最近测试fedora10,发现fedora竟然无法使用root用户进行登录,就算root的密码输入正确也不行.虽然大正常的工作中尽尽量避免使用root用户进行登录.但在其他情况,如学习.完成个人的工作等,以root用户登录还是很方便的(如果用其他用户登录会有很多限制).     最简单的解决方案是修改/etc/pam.d/gdm文件的内容.先以普通用户进行登录,然后打开/etc/pam.d/gdm文件,将如下一行使用#注释: auth re

mysql root用户的密码修改和消除_Mysql

一.密码的修改:使用mysqladmin命令 1.例如你的 root用户现在没有密码,你希望的密码修改为abc,那么命令是:mysqladmin -u root password abc 2.如果你的root现在有密码了,那么修改密码为abc的命令是:mysqladmin -u root -p password youyou 注意,命令回车后会问你旧密码,输入旧密码之后命令完成,密码修改成功. 二.密码的消除 1.以root登录:mysql -u root -p 2.mysql>use mysq

启用 Root 用户登录 OS X

  大家都知道在 OS X 系统下可以通过在终端(Terminal)里面使用 sudo 命令获得 root 用户权限;下面介绍一个可以对 OS X 系统全局开启 root 用户权限的方法,也就是用 root 帐户登录系统. 系统偏好设置(System Preferences)-> 帐户(Accounts)-> 登录选项(Login Options) 点击加入(Join)按钮;点击打开目录实用工具(Open Directory Utility) 点击菜单烂的编辑(Edit)项,选择启用Root用