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

Posted

技术标签:

【中文标题】如何恢复 MySQL root 用户的完全权限?【英文标题】:How can I restore the MySQL root user’s full privileges? 【发布时间】:2010-12-15 02:38:26 【问题描述】:

我不小心删除了我的 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'

【问题讨论】:

第二个错误看起来像是密码问题。假设您已经拥有“root”@“localhost”帐户,这可能是我的错。使用 --skip-grant-tables 重新运行 mysqld,并且:“DROP USER 'root'@'localhost'; GRANT ALL PRIVILEGES ON . TO 'root'@'%';”反而?找出您应该授予访问权限的帐户的最佳方法是运行“SELECT User, Host FROM mysql.user WHERE User='root';”...这将为您提供应该在 @ 之后使用的主机名GRANT 命令中的符号。 当主题不是离题时,模组将主题标记为离题是一种不好的形式,除非可能有另一个 Stack Exchange 站点更适合该主题,在这种情况下应该识别它. (对模组感到羞耻。)这可能会发生在这里:dba.stackexchange.com ^ 同意,我投票决定重新开放。 如果它由于 DBA 站点的存在而被关闭,至少应该提到这一点并且 OP 指向那里。 (或可能在此处作为另一个问题的副本关闭) 【参考方案1】:

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

    停止mysqld 并使用--skip-grant-tables 选项重新启动它。 只需使用:mysql(即没有-p 选项,并且可能不需要用户名)连接到mysqld 服务器。

    在mysql客户端发出以下命令:

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

    FLUSH PRIVILEGES;

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

【讨论】:

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”。 这不起作用。正如 Steven 所说,对 user 表的更新会影响 0 记录。 root 用户仍然无法授予权限。 是的,它确实有效。如果您使用的是 Windows,只需将skip-grant-tables 临时添加到您的 mysql 配置文件的[mysqld] 部分,即可在命令行上无需密码即可访问 mysql。 我在 Grant 部分(不起作用)停留了 9 个多小时,而你的回答救了我……你是救生员。非常感谢【参考方案2】:

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

    停止 MySQL 服务 运行mysqld_safe --skip-grant-tables & 输入mysql -u root -p 并按回车键。 输入您的密码 在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');

【讨论】:

@Bipin,奇怪的是bin 文件夹中只有mysqld.exe,而不是mysqld_safe.exe。 “mysqld_safe”是什么意思? 对于 MySQL 5.5,您还需要两个 priv,Event_priv 和 Trigger_priv。 我想这会在 5.6.5 中中断 @Pacerier - 根据this post 你真的不需要mysqld_safe,只需运行正常的mysqld 二进制文件:mysqld.exe --skip-grant-tables ERROR 1054 (42S22): Unknown column 'Password' in 'field list'【参考方案3】:

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

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

FLUSH PRIVILEGES;

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

谢谢

【讨论】:

我不得不做一些事情。我不得不停止 mysqld 服务,然后运行 ​​mysqld_safe --skip-crant-tables &,然后上面的 UPDATE 命令,然后重新启动 mysql,然后运行 ​​GRANT ALL ON . TO 'user'@'localhost ';【参考方案4】:

我拒绝了 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 用户,然后我可以更新所有权限 你也救了我(linux Mint 20.1 mysql 8.0.23-0ubuntu0.20.04.1)。同样,--skip-grant-tables 在 Mint 中不起作用,mysql 和用户属性已更改(密码 attr. 现在是 authentication_string,PASSWORD func 已失效..)。最好使用 phpmyadmin 或 mysql refs 来检查正确的语法,因为我红色的几乎所有东西都已过时或不适用于我的环境。【参考方案5】:
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

只需使用相应的密码从 root 登录,然后对任何用户运行上述命令即可。

例如:

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

【讨论】:

但是如果'root'用户失去了特权,那么这怎么能工作,root用户不需要提升特权来做到这一点吗?这对我不起作用。【参考方案6】:

只需在每列权限中插入或更新mysql.userY

【讨论】:

【参考方案7】:

如果您在本地计算机上使用 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 步:问题已解决!!!!

【讨论】:

【参考方案8】:
    "sudo cat /etc/mysql/debian.cnf" 使用 debian-sys-maint 用户 此用户通过“mysql -u saved-username -p;”登录,然后输入保存的密码。 mysql> UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root'; mysql> 刷新权限; mysql> 退出 重启 谢谢

【讨论】:

【参考方案9】:

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

但也可以在/etc/my.cnf 中设置skip-grant-tablesskip-networking

【讨论】:

以上是关于如何恢复 MySQL root 用户的完全权限?的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB/MySQL用户和权限管理

恢复MySQL 8.0中root 用户的全部权限

mysql基础用户权限管理和root密码恢复

mysql误删root用户解决办法

如何恢复mysql数据库的root账户权限

/var下权限批量处理错误,chown -R root:root /var 导致mysql无法访问,mysql中数据很重要,如何能够恢复!