无法在 ubuntu 16 上使用 --skip-grant-tables 重置 root 密码

Posted

技术标签:

【中文标题】无法在 ubuntu 16 上使用 --skip-grant-tables 重置 root 密码【英文标题】:Can't reset root password with --skip-grant-tables on ubuntu 16 【发布时间】:2017-06-18 12:08:03 【问题描述】:

我正在尝试在 mysqlPasswordReset 之后重置 root 密码,但是当我尝试使用 --skip-grant-tables 启动服务器时,服务器无法启动

Ubuntu 16.04.1 LTS(GNU/Linux 4.4.0-59-generic x86_64) mysql Ver 14.14 Distrib 5.7.17,适用于 Linux (x86_64)

服务器正在运行

$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

停止服务器

$ sudo /etc/init.d/mysql stop
[ ok ] Stopping mysql (via systemctl): mysql.service.

尝试从 --skip-grant-tables 开始

sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking &
[1] 9856

无密码连接

$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
[1]+  Exit 1                  sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking

我也尝试从mysql_safe开始(error.log为空)

sudo mysqld_safe --skip-grant-tables
2017-02-01T16:33:31.382105Z mysqld_safe Logging to syslog.
2017-02-01T16:33:31.383942Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2017-02-01T16:33:31.386058Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2017-02-01T16:33:31.388009Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

【问题讨论】:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)的可能重复 在使用安全模式时可以使用root连接吗?你试过没有--skip-networking吗? @davejal 是的,我试过不使用 --skip-networking 并且无法在安全模式下连接到 mysql 服务器 【参考方案1】:

发现mysql服务停止时mysql.sock被删除,mysqld_safe无法创建(找不到原因),所以我的解决方法是备份sock文件夹,在启动mysqld_safe之前恢复

启动服务器

$ sudo service mysql start

转到袜子文件夹

$ cd /var/run

备份袜子

$ sudo cp -rp ./mysqld ./mysqld.bak

停止服务器

$ sudo service mysql stop

恢复袜子

$ sudo mv ./mysqld.bak ./mysqld

启动mysqld_safe

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

初始化mysql shell

mysql -u root

修改密码

FLUSH PRIVILEGES;

SET PASSWORD FOR root@'localhost' = PASSWORD('my_new_password');

【讨论】:

我必须这样设置密码:***.com/questions/37879448/… 上一条命令在 Kubuntu 18.04 上得到 ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded 我相信这个方法更简单——superuser.com/a/1175035/320611 在mysql 5.7.24中,密码列必须改为authentication_string 执行此操作后 mysql 服务器没有启动【参考方案2】:

对于带有 MySQL 8.0.17-0ubuntu2 的 Ubuntu 19,最终对我有用的是许多答案的组合:

    在 MySQL 的配置文件中(我的机器上是/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld] 下,添加:

    skip-grant-tables = 1 plugin-load-add = auth_socket.so

    重启 MySQL 服务;

    连接到 MySQL:mysql -uroot;

    运行:

UPDATE mysql.user SET authentication_string=null WHERE User='root';
FLUSH PRIVILEGES;

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass123';

    停止MySQL并在配置文件中注释skip-grant-tables

    再次启动 MySQL,现在应该可以工作了:mysql -u root -ppass123

【讨论】:

请注意,如果您看到 UPDATE 语句没有更改任何行(例如 Query OK, 0 rows affected),则表示您没有 root 用户。在这种情况下,请按照 this other answer 中的说明创建它,然后再次运行这些查询。 在找到这个答案之前,我无法告诉你我犯错了多长时间。谢谢。 @logicboke 简单来说应该够了:skip-grant-tables 谢谢谢谢谢谢!!这个答案今天救了我的培根。 谢谢!尝试解决这个问题超过一天。【参考方案3】:

pedronalbert's 上面的答案对我有用,但最后一步现在已弃用并引发以下警告:

警告 |第1287章'SET PASSWORD FOR = PASSWORD('')' 已弃用,将在未来的版本中删除。请改用 SET PASSWORD FOR = ''

改用这个命令:

SET PASSWORD FOR root = '<plaintext_password>';

【讨论】:

看起来他们删除了一项重要功能。使用--skip-grant-tables 未加载身份验证插件,我们无法使用set password,因此似乎无法恢复密码。看起来我们需要在旧的 mysql 服务器上执行password('password'),然后复制粘贴 auth 字符串,然后手动更新表。【参考方案4】:

我尝试了很多方法,包括 @pedronalbert 的方法,但仍然无法正常工作。

我解决它的方法是在/etc/my.cnf中添加“skip-grant-tables”然后启动mysql服务并用连接mysql” mysql -u root" 为 https://www.codero.com/knowledge-base/content/33/296/en/how-to-reset-your-root-mysql-password.html

它适用于我的 VM CentOS 7。

【讨论】:

这种配置 skip-grant-tables 的方法也适用于 Ubuntu 19 和 MySQL 8。 这个答案不够详细,很可能不起作用。你不能像它说的那样随机添加skip-grant-tables。检查下面的答案以了解要使用的实际完整过程。

以上是关于无法在 ubuntu 16 上使用 --skip-grant-tables 重置 root 密码的主要内容,如果未能解决你的问题,请参考以下文章

在Ubuntu16.04上使用rz上传文件,XXX was skipped

ubuntu server 16.04 mysql的默认密码

ubuntu server 16.04 mysql的默认密码

无法在 ubuntu docker 容器上使用 systemd [关闭]

无法在 Ubuntu 16.04 AWS EC2 实例上使用 puppeteer 启动 chromium headless

无法在 Ubuntu 16 上更新或安装任何软件包