摘要
大家使用MySQL时一定遇到过:忘记登录密码或者出现ERROR 1045 <28000>: Access denied for user ‘root’@‘localhost’ (using password: YES);本文根据5.7.x官方文档总结解决方案。
一、通用解决方案
注意区分MySQL不同版本
- 停止MySQL服务器,然后使用启动参数
--skip-grant-tables
重新启动。这允许任何人不需要密码就可以使用所有特权进行连接,并禁止执行ACCOUNT-MANAGEMENT类型语句,如ALTER USER
和SET PASSWORD
。因为这样连接是不安全的,所以可以使用--skip-grant-tables
和skip_networking
,防止远程client连接。 - 登录MySQL:
shell> mysql
- 重新载入
grant table
表使得可以执行ACCOUNT-MANAGEMENT类型语句:
mysql> FLUSH PRIVILEGES;
- 修改密码:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
- 重新正常启动MySQL
- 如果
ALTER USER
语句执行错误,尝试执行如下sql:
UPDATE mysql.user SET authentication_string = PASSWORD('新密码')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
二、Unix和类Unix
- 使用mysql用户登录系统
- 如果MySQL服务器正在运行,请停止它。找到包含服务器进程ID的.pid文件。常见的位置:
/var/lib/mysql/
、/var/run/mysql/
和/usr/local/mysql_data/
。 通常文件的扩展名为.pid,并以mysqld或系统主机名开头。
然后使用kill命令(不是kill -9)停止MySQL:
shell> kill `cat /mysql-data-directory/host_name.pid`
- 新建一个文本文件写入:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
- 保存文件,确保
mysql
或当前系统用户有权限访问该文件 - 使用如下命令启动MySQL:
shell> mysqld --init-file=/路径/mysql-init &
- 删除
mysql-init
文件,保证数据库安全。 - 如果
ALTER USER
语句执行失败,可以更改为:
UPDATE mysql.user
SET authentication_string = PASSWORD('MyNewPass'), password_expired = 'N'
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
三、Windows
四、其他博客
-
找到mysql安装路径(可以在环境变量中找)
-
以管理员身份打开命令行,停止服务
- Win+R输入
cmd
- 键入
net stop mysql
-
cd 到mysql安装路径的bin目录,旧版本输入mysqld --skip-grant-tables,8.0输入mysqld --console --skip-grant-tables --shared-memory
-
打开另一个管理员命令行,cd 到mysql安装路径的bin目录,输入mysql,输入use mysql
-
flush privileges;
-
使用
alter user'root'@'localhost' IDENTIFIED BY 'Li!123456';
修改密码。
8.0以后版本密码必须包含大小写字母特殊字符和数字
flush privileges;
-
\q
退出 -
重新以管理员打开命令行:
net start mysql
-
登陆
mysql -u root -p