11

我已经使用 --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
4

6 回答 6

21

对于 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无需密码登录后

于 2019-02-05T01:25:26.430 回答
8

如果您无法以 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 服务器的新访问权限。

于 2013-11-29T11:44:29.400 回答
6

首先,停止 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 的正常模式,然后无需密码即可连接。

于 2016-11-01T10:10:31.450 回答
5

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

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

select * from user where user = 'root'

只是为了检查 root 用户是否仍然存在(如果可以):

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

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

于 2009-11-11T03:40:10.017 回答
1

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

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

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;
于 2016-11-04T09:51:16.367 回答
-10

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

于 2009-11-11T03:27:42.923 回答