【问题标题】:How to get all privileges back to the root user in MySQL?如何将所有权限返回给 MySQL 中的 root 用户?
【发布时间】:2010-12-15 07:55:18
【问题描述】:

我已经使用 --skip-grant-tables 选项登录到 MySQL。但我不知道如何将所有权限恢复给 root 用户。

我试过了:

GRANT ALL PRIVILEGES ON * . * TO 'root'@'localhost';

MySQL 说:

# 1290 - The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

尝试:

GRANT ALL PRIVILEGES ON * . * TO 'root'@'localhost'
WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

MySQL 说:

# 1290 - The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

【问题讨论】:

标签: mysql privileges


【解决方案1】:

适用于 mysql 8.0.12+
我已经尝试了文档(不起作用)我尝试了各种其他选项,都失败了。

PASSWORD() 已弃用,SET PASSWORD 已禁用,ALTER USER 也已禁用。

  1. 停止mysql服务
  2. 以这种方式开始:/usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  3. 登录 (mysql) 并执行: update user set authentication_string='' where User='root';
  4. killall mysqld
  5. 再次启动服务

现在你可以在无密码登录后使用set passwordalter user

【讨论】:

  • 这就是答案!为什么在世界上不推荐使用 PASSWORD()?好奇怪。
  • @mbrinson 我在 MySQL 中注意到的奇怪事情的数量是巨大的。事实是它不是专业维护的,它是数百个丑陋黑客的组合。 INNODB 计数很慢,因为 mysql 只使用一个线程,处理周期延迟很大,解决方案是什么?他们发明了一个复杂的结果缓存。使用 Mysql 8,他们删除了缓存(破坏了数万个应用程序)并发明了多线程,但是只有多线程用于没有 WHERE 的查询,所以只用于计数。我可以举出无数这样的例子,它是由“代码黑客”维护的
  • 我收到“未选择数据库”错误。
  • @Overload119:在UPDATE user...之前执行USE mysql;
【解决方案2】:

如果你不能以 root 身份访问 mysql 服务器,你应该删除或无法恢复 mysql.user 表中的所有 root 记录,删除所有记录并添加新记录。

您应该使用 mysql PASSWORD() 函数来散列您的明文密码。 查看更多信息http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

首先停止 mysql 服务器并使用 --skip-grant-tables 启动 mysqld。

[root@mysql ~]# service mysqld stop; mysqld_safe --skip-grant-tables &

散列您的明文密码。

mysql> select PASSWORD('CLEARTEXT_PASSWORD');
+-------------------------------------------+
| PASSWORD('CLEARTEXT_PASSWORD')            |
+-------------------------------------------+
| *1EADAEB11872E413816FE51216C9134766DF39F9 |
+-------------------------------------------+
1 row in set (0.00 sec)

使用 mysql 数据库应用更改。

mysql> use mysql;

删除所有根记录

mysql> delete from user where User='root';

添加 root 用户可以使用您的 IP 地址的所有权限访问的新记录。

mysql> insert into `user` VALUES('YOUR_IP_ADDRESS','root','*1EADAEB11872E413816FE51216C9134766DF39F9','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','');

刷新更改。

mysql> FLUSH PRIVILEGES;

从mysql命令行退出。

mysql> exit;

重启mysqld服务。

[root@mysql ~]# /etc/init.d/mysqld restart

如果您运行这个 mysql 命令/查询,您将获得对 mysql 服务器的新访问权限。

【讨论】:

  • 如果插入很难匹配所需的权限列,请参阅下面的答案。复制现有行,如果您只需要一个新的授予,例如另一个允许的主机列。
  • 选择密码('CLEARTEXT_PASSWORD'); ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '('CLEARTEXT_PASSWORD')' 附近使用正确的语法
【解决方案3】:

首先,停止 MySQL 服务器,然后使用 --skip-grant-tables 选项启动它。

[root@backups1 mysql5.7]# /etc/init.d/mysqld stop
[root@backups1 mysql5.7]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql

然后,无需密码即可连接到您的实例:

[root@backups1 mysql5.7]# mysql -u root

然后,重置root用户的密码。

mysql> flush privileges;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '';
mysql> flush privileges;

切换到 MySQL 的普通模式,然后无密码连接。

【讨论】:

  • 如果我以 root 身份使用 skip-grant-tables 选项登录,那么我将无法执行任何语句。错误是:“MySQL 服务器正在使用 --skip-grant-tables 选项运行,因此无法执行此语句”
  • 在这种情况下你需要运行刷新权限
【解决方案4】:

当你使用--skip-grant-tables 运行mysql 时,mysql 不会检查任何权限。所以基本上你可以做任何事情。

要取回 root 权限,您需要像这样在 mysql DB 中运行查询

select * from user where user = 'root'

只是为了检查root用户是否还在 如果可以:

UPDATE user SET Grant_priv = 1, Super_priv = 1 WHERE user = 'root'

在没有--skip-grant-tables 的情况下可以重新启动 mysql 并且 root 用户应该能够进行一些授权,因此您的查询应该可以工作

【讨论】:

  • 在 MariaDb 中,正确的语句是 UPDATE user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE user = 'root',因为它使用 ENUM('Y','N')。您的原始版本已执行,但表 'Y'/'N' 中的值未更新,但这个小修改成功了。
【解决方案5】:

如果您的 --skip-grant-tables 的目标是插入新的授权,您可以通过在 mysql.user 中插入一行来实现(请参阅其他答案)

如果您的挑战是为这个新授予授予所有必需的权限(许多 Y/N 列),那么您可以复制现有的根授予。并且只调整你需要的。

CREATE TEMPORARY TABLE mysql.tmpUser SELECT * FROM mysql.user WHERE host="old" and user="root";
UPDATE mysql.tmpUser SET host="new" WHERE user = "root";
INSERT INTO mysql.user SELECT * FROM mysql.tmpUser;

【讨论】:

  • 这个解决方案非常适合像 Vagrant 这样的环境自动化。
【解决方案6】:

要运行GRANT 查询,您只需不要使用skip-grant-tables 运行mysql——这有什么复杂的...?

【讨论】:

  • 他需要获得root权限。
  • ...所以他不应该使用skip-grant-tables——他为什么想要那个 GRANT?虽然我承认你的方法也有效。
  • 他好像忘记了root用户的密码。
  • 问题似乎是关于取回特权标志。您可以使用skip-grant登录。但您不能授予。您可以在 mysql.user 中为新的 root 授权行插入一行,但查询需要匹配许多权限列。每个特权一个 Y/N。
猜你喜欢
  • 2018-10-15
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多