如何恢复MySQL root用户的全部权限?


108

我不小心从MySQL根用户中删除了某些特权,包括更改表的功能。有什么方法可以将用户恢复为原始状态(具有所有特权)?

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'

1
第二个错误看起来像是密码问题。假设您已经拥有“ root” @“ localhost”帐户,可能是我的错。重新运行用--skip-赠款表的mysqld,并且: “DROP USER '根' @ 'localhost'的; GRANT ALL PRIVILEGES ON TO '根' @ '%';” 代替?找出应该授予访问权限的帐户的最佳方法是运行“ SELECT user,Host from mysql.user WHERE User ='root';” ...,这将为您提供在@之后使用的主机名GRANT命令中的符号。
DMI

1
如果mods不在主题之外,则将主题标记为主题是不好的形式,除了可能存在另一个更适合该主题的Stack Exchange网站之外,在这种情况下应予以标识。(在mod上感到羞耻。)这可能是这样:dba.stackexchange.com
Jon Davis,

^同意,我投票决定重新开放。如果由于存在DBA站点而将其关闭,则至少应该提及该站点,并将OP定向到该站点。(或可能在此处关闭为另一个问题的副本)
不可分割的

Answers:


148

如果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';并运行它。


7
1.如何使用just:mysql连接到mysqld服务器2.当我发布UPDATE mysql.user SET Grant_priv ='1'WHERE User ='root'; 冲洗特权; 我得到了查询正常,0行受影响(0.00秒),匹配的行数:2已更改:0警告:0查询正常,0行受影响(0.00秒)。当我以root用户身份登录phpMyAdmin时,仍然看到“无特权”。
史蒂文

抱歉,完成上述步骤后,您应该可以运行GRANT ALL命令。要连接到mysqld,我的意思是您不需要密码-我不记得任何用户名是否可以使用,或者是否需要为“ root”。
DMI

2
这是行不通的。正如史蒂文所说,对用户表的更新将产生0条记录。根用户仍然无法授予。
塞林2012年

1
是的,它确实有效。而且,如果您使用的是Windows,则只需将skip-grant-tables其临时添加到[mysqld]mysql配置文件中,即可在不使用密码的情况下通过命令行访问mysql。
markus

1
我停留在Grant部分(没有工作)超过9个小时,您的回答救了我...您是救命稻草。非常感谢
Ali SH

91

如果您误删除了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');

1
@Bipin,奇怪的还有仅mysqld.exebin文件夹中,而不是mysqld_safe.exe。“ mysqld_safe”是什么意思?
Pacerier,2015年

4
对于MySQL 5.5,您还需要另外两个priv,Event_priv和Trigger_priv。
格雷格·贝尔

我想这会在5.6.5中打破
Otheus

1
@Pacerier -根据这个帖子,你并不真正需要的mysqld_safe:,只要运行正常mysqld的程序mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber '17

24

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

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

FLUSH PRIVILEGES;

在此命令之后,所有命令都显示root的数据库。

谢谢


1
我不得不做很多事情。我必须停止mysqld服务,然后运行mysqld_safe --skip-crant-tables&,然后执行上面的UPDATE命令,然后重新启动mysql,然后运行GRANT ALL ON 到'user'@'localhost';
尼克·伍德汉姆斯

5

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

sudo cat /etc/mysql/debian.cnf

你救我!GRANT既不在--skip-grant-tables模式下也不起作用,因此以ubuntu-system身份进入后,我可以再次创建我的root用户,然后我就可以更新所有特权
lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

只需使用相应的密码(如果有的话)从root用户登录,然后对任何用户使用以上命令即可。

例如:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
但是,如果“ root”用户失去了特权,那么该如何工作,root用户是否不需要提升的特权才能执行此操作?这对我没有用。
Terungwa

3

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


2

如果在本地计算机(MySQL版本5.7.14)上使用WAMP,则步骤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:问题已解决!!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.