# Ubuntu重设MySQL的root密码

301 阅读4分钟

MySQL下创建新用户、新数据库、设定访问权限控制都需要用到root密码,忘记密码就只能重置密码了,但是网上搜到的结果我依然不能重置密码,只能自己动手找文档,并且将结果记录于此,以备以后查阅!

方案一:官方文档提供(推荐)

  1. 杀死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`
  1. 创建一个包含修改用户密码命令的文件. (假设该文件是/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
  1. 确保MySQL对该文件有读取权限
# 如果不确定,改成‘777’
chmod 777 mysql-init

# 或者直接把文件所属权限转移给mysql用户和组
chown mysql:mysql mysql-init
  1. 通过下面命令启动MySQL
mysqld --init-file=/home/ubuntu/mysql-init &
  1. 成功启动之后,删除刚才创建的文件
rm -f mysql-init
  1. 现在正常重启就可以使用刚才创建的root密码登录了

如果依然不能重置密码,请将上边创建的文件的内容修改成如下内容,并重复3-5步骤

UPDATE mysql.user
    SET authentication_string = PASSWORD('MyNewPass'), password_expired = 'N'
    WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

方案二:安全模式重置法(网上最常见的搜索结果)

思路:以安全模式启动MySQL,这样不需要密码可以直接以root身份登录,然后重设密码。

  1. 停掉MySQL服务:
sudo service mysql stop  

以上命令适用于Ubuntu和Debian。CentOS、Fedora和RHEL下使用mysqld替换mysql。

  1. 以安全模式启动MySQL:
sudo mysqld_safe --skip-grant-tables --skip-networking &  

注意我们加了--skip-networking,避免远程无密码登录 MySQL。

  1. 用root登录,无需密码:
mysql -u root
  1. 重设密码:
mysql> use mysql;  
mysql> update user set password=PASSWORD("mynewpassword") where User='root';  
mysql> flush privileges; 

注意,命令后需要加分号。

  1. 重设完毕后,我们退出,然后启动 MySQL 服务:
mysql> quit

quit不需要分号。

  1. 重启服务:
sudo service mysql restart
# 如果不能重启,可能需要手动杀死mysql相关进程,再重启

如果不是Debian系列,而是CentOS、Fedora和RHEL的话,需要用mysqld替换mysql

  1. 现在可以尝试用新密码登录了:
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