恢复已删除的MySQL 'root'用户和密码

39

我在运行OS X上的MAMP/MySQL本地开发环境中不小心删除了root 用户。没有其他用户可以用来重新进入MySQL。

这是一个轻微的噩梦,没有root似乎什么都做不了。

我找到了这个链接:http://hack2live.blogspot.com/2009/04/restore-repair-reset-mysql-root.html ,看起来正是我需要的。

我也不认为重新安装MAMP会起作用,因为我的粗略搜索显示很多人尝试过但没有成功。

有人知道如何在OSX上友好地重新创建root@localhost到MAMP的MySQL中吗? 我基本上不知道MySQL在MAMP中存储的位置或如何在终端中执行正确的命令来修复它。

更新

我尝试了下面的几个选项来恢复root,但都没有成功,并决定恢复整个MAMP应用程序的备份。所以我已经获得了root权限,可以打开phpmyadmin等。

9个回答

75

我有一个简单粗暴的方法

找一个拥有SysAdmin权限的人,并执行以下操作:

  1. 在[mysqld]部分下的my.cnf中添加'skip-grant-tables'

  2. 重新启动mysql

  3. 输入无密码的mysql并按回车键

  4. 运行以下命令:

  5. DELETE FROM mysql.user 
    WHERE  user = 'root' 
           AND host = 'localhost'; 
    
    INSERT INTO mysql.user 
    SET user = 'root', 
        host = 'localhost', 
        password = Password('whatevernewpassword'), 
        Select_priv = 'y',
        Insert_priv = 'y',
        Update_priv = 'y',
        Delete_priv = 'y',
        Create_priv = 'y',
        Drop_priv = 'y',
        Reload_priv = 'y',
        Shutdown_priv = 'y',
        Process_priv = 'y',
        File_priv = 'y',
        Grant_priv = 'y',
        References_priv = 'y',
        Index_priv = 'y',
        Alter_priv = 'y',
        Show_db_priv = 'y',
        Super_priv = 'y',
        Create_tmp_table_priv = 'y',
        Lock_tables_priv = 'y',
        Execute_priv = 'y',
        Repl_slave_priv = 'y',
        Repl_client_priv = 'y',
        Create_view_priv = 'y',
        Show_view_priv = 'y',
        Create_routine_priv = 'y',
        Alter_routine_priv = 'y',
        Create_user_priv = 'y',
        Event_priv = 'y',
        Trigger_priv = 'y',
        Create_tablespace_priv = 'y';
    
  6. 退出 mysql

  7. 在 [mysqld] 部分中从 my.cnf 中移除 'skip-grant-tables'

  8. 重新启动 mysql

就这些!


1
对于使用MAMP的任何人。在MAMP/conf/中创建自己的my.cnf文件,并在其中输入[mysqld] skip-grant-tables - Thumbz
这是对我有效的解决方法。如果您根本没有root用户,则必须创建一个,许多说明似乎忽略了这一点。感谢Rolando! - ftrotter
谢谢,这让我摆脱了困境。顺便说一下,我正在使用Windows Server 2008。 - Moz Morris
4
我不得不添加 ssl_cipher=''、x509_issuer='' 和 x509_subject='',这样它才能正常工作 :) - rupweb
4
以上代码运行良好,但是使用MySQL版本大于5.7的用户需要进行两个更改: 将密码字段改为认证字符串字段:authentication_string = '', 并将以下参数添加到代码中: ssl_cipher = 'y', x509_issuer = 'y', x509_subject = 'y'。 - Surendra
显示剩余4条评论

11

这篇文章是关于OS X下MySQL root用户恢复、修复和重置的翻译版。

打开TextEdit.app并在格式中选择“转为纯文本”。
将以下内容剪切并粘贴到TextEdit中,并将其保存到您的HOME文件夹中,命名为restore_root_privileges.sql

