重设 MySQL root 密码

最开始的时候其实并不是想重设 MySQL 的 root 密码,我们需要在一个新的 CentOS 上安装 MySQL。于是我们下载了最新的 MySQL 5.6.15 rpm 包。可是我们安装完后,按照以往的初次安装 MySQL 设置密码的方式,怎么也无法登陆 MySQL。删除数据目录重装后也没有用。于是当时我们就只好重设了 root 的密码。这个错误犯的太乌龙了,下次安装软件的时候,一定要浏览对应版本号的官方安装文档,即便是以前有过安装这个软件的经验

在讲如何重设密码之前,我们先看下 MySQL 的 rpm 包是如果处理 root 密码的吧。从 MySQL 5.6.8 开始,新的 rpm 安装包在安装的时候,会在调用 mysql_install_db 时加上参数 –random-passwords。这意味着 MySQL 会为 root 账号生成一个随机的默认密码(存放在 $HOME/.mysql_secret,一般情况都是 /root/.mysql_secret),并且将 root 标记为密码已过期,同时删除匿名账号。

我们在初次安装 MySQL 之后需要使用随机生成的密码登陆 MySQL,然后使用 SET PASSWORD 设置新的密码才能正常使用 MySQL。
更多详细的信息可以查看 MySQL 官方的安装文档: Installing MySQL on Linux Using RPM Packages

下面我们讲如何重设 MySQL root 密码。

第一种方法

  1. 关闭 MySQL sudo service mysql stop 或者我们也可以先通过 ps -u mysql 找到 MySQL 的 pid, 然后(注意不是 kill -9, 是 kill) sudo kill PID
  2. 创建 MySQL 初始化文件
    echo -e "update mysql.user set password=password('123456') \
    where user='root';\nflush privileges;" > /tmp/mysql-reset-password
    上面的命令会生成文件 /tmp/mysql-reset-password 里面有两行内容
    update mysql.user set password=password('123456') where user='root';
    flush privileges;
  3. 启动 MySQL
    sudo mysqld_safe --pid-file=/tmp/mysql.reset.password.pid --init-file=/tmp/mysql-reset-password
  4. MySQL 启动之后,所有的 root 密码都会被设置成 123456
  5. 使用新密码登陆 MySQL,验证密码是否已经重置。
  6. 按第一步的方式停止 MySQL,删除刚刚创建的 MySQL 初始化文件 rm /tmp/mysql-reset-password
  7. 正常方式重启 MySQL

需要注意的地方是

  1. MySQL 初始化文件必须要 mysql 用户能够访问到。在上面的例子中,我们把文件创建在 /tmp 目录。有些同学喜欢用 root 登陆 Linux,结果造成 mysql 用户无法访问初始化文件(权限不足)。所以创建完初始化文件之后,可以用 ls -l /tmp/mysql-reset-password 确认 mysql 用户对这个文件有读权限。修改权限的方式为 chmod 0644 /tmp/mysql-reset-password
  2. 第三步启动 MySQL 的时候,必须要指定 --pid-file。因为在 MySQL 安装在 CentOS 之后,/etc/my.conf 中将 –pid-file 指向了一个不存在的目录,所以我们手动启动 mysqld_safe 的时候要指定 –pid-file 的保存位置,不然 MySQL 会启动失败。

另外一种重置 MySQL root 密码的方法

第二种方法

  1. 关闭 MySQL
  2. 手动启动 MySQL
    sudo mysqld_safe --pid-file=/tmp/mysql.pid --skip-networking --skip-grant-tables
  3. 然后就可以在另外一个终端里登陆 MySQL 了。这时就可以重置 root 密码了
  4. 重置完后,记得重启 MySQL

顺便我们温习一下 MySQL 设置密码的方式

我们可以使用 set password 语句,比如

set password for 'root'@'%' = password('123456');

上面的语句,等同于下面的语句
update mysql.user set password=password('123456')
  where user='root' and host='%';
flush privileges;

另外一种设置密码的方式是使用 grant 语句
grant usage on *.* to 'jinjie'@'%' identified by '123456';

在测试环境中,我们可以使用一个偷懒的方式给 root 设置密码,下面的语句给了 root 最大的权限,是不安全的,只应该使用在无关安全的测试环境中。

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注