授予数据库“所有”特权


611

我已经创建了数据库,例如“ mydb”。

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'myuser'@'%' IDENTIFIED BY PASSWORD '*HASH';
GRANT ALL ON mydb.* TO 'myuser'@'%';
GRANT ALL ON mydb TO 'myuser'@'%';
GRANT CREATE ON mydb TO 'myuser'@'%';
FLUSH PRIVILEGES;

现在,我可以从任何地方登录数据库,但是无法创建表。

如何授予该数据库和(将来)表的所有特权。我无法在“ mydb”数据库中创建表。我总是得到:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'

10
当您向CURRENT_USER授予资助时,您会得到什么?
对角

5
你试过跑步FLUSH PRIVILEGES吗?
罗曼

1
@Andy感谢“为CURRENT_USER授予SHOW”;-可以帮助我查看我的错字。
marioosh 2011年

2
flush privileges使用grant命令时不需要@Romain 。x4
Pacerier,2015年

2
您应该使用FLUSH PRIVILEGES;,如果您修改直接使用语句,如授权表只INSERTUPDATEDELETE
simhumileco

Answers:


910
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;

这就是我创建“超级用户”特权的方式(尽管我通常会指定一个主机)。

重要的提示

虽然此答案可以解决访问问题,但可以WITH GRANT OPTION创建一个MySQL用户,用户可以编辑其他用户的权限

GRANT OPTION特权使您可以授予其他用户或从其他用户中删除自己拥有的那些特权。

出于安全原因,您不应将这种类型的用户帐户用于任何公众可以访问的过程(即网站)。建议您为这种使用创建仅具有数据库特权的用户


35
@Romain您在这里并没有真正吸引到很多人-我没有将用户myuser命名为-发问者只是使用用户名作为示例-为了保持一致性,我使用了相同的示例用户名。
对角

22
很公平。但是,还必须考虑其他人,可能是新手,这些人以后可能会读到这个问题。那不是SO的重点吗?
罗曼

7
我也不认为这个答案是一个好答案。它为所有数据库和所有表赋予“管理员”特权,这不是要求的。
daks

5
我将此答案编辑为说mydb。*而不是,因为这是一个广受赞誉和广泛关注的答案,而且我认为安全性-尤其是像MySQL这样的优美工具-极为重要。希望读者能够调查答案的详细信息,而不是复制粘贴,但我希望偶尔生活在现实中。
乔丹

4
@Romain设置MySQL服务器的用户可能足够聪明,以至于意识到他们应该替换myuser为自己的自定义用户名。
AStopher

524

这是个老问题,但我认为公认的答案并不安全。创建超级用户很有用,但是如果要在单个数据库上授予特权,则不好。

grant all privileges on mydb.* to myuser@'%' identified by 'mypasswd';
grant all privileges on mydb.* to myuser@localhost identified by 'mypasswd';

%似乎没有涵盖套接字通信,那localhost是为了。WITH GRANT OPTION仅对超级用户有益,否则通常存在安全风险。

MySQL 5.7+ 更新似乎警告:

不建议使用GRANT语句修改除特权以外的现有用户属性,并在以后的版本中将其删除。使用ALTER USER语句执行此操作。

因此设置密码应该使用单独的命令。感谢@ scary-wombat的评论。

ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';

希望这可以帮助。


26
+1表示不包含WITH GRANT OPTION指定数据库而不是指定数据库,而不是指定所有数据库(*)。
Adonis K. Kakoulidis

@IanBussieres的语法“%似乎不包括本地主机用于的套接字通信”,目前尚不清楚。这到底是什么意思?
Thufir 2014年

2
@Thufir,搜索unix socketslocalhost在Linux上使用myslq客户端时,尝试使用unix套接字而不是与服务器的TCP连接。
akostadinov

1
请注意,除非您希望从外部IP地址或从本地子网上的其他计算机进行访问,否则可能不需要第一个命令。如果这样做,我建议您使用针对您要允许的特定IP地址的命令,例如myuser@192.168.0.1(用于本地子网上的一个),而不通常是myuser @%。
Evan Donovan

1
mysql> ALTER USER'root'@'localhost'由'new_password'标识;
可怕的袋熊

121

这对某些人会有所帮助:

从MySQL命令行:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

可悲的是,此时newuser没有权限对数据库执行任何操作。实际上,如果newuser甚至尝试登录(使用密码,密码),他们将无法访问MySQL Shell。

因此,首先要做的是为用户提供他们将需要的信息的访问权限。

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

该命令中的星号分别表示它们可以访问的数据库和表,该特定命令允许用户读取,编辑,执行和执行所有数据库和表中的所有任务。

最终确定了要为新用户设置的权限后,请务必确保重新加载所有权限。

FLUSH PRIVILEGES;

您的更改将立即生效。

欲获得更多信息: http //dev.mysql.com/doc/refman/5.6/en/grant.html

如果您对命令行不满意,则可以使用MySQL工作台NavicatSQLyog等客户端


5
flush privileges使用grant命令时不需要。x4
Pacerier

1
您是从Linode批发复制,还是从您复制:linode.com/docs/databases/mysql/…–

我需要再次使用GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(strange ...,但是是真的)
rubo77 '18 -10-22

30

 1.创建数据库

CREATE DATABASE db_name;

 2.创建数据库db_name的用户名

GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' IDENTIFIED BY 'password';

 3.使用数据库

USE db_name;

 4.最后,您进入数据库db_name,然后执行诸如create,select和insert操作之类的命令。


今天,这给了我一个警告:“不建议使用GRANT语句修改特权以外的现有用户属性,并且在以后的版本中将删除它。对此操作使用ALTER USER语句。” 因此,我应该了解我现在应该创建一个用户,然后授予权限吗?
felwithe

你怎么能告诉MySQL username应该具有所有特权db_name而不是DROP db_name;特权?
tonix

21

此SQL授予所有数据库的权限,但仅授予基本权限。它们足以满足Drupal或Wordpress的需要,并且很好,它允许一个开发人员帐户参与本地项目。

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

20
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

适用于模式特权:)

可选:mypasswd添加完后WITH GRANT OPTION



14

您好,我使用此代码在mysql中拥有超级用户

GRANT EXECUTE, PROCESS, SELECT, SHOW DATABASES, SHOW VIEW, ALTER, ALTER ROUTINE,
    CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP,
    EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, CREATE USER, FILE,
    LOCK TABLES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN,
    SUPER
        ON *.* TO mysql@'%'
    WITH GRANT OPTION;

然后

FLUSH PRIVILEGES;

11
flush privileges使用grant命令时不需要。x4
Pacerier

注意:GRANT不同MySQL版本之间的确切列表有所不同。
里克·詹姆斯

6

仅从远程服务器访问mydb数据库

GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'192.168.2.21';

从远程服务器访问所有数据库。

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';

4

要将数据库:上的所有特权授予mydb用户:myuser,只需执行:

GRANT ALL ON mydb.* TO 'myuser'@'localhost';

要么:

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';

PRIVILEGES关键字是没有必要的。

我也不知道为什么其他答案建议将IDENTIFIED BY 'password'其放在命令末尾。我相信这不是必需的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.