菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
1366
0

Ubuntu 如何重设 MySQL 的 root 密码

原创
05/13 14:22
阅读数 3431

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

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
  1. 确保 MySQL 对该文件有读取权限
    
    # 如果不确定,改成‘777’
    chmod 777 mysql-init

或者直接把文件所属权限转移给mysql用户和组

chown mysql:mysql mysql-init

4. 通过下面命令启动 MySQL
```bash
mysqld --init-file=/home/ubuntu/mysql-init &
  1. 成功启动之后,删除刚才创建的文件
    rm -f mysql-init
  2. 现在正常重启就可以使用刚才创建的 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

  2. 以安全模式启动MySQL:

    sudo mysqld_safe --skip-grant-tables --skip-networking &  

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

  3. 用 root 登录,无需密码:

    mysql -u root
  4. 重设密码:

    mysql> use mysql;  
    mysql> update user set password=PASSWORD("mynewpassword") where User='root';  
    mysql> flush privileges; 

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

  5. 重设完毕后,我们退出,然后启动 MySQL 服务:

    mysql> quit

    quit 不需要分号。

  6. 重启服务:

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

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

  7. 现在可以尝试用新密码登录了:

    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

发表评论

0/200
1366 点赞
0 评论
收藏
为你推荐 换一批