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

Ste*_*ven 105 mysql privileges mysql-error-1045

我不小心从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'
Run Code Online (Sandbox Code Playgroud)

DMI*_*DMI 145

如果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';并让它工作.

  • 1.如何用mysql连接到mysqld服务器2.当我发布UPDATE mysql.user SET Grant_priv ='1'WHERE User ='root'; FLUSH特权; 我得到了查询确定,0行受影响(0.00秒)行匹配:2更改:0警告:0查询正常,0行受影响(0.00秒).当我以root用户身份登录phpMyAdmin时,我仍然看到"没有权限". (7认同)
  • 这不起作用。正如史蒂文所说,对用户表的更新影响 **0** 条记录。root 用户仍然无法授予权限。 (3认同)
  • 是的,它确实有效。如果你在 Windows 上,只需将 `skip-grant-tables` 临时添加到你的 mysql 配置文件的 `[mysqld]` 部分,以便在没有密码的命令行上访问 mysql。 (2认同)

小智 87

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

  1. 停止MySQL服务
  2. mysqld_safe --skip-grant-tables &
  3. 类型mysql -u root -p,然后按回车.
  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');
Run Code Online (Sandbox Code Playgroud)

然后重启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');
Run Code Online (Sandbox Code Playgroud)

  • 对于MySQL 5.5,您还需要两个priv,Event_priv和Trigger_priv. (4认同)
  • @Bipin,奇怪的是`bin` 文件夹中只有`mysqld.exe`,而不是`mysqld_safe.exe`。“mysqld_safe”是什么意思? (2认同)
  • 错误1054(42S22):“字段列表”中的未知列“密码” (2认同)

小智 22

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

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

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

在此命令之后,它都以root身份显示数据库.

谢谢


Var*_*mar 8

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

sudo cat /etc/mysql/debian.cnf
Run Code Online (Sandbox Code Playgroud)


Ras*_*hen 5

GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

只需使用相应的密码从root用户登录(如果有的话),只需将上述命令运行到用户的任何位置即可.

例如:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果“ root”用户失去了特权,那么该怎么办?root用户是否不需要提升特权才能执行此操作?这对我没有用。 (2认同)