如何将所有权限返回给MySQL中的root用户?

问题描述:

我已经登录到MySQL与使用--skip-grant-tables选项。但我不知道如何将所有权限返回给root用户。如何将所有权限返回给MySQL中的root用户?

错误

SQL查询:

GRANT ALL PRIVILEGES ON *。 *到 'root'@'localhost';

MySQL表示:文件

1290 - MySQL服务器与使用--skip-grant-tables选项运行,以便

它不能执行该语句

错误

SQL查询:编辑

GRANT ALL PRIVILEGES ON *。 *到 'root'@'localhost'WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

MySQL表示:文件

1290 - MySQL服务器与使用--skip-grant-tables选项运行,以便

它不能执行该语句

+1

人们似乎在这个问题/答案http://*.com/questions/1709078/how-can-i-restore-the-mysql-root-users-full-privileges – 2009-11-11 03:27:29

要运行GRANT查询,你只是运行MySQL与skip-grant-tables - 什么复杂有关......?

+2

的解决方案,他需要获得root权限。 – RageZ 2009-11-11 03:38:27

+0

...所以他不应该使用'skip-grant-tables' - 为什么他会想要那个_和''GRANT'?虽然我承认你的方法也适用。 – 2009-11-11 04:05:17

+3

他似乎忘记了root用户的密码。 – bluszcz 2014-02-12 12:57:36

当你运行MySQL使用--skip-grant-tables MySQL将不检查任何权限。所以基本上你可以做任何事情。

要回来,你就需要在mysql数据库运行查询像这样

select * from user where user = 'root' 

的root权限只是为了检查是否root用户仍然有 如果确定:

UPDATE user SET Grant_priv = 1, Super_priv = 1 WHERE user = 'root' 

你可以重启MySQL后没有--skip-grant-tables和root用户应该能够做一些补助,以便查询应该工作

如果你无法访问mysql服务器作为根目录,你应该删除或不能恢复mysql.user表中的所有根记录,删除所有这些记录并添加一条新记录。

你应该使用mysql PASSWORD()函数来散列您的明文密码。 查看更多信息http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

首先停止mysql服务器并使用--skip-grant-tables启动mysqld。

[[email protected] ~]# service mysqld stop; mysqld_safe --skip-grant-tables & 

哈希您的明文密码。

mysql> select PASSWORD('CLEARTEXT_PASSWORD'); 
+-------------------------------------------+ 
| PASSWORD('CLEARTEXT_PASSWORD')   | 
+-------------------------------------------+ 
| *1EADAEB11872E413816FE51216C9134766DF39F9 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 

使用mysql数据库来应用更改。

mysql> use mysql; 

删除所有根记录

mysql> delete from user where User='root'; 

添加新的记录是root用户可以从您的IP地址的所有权限访问。

mysql> insert into `user` VALUES('YOUR_IP_ADDRESS','root','*1EADAEB11872E413816FE51216C9134766DF39F9','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','Y','Y','Y','','','','',0,0,0,0,'',''); 

冲洗变化。

mysql> FLUSH PRIVILEGES; 

从mysql命令行退出。

mysql> exit; 

重新启动mysqld服务。

[[email protected] ~]# /etc/init.d/mysqld restart 

如果你运行这个mysql命令/ queries,你会得到一个新的访问mysql服务器。

+0

如果插入操作难以匹配所需的权限列,请参阅下面的答案。复制现有行,如果您只需要一个新的Grant,例如另一个允许主机列。 – user18099 2016-11-04 09:49:04

首先,停止MySQL服务器,然后用--skip-grant-tables选项启动它。

[[email protected] mysql5.7]# /etc/init.d/mysqld stop 
[[email protected] mysql5.7]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql 

然后,连接到您的实例没有密码:

[[email protected] mysql5.7]# mysql -u root 

然后,重置root用户的密码。

mysql> flush privileges; 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY ''; 
mysql> flush privileges; 

转为的MySQL正常模式然后连接不需要密码。

如果您--skip-赠款表的目标是插入一个新的授权,可以通过插入在mysql.user行这样做(见其他答案)

如果你的挑战是在给这个新授予所有必需的特权(许多Y/N列),然后您可以复制现有的根授予。并只调整你所需要的。

CREATE TEMPORARY TABLE mysql.tmpUser SELECT * FROM mysql.user WHERE host="old" and user="root"; 
UPDATE mysql.tmpUser SET host="new" WHERE user = "root"; 
INSERT INTO mysql.user SELECT * FROM mysql.tmpUser;