我不小心删除了 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'
如果
GRANT ALL
不起作用,请尝试:
mysqld
并使用 --skip-grant-tables
选项重新启动。 mysqld
服务器: mysql
(即没有 -p
选项,并且可能不需要用户名)。在 mysql 客户端中发出以下命令:
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
之后,您应该能够运行
GRANT ALL ON *.* TO 'root'@'localhost';
并让它工作。
如果您错误地删除了
root
用户,您可以做一件事:
mysqld_safe --skip-grant-tables &
mysql -u root -p
并按 Enter 键。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.0和10.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');
当我是root用户时,我还删除了root权限和数据库未显示在mysql控制台中,因此通过
mysql>mysql -u 'userName' -p;
更改了用户和密码;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
执行此命令后,所有数据库都显示在根目录中。
谢谢
我拒绝了 root 的插入和重新加载权限。因此,更新权限后,FLUSH PRIVILEGES 不起作用(由于缺乏重新加载权限)。所以我在Ubuntu 16.04上使用debian-sys-maint用户来恢复user.root权限。你可以从这个文件中找到user.debian-sys-maint的密码
sudo cat /etc/mysql/debian.cnf
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;
只需使用相应的密码(如果有)从 root 登录,然后对任何用户运行上述命令即可。
例如:
GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
如果您在本地计算机上使用 WAMP(mysql 版本 5.7.14) 第1步:打开my.ini文件 第 2 步:通过删除分号来取消注释“skip-grant-tables”行 第三步:重启mysql服务器 第 4 步:启动 MySQL 控制台 第5步:
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
第6步:问题解决了!!!!
只需在每列权限中插入或更新
mysql.user
值 Y
。
saved-username
-p;”登录,然后输入保存的密码。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
内。
如果删除了 root 用户(假设尝试设置具有 root 权限的新用户),在 ubuntu/debian 上,您应该:
systemctl stop mysql
。/etc/mysql/mysql.conf.d/mysqld.cnf
上编辑 mysqld.cnf。skip-grant-tables
会话之后立即添加 [mysqld]
。systemctl restart mysql
。mysql
。UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
。之后不要忘记编辑
mysqld.cnf
,注释skip-grant-tables
并再次重新启动服务器。
注意:对我来说,在
--skip-grant-tables
服务器无法工作期间添加mysqld
。当尝试连接服务器时崩溃了。