MySQL下创建新用户、新数据库、设定访问权限控制都需要用到root密码,忘记密码就只能重置密码了,但是网上搜到的结果我依然不能重置密码,只能自己动手找文档,并且将结果记录于此,以备以后查阅!
方案一:官方文档提供(推荐)
- 杀死MySQL相关进程
如果MySQL服务器正在运行,请将其停止。找到包含服务器进程 ID 的 .pid文件。此文件的确切位置和名称取决于你的发行版、主机名和配置。常见的位置是 `/var/lib/mysql/`,` /var/run/mysqld/`和`/usr/local/mysql/data/`。 实在不行就`ps -aux|grep mysqld`命令,然后`kill`掉对应进程吧
通过给mysqld
进程发送一个kill
信号来结束MySQL进程(注意:不是kill -9
)
注意:kill后面的的命令是在反引号内,不是单引号
# 下边这条命令是示例命令,执行并不能成功
kill `cat /mysql-data-directory/host_name.pid`
# 我的文件位置是这个
kill `cat /run/mysqld/mysqld.pid`
- 创建一个包含修改用户密码命令的文件. (假设该文件是
/home/ubuntu/mysql-init
)
# 5.7.6以及之后版本运行这条命令
echo 'ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';' > mysql-init
# 5.7.6之前版本运行这条命令
echo 'SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');' > mysql-init
- 确保MySQL对该文件有读取权限
# 如果不确定,改成‘777’
chmod 777 mysql-init
# 或者直接把文件所属权限转移给mysql用户和组
chown mysql:mysql mysql-init
- 通过下面命令启动MySQL
mysqld --init-file=/home/ubuntu/mysql-init &
- 成功启动之后,删除刚才创建的文件
rm -f mysql-init
- 现在正常重启就可以使用刚才创建的root密码登录了
如果依然不能重置密码,请将上边创建的文件的内容修改成如下内容,并重复3-5步骤
UPDATE mysql.user
SET authentication_string = PASSWORD('MyNewPass'), password_expired = 'N'
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
方案二:安全模式重置法(网上最常见的搜索结果)
思路:以安全模式启动MySQL,这样不需要密码可以直接以root身份登录,然后重设密码。
- 停掉MySQL服务:
sudo service mysql stop
以上命令适用于Ubuntu和Debian。CentOS、Fedora和RHEL下使用mysqld替换mysql。
- 以安全模式启动MySQL:
sudo mysqld_safe --skip-grant-tables --skip-networking &
注意我们加了--skip-networking
,避免远程无密码登录 MySQL。
- 用root登录,无需密码:
mysql -u root
- 重设密码:
mysql> use mysql;
mysql> update user set password=PASSWORD("mynewpassword") where User='root';
mysql> flush privileges;
注意,命令后需要加分号。
- 重设完毕后,我们退出,然后启动 MySQL 服务:
mysql> quit
quit不需要分号。
- 重启服务:
sudo service mysql restart
# 如果不能重启,可能需要手动杀死mysql相关进程,再重启
如果不是Debian系列,而是CentOS、Fedora和RHEL的话,需要用mysqld
替换mysql
。
- 现在可以尝试用新密码登录了:
mysql -u root -pnewpassword # 注意,-p 和密码间不能有空格。
# 或者
mysql -u root -p#回车之后输入密码
其中-u也可以与root连在一起,mysql -uroot -p
注意
自从MySQL5.7.6起,删除了‘password’字段,改用‘authentication_string’字段存储密码
修改时可能遇到下边这个问题
ubuntu@ubuntu:~$ sudo mysqld_safe --skip-grant-tables --skip-networking
2019-06-28T01:27:24.687004Z mysqld_safe Logging to syslog.
2019-06-28T01:27:24.690188Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2019-06-28T01:27:24.693132Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.
解决方法
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
方案三:主要适用于Debian以及Ubuntu等Debian的衍生系统
在Ubuntu和Debian系统上,有一个debian-sys-maint
用户,Debian类系统下一些系统脚本对MySQL的操作是通过这个用户完成的。所以我们可以通过这个用户来修改 root 密码。该用户的密码可以在/etc/mysql/debian.cnf
下找到:
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
用该用户登录 MySQL 后,也可以修改密码:
sudo mysql -u debian-sys-maint -p