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
2. 创建一个包含修改用户密码命令的文件. (**假设该文件是 `/home/ubuntu/mysql-init` **)
```bash
# 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
4. 通过下面命令启动 MySQL
```bash
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
© 著作权归作者所有
发表评论