![如果不能使用 root 密码,如何使用 --skip-grant-tables 重新启动 MySQL?](https://linux22.com/image/1507732/%E5%A6%82%E6%9E%9C%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8%20root%20%E5%AF%86%E7%A0%81%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20--skip-grant-tables%20%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%20MySQL%EF%BC%9F.png)
我需要在--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
。