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

我不小心删除了 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'
221760 次浏览

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

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

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

    FLUSH PRIVILEGES;

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

如果你错误地删除了你的 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');

then restart the mysqld

EDIT: October 6, 2018

如果其他人需要这个答案,我今天试用了 Inodb _ 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');

i also remove privileges of root and database not showing in mysql console when i was a root user, so changed user by mysql>mysql -u 'userName' -p; and password;

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


FLUSH PRIVILEGES;

在这个命令之后,它全部显示数据库的根目录。

谢谢

只需在每列特权中插入或更新值为 Ymysql.user

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

只需使用相应的密码(如果有的话)从 root 用户登录,然后简单地运行上面的命令,不管用户是什么。

例如:

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

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

sudo cat /etc/mysql/debian.cnf

如果您在本地计算机上使用 WAMP (mysql 版本5.7.14) Step 1: open my.ini file 步骤2: 通过删除分号来取消注释这一行‘ Skip-Grant-tables’ 步骤3: 重新启动 mysql 服务器 步骤4: 启动 mySQL 控制台 第五步:

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

第六步: 问题解决!

  1. “ sudo cat/etc/mysql/debian.cnf”来使用 debian-sys-maint 用户
  2. 此用户通过“ mysql-u saved-username-p;”登录,然后输入保存的密码。
  3. User SET Grant _ priv = ‘ Y’,Super _ priv = ‘ Y’WHERE User = ‘ root’;
  4. Mysql > 刷新特权;
  5. Mysql > exit
  6. 重启 谢谢

MariaDB on RHEL:

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-tablesskip-networking设置在 /etc/my.cnf内。