MySQL:授予数据库**全部**权限

702

我创建了一个数据库,例如 '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'

5
仅当您使用诸如“INSERT”、“UPDATE”或“DELETE”语句直接修改授权表时,才应使用“FLUSH PRIVILEGES;”。 - simhumileco
11个回答

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

这是我创建"超级用户"权限的方式(虽然我通常会指定一个主机)。

重要提示

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

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

出于安全原因,您不应该将此类型的用户帐户用于任何公众都可以访问的过程(例如网站)。建议您创建仅具有数据库权限的用户以供此类使用。


565

这是一个老问题,但我认为已接受的答案并不安全。它适用于创建超级用户,但如果要授予单个数据库的权限,则不适用。

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

% 似乎不包括 socket 通信,而 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';

35
+1是因为没有包括“WITH GRANT OPTION”,并且针对特定数据库而不是所有数据库(*)进行操作。 - Adonis K. Kakoulidis
1
请注意,除非您想从外部IP地址或本地子网中的其他计算机访问,否则您可能不需要第一个命令。如果您需要,我建议使用针对特定IP地址的命令,例如myuser@192.168.0.1(用于本地子网上的一个IP地址),而不是一般的myuser@%。 - Evan Donovan
@EvanDonovan,这里有很多东西都取决于使用情况和环境。例如,如果我没记错的话,Java驱动程序根本不支持套接字传输。但总的来说,我同意 - 在可能的情况下最好指定特定的IP,或者仅在127.0.0.1上运行服务器,并在监听非本地主机时设置服务器防火墙。 - akostadinov

155

这对一些人会很有帮助:

从MySQL命令行:

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

遗憾的是,此时newuser没有任何与数据库相关的权限。事实上,如果newuser尝试使用密码password登录,他们将无法进入MySQL shell。

因此,首要任务是为用户提供所需信息的访问权限。

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

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

一旦您确定了要为新用户设置的权限,请务必重新加载所有权限。

FLUSH PRIVILEGES;

您的更改现在已生效。

欲了解更多信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/grant.html

如果您不熟悉命令行,则可以使用客户端,例如MySQL WorkbenchNavicatSQLyog


7
使用grant命令时,不需要执行flush privileges - Pacerier
3
你要么完全抄袭了Linode的内容,要么是他们从你这里抄袭的:https://www.linode.com/docs/databases/mysql/install-mysql-phpmyadmin-ubuntu-14-04 - user562566
我需要再次使用GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;来进行身份验证(奇怪...但是确实如此)。 - rubo77

35

 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的数据库,然后执行像创建、选择和插入操作等命令。


24

这个SQL授权所有数据库,但只赋予基本权限。它们足以满足Drupal或WordPress的需求,并且作为一种好意,允许一个开发者账户用于本地项目。

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

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

在架构的特权方面起作用 :)

可选:在 mypasswd 之后,您可以添加 WITH GRANT OPTION


18

我只能通过添加GRANT OPTION才能使它工作,如果没有这个选项就会不断收到拒绝许可的错误。

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

16

你好,我使用了以下代码来在 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;

12
当您使用grant命令时,不需要执行flush privileges - Pacerier
注意:GRANT 中的确切列表因 MySQL 版本而异。 - Rick James

12

在工作中使用 MySQL Ver 8.0.21 时,我遇到了一个挑战。

我想将名为 my_app_db 的数据库的权限授予运行在 localhost 主机上的 root 用户。

但是,当我运行以下命令时:

use my_app_db;

GRANT ALL PRIVILEGES ON my_app_db.* TO 'root'@'localhost';

我遇到了以下错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'my_app_db.* TO 'root'@'localhost'' at line 1>

这是我的解决方法:

登录你的MySQL控制台。你可以将 root 更改为你想要登录的用户:

mysql -u root -p

输入您的mysql root密码

接下来,列出 MySQL 服务器上所有用户及其主机。与 PostgreSQL 不同的是,这通常存储在mysql数据库中。因此,我们需要首先选择mysql数据库:

use mysql;
SELECT user, host FROM user;

注意: 如果您不运行 use mysql,则会出现 no database selected 错误。

这应该会给你一个这样的输出:

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

接下来,根据从列表中得到的信息,授予您想要的用户权限。在授予权限之前,我们需要先选择数据库。对于我来说,我正在使用在localhost主机上运行的root用户:

use my_app_db;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
注意: 对于现代版本的MySQL,GRANT ALL PRIVILEGES ON database_name.* TO 'root'@'localhost'; 命令可能无法正常工作。在选择要使用的数据库后,在授予权限命令中,大多数现代版本的MySQL将database_name替换为*

然后,您可以退出MySQL控制台:

exit

就是这样。

希望这有所帮助。


8

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

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

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

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

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