update mysql.user set Super_priv='y' where user='root';
update mysql.user set Select_priv='y' where user='root';
update mysql.user set Insert_priv='y' where user='root';
update mysql.user set Update_priv='y' where user='root';
update mysql.user set Delete_priv='y' where user='root';
update mysql.user set Create_priv='y' where user='root';
update mysql.user set Drop_priv='y' where user='root';
update mysql.user set Reload_priv='y' where user='root';
update mysql.user set Shutdown_priv='y' where user='root';
update mysql.user set Process_priv='y' where user='root';
update mysql.user set File_priv='y' where user='root';
update mysql.user set Grant_priv='y' where user='root';
update mysql.user set References_priv='y' where user='root';
update mysql.user set Index_priv='y' where user='root';
update mysql.user set Alter_priv='y' where user='root';
update mysql.user set Show_db_priv='y' where user='root';
update mysql.user set Super_priv='y' where user='root';
update mysql.user set Create_tmp_table_priv='y' where user='root';
update mysql.user set Lock_tables_priv='y' where user='root';
update mysql.user set Execute_priv='y' where user='root';
update mysql.user set Repl_slave_priv='y' where user='root';
update mysql.user set Repl_client_priv='y' where user='root';
update mysql.user set Create_view_priv='y' where user='root';
update mysql.user set Show_view_priv='y' where user='root';
update mysql.user set Create_routine_priv='y' where user='root';
update mysql.user set Alter_routine_priv='y' where user='root';
update mysql.user set Create_user_priv='y' where user='root';

保存并退出TextEdit.app。

停止您的mysqld服务器。如何操作取决于您用于MySQL的安装方式。您可能在系统偏好设置中有一个PreferencePane。如果没有,您必须查阅MySQL安装文档。

打开Terminal.app(应用程序/实用工具),输入以下命令:

sudo mysqld --skip-grant-tables &  #start your MySQL server without access control
mysql -vv < ~/restore_root_privileges.sql
sudo mysqladmin -p shutdown

像往常一样启动你的MySQL服务器,比如从PreferencePanes中启动。
在Terminal.app中输入以下内容:

mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
mysql> quit;

就这样。没有任何保证。如果您操作不当,可能会丢失所有数据。 首先备份您的mysql文件。

如果您遇到了以下情况:

-bash: mysql: command not found

这意味着您的安装不正确,您需要找到MySQL二进制文件所在的位置,并将该目录添加到您的PATH变量中。


非常感谢。在Ubuntu Linux下使用XAMPP,按照相应的步骤操作,这个方法对我有效 :D - hytromo
在我的 Mac 上,mysqld 拒绝以 root 用户身份运行。通过在 sudo 命令中添加“-u mysql”来使用 mysql 用户解决了这个问题。 - nschum

6
我刚遇到了相同的问题。我正在使用Windows 7上的Xammp。我不小心删除了phpmyadmin中的root用户。
看起来我已经找到了一种简单的解决方法:
停止xammp控制中的Apache和MySQL
进入.../xammp/mysql文件夹
您会看到"resetroot"文件。运行此文件
应用程序完成后,重新启动mysql和apache 进入phpmyadmin,您将看到root用户已恢复
现在,您可以再次访问所有数据库

很好的回答Alex,那正是我一直在寻找的。 - Awais Usmani

4

MySQL 5.7已将密码字段替换为authentication_string(在mysql.user表中),因此这对我有用。

INSERT INTO mysql.user 
SET user = 'root', 
host = 'localhost', 
authentication_string =Password('Yours_own_password'), 
Select_priv = 'y',
Insert_priv = 'y',
Update_priv = 'y',
Delete_priv = 'y',
Create_priv = 'y',
Drop_priv = 'y',
Reload_priv = 'y',
Shutdown_priv = 'y',
Process_priv = 'y',
File_priv = 'y',
Grant_priv = 'y',
References_priv = 'y',
Index_priv = 'y',
Alter_priv = 'y',
Show_db_priv = 'y',
Super_priv = 'y',
Create_tmp_table_priv = 'y',
Lock_tables_priv = 'y',
Execute_priv = 'y',
Repl_slave_priv = 'y',
Repl_client_priv = 'y',
Create_view_priv = 'y',
Show_view_priv = 'y',
Create_routine_priv = 'y',
Alter_routine_priv = 'y',
Create_user_priv = 'y',
Event_priv = 'y',
Trigger_priv = 'y',
Create_tablespace_priv = 'y',
ssl_cipher = '',
x509_issuer = '',
x509_subject = '';

