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

jca*_*314 10 mysql ubuntu

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

当我作为普通用户尝试时:

mysqld --skip-grant-tables
Run Code Online (Sandbox Code Playgroud)

我看到这个:

mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied)
Run Code Online (Sandbox Code Playgroud)

所以,我从 /etc/init.d/mysql 中挖出了这个例子并添加了--skip-grant-tables参数:

su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
Password: 
su: Authentication failure
Run Code Online (Sandbox Code Playgroud)

所以 su 不起作用,root密码也不起作用。我也试过这个:

sudo su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
No directory, logging in with HOME=/
Run Code Online (Sandbox Code Playgroud)

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

小智 16

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

sudo nano /etc/mysql/my.cnf
Run Code Online (Sandbox Code Playgroud)

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

[mysqld]
# For debugging and recovery only #
skip-grant-tables
skip-networking
###################################
Run Code Online (Sandbox Code Playgroud)

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

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

确保将这些行注释掉并在完成后再次重新启动 mysql,以重新保护服务器。


whe*_*rom 0

来自评论。

对于 init.rc 配置:

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

在像 Ubuntu 16.04 这样的新兴系统上,这需要在 /lib/systemd/system/mysql.service.