115

我不小心删除了 MySQL root 用户的一些权限,包括更改表的能力。有什么方法可以将此用户恢复到其原始状态(具有所有权限)?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'
4

9 回答 9

160

如果GRANT ALL不起作用,请尝试:

  1. 使用该选项停止mysqld并重新启动它。--skip-grant-tables
  2. 仅使用以下命令连接到mysqld服务器:(mysql即没有-p选项,并且可能不需要用户名)。
  3. 在 mysql 客户端中发出以下命令:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

之后,您应该能够运行GRANT ALL ON *.* TO 'root'@'localhost';并让它工作。

于 2009-11-10T16:13:44.617 回答
93

如果您root错误地删除了用户,您可以做一件事:

  1. 停止 MySQL 服务
  2. mysqld_safe --skip-grant-tables &
  3. 键入mysql -u root -p并按 Enter。
  4. 输入您的密码
  5. 在mysql命令行输入:use mysql;

然后执行这个查询:

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','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');

然后重启mysqld

编辑:2018 年 10 月 6 日

如果其他人需要这个答案,我今天使用innodb_version 5.6.36-82.010.1.24-MariaDB进行了尝试,如果你删除了反引号(也没有单引号,只需删除它们),它就可以工作:

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','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');
于 2011-08-03T14:12:42.117 回答
26

当我是root用户时,我还删除了未在mysql控制台中显示的root和数据库的权限,因此更改了用户名 mysql>mysql -u 'userName' -p;和密码;

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

在此命令之后,它全部显示在 root 中的数据库。

谢谢

于 2012-01-19T11:33:29.613 回答
8

我拒绝了 root 的插入和重新加载权限。所以更新权限后,FLUSH PRIVILEGES 不起作用(由于缺乏重新加载权限)。所以我在 Ubuntu 16.04 上使用 debian-sys-maint 用户来恢复 user.root 权限。您可以从此文件中找到 user.debian-sys-maint 的密码

sudo cat /etc/mysql/debian.cnf
于 2017-09-24T09:47:52.083 回答
3
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

只需使用相应的密码从 root 登录,然后简单地将上述命令运行到任何用户。

例如:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
于 2012-11-24T06:21:48.640 回答
3

只需在每列权限中插入或更新mysql.user值即可。Y

于 2012-04-05T19:16:06.057 回答
2

如果您在本地计算机上使用 WAMP(mysql 版本 5.7.14)第 1 步:打开 my.ini 文件第 2 步:通过删除分号取消注释此行“skip-grant-tables”第 3 步:重新启动 mysql服务器步骤 4:启动 mySQL 控制台步骤 5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

第6步:问题解决了!!!!

于 2017-12-27T11:10:12.937 回答
1
  1. "sudo cat /etc/mysql/debian.cnf" 使用 debian-sys-maint 用户
  2. 此用户通过“mysql -u saved-username-p;”登录,然后输入保存的密码。
  3. mysql> UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
  4. mysql> 刷新权限;
  5. mysql>退出
  6. 重启谢谢
于 2020-10-20T14:30:27.853 回答
0

RHEL 上的 MariaDB:

sudo systemctl stop mariadb.service
sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root

然后,例如。

GRANT ALL PRIVILEGES ON mysql.user TO 'root'@'localhost';
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
EXIT;

可悲的是,与 分离时没有优雅的重启&

sudo kill `pidof mysqld`
sudo systemctl start mariadb.service

但也可以设置在skip-grant-tables里面。skip-networking/etc/my.cnf

于 2021-09-23T17:44:09.847 回答