在MySQL中创建新用户并授予其对一个数据库的完全访问权限


628

我想在MySQL中创建一个新用户,并授予它对dbTest我使用诸如这样的命令创建的一个数据库的完全访问权限create database dbTest;。MySQL命令将执行该操作吗?

Answers:


829

尝试创建用户:

CREATE USER 'user'@'hostname';

尝试执行以下操作以使其可以访问数据库dbTest

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

如果在同一台计算机上运行访问MySQL的代码/站点,则主机名将为localhost。

现在,分解。

GRANT -这是用于创建用户并授予数据库,表等权限的命令。

ALL PRIVILEGES-这告诉用户将拥有所有标准特权。但是,这不包括使用GRANT命令的特权。

dbtest.*-这指示MySQL将这些权利应用于整个dbtest数据库。您可以根据需要将*替换为特定的表名或存储例程。

TO 'user'@'hostname'-“用户”是您要创建的用户帐户的用户名。注意:您必须在其中使用单引号。“主机名”告诉MySQL用户可以连接的主机。如果只想从同一台计算机上使用,请使用localhost

IDENTIFIED BY 'password' -如您所料,这将为该用户设置密码。


82
如果您允许网络访问并希望与任何主机建立连接,则可以将“主机名”更改为“%”。例如,... TO'dbuser'@'%'IDENTIFIED ...'%'是主机通配符。
Physicsmichael

17
处理用户和表时,请不要忘记刷新特权!:-)
corsiKa'4

31
这对我有用:CREATE USER'user1'@'localhost'由'password'标识;授予db_database1上的所有特权。冲洗特权;
Mohamad Fakih 2014年

4
@DanMcGrath:如果用户已经存在并且具有密码,IDENTIFIED BY'password'子句是强制性的吗?
nanosoft

8
在将来的MySQL版本中将删除使用GRANT创建新用户的权限(在撰写本文时已弃用)。将来,必须通过两次调用来完成,分别是CREATE USER和GRANT。
达伦·费尔顿

325

句法

要在MySQL / MariaDB 5.7.6及更高版本中创建用户,请使用CREATE USER语法

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

然后要授予对数据库的所有访问权限(例如my_db),请使用GRANTSyntax,例如

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

其中ALLpriv_type)可与特定的权限,如替换SELECTINSERTUPDATEALTER,等。

然后要重新加载新分配的权限,请运行:

FLUSH PRIVILEGES;

执行中

要运行以上命令,您需要运行mysql命令并将其键入提示符,然后通过quit命令或Ctrl- 登出D

要从shell运行,请使用-eparameter(用SELECT 1以上命令之一替换):

$ mysql -e "SELECT 1"

或从标准输入中打印语句:

$ echo "FOO STATEMENT" | mysql

如果您的访问遭到上述拒绝,请指定-u(对于用户)和-p(对于密码)参数,或者对于长期访问,请在中设置您的凭据~/.my.cnf,例如

[client]
user=root
password=root

壳牌整合

对于不熟悉MySQL语法的人,这里有一些易于记忆和使用的方便的shell函数(要使用它们,您需要加载下面附带的shell函数)。

这是示例:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

要使用上述命令,您需要将以下函数复制并粘贴到rc文件中(例如.bash_profile),然后重新加载Shell或为该文件提供源代码。在这种情况下,只需键入source .bash_profile

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

注意:如果您不想在Bash历史记录中保留痕迹(例如密码),请检查:如何防止命令显示在Bash历史记录中?


1
您是否需要分别创建用户和授予特权?我发现Grant命令似乎可以创建用户本身,至少在mysql.user表中看起来是这样的。
蒂姆(Tim)

如果您~/.my.cnf按照上述建议将密码添加到自己的密码中,则@CreativityKills将使用该密码。
kenorb

在外壳程序历史记录中留下密码痕迹不是一个好主意
dmirkitanov

@dmirkitanov您可以通过添加空格来防止这种情况,请参阅:如何防止命令显示在bash历史记录中?
kenorb

58

创建用户并授予数据库上的所有特权。

登录到MySQL:

mysql -u root

现在创建并授予

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

匿名用户(仅用于本地测试)

或者,如果您只想授予对数据库的完全不受限制的访问权限(例如,在本地计算机上用于测试实例),则可以向匿名用户授予访问权限,如下所示:

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

意识到

这对于开发中的垃圾数据很好。不要使用您关心的任何内容。


3
您可以像这样创建一个匿名用户,但是不能!没有充分的理由让用户拥有完全特权并且没有密码,但是如果有人访问了不应该拥有的服务器,则有一天可能会毁了您一天/一年/每天的业务/工作。为什么还要让他们更轻松?
路加·考辛斯

2
如果有人获得了对我的Macbook的远程访问权,那么我比开发数据库的内容要担心的事情还要多。我要重申一下,这仅用于本地测试,请勿对真实数据执行此操作。
superluminary 2014年

4
确实,还有其他所有需要担心的事情,也不必担心开发数据库的内容。您的开发数据库可能(可能会有)包含实时数据库数据的片段(例如,用于复制错误),应尽一切努力来确保安全。完全不需要密码即可访问数据库。它甚至不能节省时间。不值得潜在的麻烦。
路加·考辛斯

1
也许。就我而言,这是垃圾数据,我将承担风险。
superluminary 2014年

17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

忽略-p选项,如果mysql用户没有密码或者只是按“ [Enter]”按钮绕过。用大括号括起来的字符串需要替换为实际值。



6

对我来说,这很有效。

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

哪里

  • 所有者:用户名
  • 1234:所有者的密码
  • 测试:数据库“所有者”有权访问

2

如果您要创建一个新用户,则下面的命令将起作用:授予该用户对本地主机上特定数据库(不是Mysql中的所有数据库)的所有访问权限。

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这会将所有特权授予一个数据库test_database(在您的情况下dbTest)给localhost上的该用户。

通过运行以下命令,检查以上命令向该用户授予的权限。

SHOW GRANTS FOR 'user'@'localhost'

以防万一,如果您想限制用户只能访问一个表

GRANT ALL ON mydb.table_name TO 'someuser'@'host';

语法错误和第一行中的错字,“ PRIVILEGES ON'test_datase'”不应带引号,其后应带有“。*”,例如test_datase。*,并且是错字,应为“ test_database” ”。
Brettins

0

如果host省略了该部分,则默认为通配符%,允许所有主机。

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
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.