如果不能使用 root 密码,如何使用 --skip-grant-tables 重新启动 MySQL?

如果不能使用 root 密码,如何使用 --skip-grant-tables 重新启动 MySQL?

我需要在--skip-grant-tables启用该选项的情况下在 Ubuntu 16.04 中重新启动 MySQL,但我不知道我的 root 密码,或者它不起作用。我该如何--skip-grant-tables在没有密码的情况下进行设置?

当我以普通用户身份尝试时:

mysqld --skip-grant-tables

我看到的是:

mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied)

因此,我从 /etc/init.d/mysql 中挖出了这个示例并添加了参数--skip-grant-tables

su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
Password: 
su: Authentication failure

因此 su 不起作用,root 密码也不起作用。我还尝试了以下方法:

sudo su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
No directory, logging in with HOME=/

如何使用--skip-grant-tables启动mysql?

答案1

当您不知道您的 root 密码(或'ERROR 1045 (28000): Access denied for user 'root'@'localhost'出现阻止访问的错误)时,您可以通过向 MySQL 配置文件添加选项来获取访问权限。首先打开它进行编辑:

sudo nano /etc/mysql/my.cnf

然后在其下方搜索[mysqld]并输入以下值:

[mysqld]
# For debugging and recovery only #
skip-grant-tables
skip-networking
###################################

如您所见,此处添加命令行参数的技巧是--从参数前面删除。现在重新启动 mysql 服务并且您可以访问授权表来重置 root 用户密码或执行几乎任何您需要执行的操作。(但是,您无法对授权表执行任何操作,因为它们尚未加载。)

谨防。在此模式下,任何登录用户都可以访问整个数据库。这就是我添加skip-networking上述选项的原因,这样远程用户在恢复时就无法访问表。

完成后,请务必注释掉这些行并重新启动 mysql,以重新保护服务器。

答案2

来自评论。

对于 init.rc 配置:

最简单的方法是临时修改 /etc/init.d/mysql 以包含该选项--skip-grant-tables,然后使用此脚本启动它(/etc/init.d/mysql start)。

在 Ubuntu 16.04 等新兴系统上,这需要在 中完成 /lib/systemd/system/mysql.service

相关内容