3
使用MAMP。在创建另一个用户时,我犯了删除root用户的常见错误,结果被锁定了!
所以我找到了这篇帖子并尝试按照说明进行操作,但是...
我得到了以下错误: 当尝试执行mysql命令时,“-bash:mysql:command not found”错误,稍后我会得到以下错误
在尝试为根用户设置适当权限并在shell中使用该用户执行任何操作时,'@ localhost'的用户''拒绝DELETE命令。
因此,在我可以使用Eric和Rolando发布的命令之前(谢谢你们),我做了以下工作:
我需要正确启动mysqld,因此我必须执行以下操作:
1.停止使用以下方法找到的mysqld进程: ps aux | grep mysql
还要停止mamp界面应用程序..
2.停止使用以下方法找到的任何mysql进程:
kill -9 [pid]
确保在继续之前没有运行任何mysql进程。
3.然后,我必须从我实际安装mysql二进制文件的位置正确重启mysqld,此命令将在不要求密码的情况下启动mysld(有点像安全模式):
/Applications/MAMP/Library/bin/mysqld --skip-grant-tables --skip-networking &
我尝试使用my.cnf文件,但无法使其正常工作。
4.然后我必须进入shell中的mysql:
/Applications/MAMP/Library/bin/mysql -u root -p (如果提示输入密码,请直接按回车键)
5.然后执行Eric和Rolando发布的命令,这次我没有收到任何错误“'@ localhost'的用户''拒绝DELETE命令”,如果您收到了此错误,则未正确启动mysqld。
6.然后停止mysqld服务:
/Applications/MAMP/Library/bin/mysqld stop 然后像往常一样使用GUI重新启动MAMP
最后,一切都恢复正常了...我感到如释重负!!!
2个小时的恐慌和在控制台中尝试和错误,值得学习的经验。
如果我弄错了任何命令或说明(因为我在撰写此帖子时在追踪我的步骤),请告诉我。我很乐意更新帖子。
最后,不要放弃,可以做到!!!

1

我想提供一下我的解决方法。如果你不小心删除了MAMP PRO中的root用户,并且正在使用带有Time Machine备份的OSX。只需在Finder中转到以下文件夹:

/Library/Application Support/appsolute/

然后从顶部菜单栏进入Time Machine并恢复MAMP PRO文件夹的最近备份。这为我节省了很多麻烦。


1

昨天我也做了同样的事情,因为我是新手使用Mac和SQL服务器。在尝试设置新用户和密码时,我不小心按错了权限中的按钮,导致删除了根用户。

我在这台电脑上没有任何有用的工作,所以并不担心删除我的网站。

  • 我首先卸载了MAMP Pro(我在Launchpad中有一个图标)。
  • 然后我从应用程序文件夹中删除了MAMP目录。
  • 接着我从互联网下载重新安装了MAMP。
  • 我还从Safari中删除了所有的cookie、缓存等。
  • 最后我关闭了电脑并重新启动。

现在,一旦MAMP启动,我就可以通过启动页面上的链接访问phpMyAdmin。


这个能行吗,而且不会丢失你现有的设置、用户和数据库? - Debiprasad

0

在CentOS 6上适用于我。我不得不去掉Create_tablespace_priv = 'y',因为我的版本会有问题,否则一切都很好。


0

好的,停止运行你的MySQL,然后打开它附带的安装文件。应该有一个名为resetroot.bat的批处理文件。运行它,你的问题就会消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接