免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13810 | 回复: 5
打印 上一主题 下一主题

【已解决】mysql修改密码无效,修改后登录总拒绝访问,用mysqld_safe忽略授权表方 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-19 19:47 |只看该作者 |倒序浏览
本帖最后由 chinafenghao 于 2013-08-28 12:04 编辑

运行环境如下:

[root@aaa ~]# uname -r
2.6.18-308.el5
[root@aaa ~]# lsb_release -a
LSB Version:    :core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-ia32:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 5.8 (Final)
Release:        5.8
Codename:       Final
[root@aaa ~]# mysql --version
mysql  Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (i386) using readline 5.1

vmvare安装的centos,VMware® Workstation版本是8.0.2 build-591240

用yum方式安装的mysql,所用安装命令

yum install mysql*  -y

所用的my.cnf是系统默认的

cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

现象描述:

启动mysql之后,曾用命令修改了root的密码,

再次登录mysql,发现修改的密码无效,提示拒绝访问

具体描述如下

[root@aaa ~]# /etc/init.d/mysqld start
Starting mysqld:  [  OK  ]

#之前已把密码改为123456

[root@aaa ~]# mysql -uroot -p'123456'
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

就停止数据库,尝试用mysqld_safe忽略授权表的方式登录并修改密码

[root@aaa ~]# /etc/init.d/mysqld stop
Stopping mysqld:  [  OK  ]

[root@aaa ~]# mysqld_safe  --skip-grant-tables  --skip-networking &
[1] 10432
[root@aaa ~]# Starting mysqld daemon with databases from /var/lib/mysql

[root@aaa ~]#mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.95 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

数据库的基本信息

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.13 sec)


mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


####发现数据库中mysql的所有表都是空的####   #### 不知道为什么###

mysql> select * from user;
Empty set (0.03 sec)

mysql> select * from db;  
Empty set (0.00 sec)

mysql> select * from proc;
Empty set (0.00 sec)


mysql> select * from procs_priv;
Empty set (0.00 sec)

mysql> select * from tables_priv;
Empty set (0.00 sec)

mysql> select * from columns_priv;
Empty set (0.00 sec)

###个人觉得上面显示mysql库下的所有表都是空的,是不是意味着连root用户都不存在,因此给root修改密码也是无效的###

尝试修改密码,没有提示错误,但是没有行匹配

发现当前似乎是空用户登录进来的

mysql> select user();
+--------+
| user() |
+--------+
| root@  |
+--------+
1 row in set (0.00 sec)


于是尝试删除空用户并刷新权限

mysql> delete from user where USER='';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

修改密码


用这样的方式修改过,但是看提示信息,似乎修改无效,没有行命中

mysql> UPDATE mysql.user  SET password=PASSWORD('123456') where user='root' AND host='localhost';
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0  Changed: 0  Warnings: 0

然后,退出数据库

mysql> quit;
Bye

再关闭数据库

/etc/init.d/mysqld stop
[root@aaa ~]# /etc/init.d/mysqld stop
STOPPING server from pid file /var/run/mysqld/mysqld.pid
130819 19:41:47  mysqld ended

Stopping mysqld:  [  OK  ]
[1]+  Done                    mysqld_safe --skip-grant-tables --skip-networking


#确认数据库已被关闭
[root@aaa ~]# ps -ef |  grep "mysql"  | grep "mysql"
root     10956  8049  0 19:42 pts/0    00:00:00 grep mysql
root     10957  8049  0 19:42 pts/0    00:00:00 grep mysql
[root@aaa ~]# ps -ef |  grep "mysql"  | grep -v "mysql"


再重新启动数据库

/etc/init.d/mysqld start

[root@aaa ~]# /etc/init.d/mysqld  start
Starting mysqld:  [  OK  ]

再用刚才设置的密码123456登录就拒绝访问了

[root@aaa ~]# mysql -uroot  -p123456  
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

为什么?怎么改才能重设密码?

论坛徽章:
0
2 [报告]
发表于 2013-08-20 11:10 |只看该作者
从你上面的图中可以看到
mysql> select * from user;
Empty set (0.03 sec)
user表中没有数据,
mysql> UPDATE mysql.user  SET password=PASSWORD('123456') where user='root' AND host='localhost';
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0  Changed: 0  Warnings: 0
这条命令是执行不成功的,所以你无法登录。

建议:
1、插入一条root的授权吧
2、从别的相同版本的mysql中拷贝mysql库过来
3、使用mysql_install_db初始化mysql
以上不管那种方式操作完成后,都需要正常启动数据库,不需要忽略权限表。

论坛徽章:
0
3 [报告]
发表于 2013-08-21 11:33 |只看该作者
本帖最后由 aaa1111sss 于 2013-08-21 11:34 编辑

楼上的,我采用了你说的第二种方法,

从一个 相同版本正常运行的mysql中拷贝了如下三张表到当前有问题的mysql库中并覆盖原文件,再重新正常模式启动mysql就好了

/var/lib/mysql/mysql/user.frm  
/var/lib/mysql/mysql/user.MYD  
/var/lib/mysql/mysql/user.MYI

当前有问题的库的IP地址是192.168.88.131  登录到一个正常的库,这个库的root用户的密码是空的,即没有为root用户创建密码

[root@hhh ~]# scp /var/lib/mysql/mysql/user.frm  root@192.168.88.131:/var/lib/mysql/mysql/user.frm
user.frm                                                                                                                             100%   10KB  10.1KB/s   00:00   
[root@hhh ~]# scp /var/lib/mysql/mysql/user.MYD  root@192.168.88.131:/var/lib/mysql/mysql/user.MYD
user.MYD                                                                                                                             100%  248     0.2KB/s   00:00   
[root@hhh ~]# scp /var/lib/mysql/mysql/user.MYI  root@192.168.88.131:/var/lib/mysql/mysql/user.MYI
user.MYI                                                                                                                             100% 2048     2.0KB/s   00:00

完成以上步骤后,在当前有问题的库上,
/etc/init.d/mysqld start
这时,可以以root身份登录到数据库了

再更改root的密码,可以成功修改,再退出数据库,就可以正常用刚修改的密码登录了

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user,host from user;
+------+-----------------+
| user | host            |
+------+-----------------+
| root | 127.0.0.1       |
|      | aaa.linux.net |
| root | aaa.linux.net |
|      | localhost       |
| root | localhost       |
+------+-----------------+
5 rows in set (0.01 sec)

mysql>
mysql>
mysql> UPDATE mysql.user SET password=PASSWORD('123456') where user='root';
Query OK, 3 rows affected (0.03 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)


mysql> quit;
Bye

论坛徽章:
0
4 [报告]
发表于 2013-08-21 14:25 |只看该作者

恩。。。恭喜~解决问题就好!

论坛徽章:
0
5 [报告]
发表于 2013-08-27 14:32 |只看该作者
觉得这个问题好诡异,user表明明就是空的,update的时候怎么会成功呢。回复 1# aaa1111sss


   

论坛徽章:
0
6 [报告]
发表于 2013-08-27 17:05 |只看该作者
我的理解是如下:
在修改密码时,update未生效。如楼主的图:
mysql> UPDATE mysql.user  SET password=PASSWORD('123456') where user='root' AND host='localhost';
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0  Changed: 0  Warnings: 0

其中  affected的为0,matched也是0。所以这条语句执行是没有问题的,但是没起作用。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP