今天一个朋友的服务器在登陆phpmyadmin的时候提示1045错误,然后进入ssh后登陆数据库仍是1045错误。网上找了各种办法都不成功。
提示如下:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
首先我想到的是进入安全模式进行密码重置,虽没有成功, 但我还是附上方法:
1、停用mysql服务:
/etc/rc.d/init.d/mysqld stop 或者是 service mysqld stop
2、输入命令:
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
根据环境不同可能会不成功,提示你要进入mysql安装目录进行
那就找到安装目录,我这示例目录是 /alidata/server/mysql 这个常见于阿里服务器的一键安装包。
命令格式如下:
/alidata/server/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
3、登入数据库:
这个地方特别注意一下,一定要新建一个ssh窗口,登陆这台服务器
mysql -u root mysql
没有密码直接进入mysql
4、进入mysql
use mysql;
结果如下:
Database changed
5、更改root密码:
UPDATE user SET Password = password ( '新密码' ) WHERE User = 'root';
结果如下:
Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0
刷新数据库
FLUSH PRIVILEGES;
结果如下:
Query OK, 0 rows affected (0.00 sec)
千万不要忘记在mysql中操作的每条命令后面都要有“;”的。
最后退出
mysql> quit
重启mysql
/etc/rc.d/init.d/mysqld restart 或者是 service mysqld restart
用root登陆mysql
mysql -uroot –p
Enter password:新密码
登陆成功!
下面我要说的方法是上面这种方法不成功的时候的解决办法,这个才是本文的重点!
也不是什么新方法,很多人其实也都会的。
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。因为在修改的过程中任何人都可以登陆mysql修改用户密码的。
我的办法是停止了apache或是nginx服务。
2.编辑 my.cnf文件
vi /etc/my.cnf
如下图所示:
我们在[mysqld]的启动选项里面加入 skip-grant-tables 其实就是跳过授权表。
原代码如下:
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock skip-external-locking log-error=/alidata/log/mysql/error.log key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M
修改后如下:
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock skip-grant-tables #skip-external-locking log-error=/alidata/log/mysql/error.log key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M
原文件里面有个 skip-external-locking 我在前面加了# 将它注释掉了!
好了,退出并保存
:wq!
3.重新启动mysqld
service mysqld restart
结果如下:
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
4.登录并修改MySQL的root密码
mysql
结果如下:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.56
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
use mysql;
结果如下:
Database changed
更改root密码:
UPDATE user SET Password = password ( '新密码' ) WHERE User = 'root';
结果如下:
Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0
刷新数据库
FLUSH PRIVILEGES;
结果如下:
Query OK, 0 rows affected (0.00 sec)
5.将MySQL的登录设置修改回来
vi /etc/my.cnf
将刚才在[mysqld]的段中加上的skip-grant-tables删除,并把注释的部分改回来。
保存并且退出vi
6.重新启动mysqld
service mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
最后启动刚才停止的服务
service httpd restart service nginx restart
好了,进入phpmyadmin不再有1045提示了!