在MySQL中创建新用户并为其提供对一个数据库的完全访问权限。

738
我想在MySQL中创建一个新用户,并且只给予他对一个数据库的完全访问权限,比如我用类似于create database dbTest;的命令创建了一个名为dbTest的数据库。那么应该使用什么MySQL命令来实现这个目标?
10个回答

911

尝试使用以下方法创建用户:

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' - “user”是您要创建的用户帐户的用户名。注意:必须在其中加入单引号。“hostname”告诉MySQL用户可以从哪些主机连接。如果只想从同一台机器连接,请使用localhost。
IDENTIFIED BY 'password' - 正如您所猜到的那样,这为该用户设置密码。

93
如果您允许网络访问并想要从任何主机建立连接,可以将“hostname”更改为“%”。例如,...TO 'dbuser'@'%' IDENTIFIED... '%'是主机通配符。 - physicsmichael
23
当你在处理用户和数据表时,别忘了刷新权限! :-) - corsiKa
37
这对我有用: CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON db_database1.* TO 'user1'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; - Mohamad Fakih
7
@DanMcGrath:如果用户已经存在并且有密码,那么“IDENTIFIED BY 'password'”从句是否是强制的?(注:该句为IT领域语言,涉及数据库安全相关术语,翻译时需保留原文意思) - nanosoft
13
在MySQL的未来版本中,使用GRANT创建新用户的功能将被删除(在编写本文时已不推荐使用)。将来需要使用两个命令进行操作,先使用CREATE USER创建用户,然后再使用GRANT分配权限。 - Darren Felton
显示剩余6条评论

445

语法

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

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

然后要授予数据库的所有访问权限(例如my_db),请使用GRANT语法,例如。
GRANT ALL ON my_db.* TO 'new_user'@'localhost';

在这里,ALL (priv_type) 可以替换为特定的权限,例如 SELECTINSERTUPDATEALTER 等。

然后重新加载新分配的权限:

FLUSH PRIVILEGES;

执行中

要运行上述命令,您需要运行mysql命令并将其输入到提示符中,然后通过quit命令或Ctrl-D退出。

要从shell中运行,请使用-e参数(将SELECT 1替换为上述命令之一):

$ mysql -e "SELECT 1"

从标准输入中获取或打印语句:
$ echo "FOO STATEMENT" | mysql

如果您在上述情况下遇到了“访问被拒绝”的问题,请指定-u(用于用户名)和-p(用于密码)参数,或者为了长期访问,请在~/.my.cnf文件中设置您的凭据,例如。
[client]
user=root
password=root

Shell集成

对于不熟悉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
你需要分别创建用户并授予权限吗?我发现授权命令似乎会自动创建用户,至少在mysql.user表中是这样的。 - Tim
@CreativityKills 如果按照上面的建议将密码添加到您的~/.my.cnf中,我将使用该密码进行工作。 - kenorb
在 shell 历史记录中留下密码的痕迹并不是一个好主意。 - dmirkitanov
1
@dmirkitanov,您可以通过添加一个空格来防止此事情发生,请参考:如何防止命令显示在bash历史记录中? - kenorb
如果您想为所有数据库授予权限,请使用以下命令:GRANT ALL ON *.* TO 'new_user'@'localhost'; 不要忘记运行 FLUSH PRIVILEGES; - Ravi Soni

65

创建用户并授予数据库所有权限。

登录到MySQL:

mysql -u root

现在创建并授权

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

本地测试用匿名用户

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

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

请注意

在开发中使用垃圾数据是可以的,但对于你关心的任何内容,请不要这样做。


3
你可以像这样创建一个匿名用户,但不要这么做!没有什么好的理由让一个拥有完全权限但没有密码的用户存在,如果某个不该访问你服务器的人得到了访问权限,那么这可能会毁掉你的一天/一年/业务/工作。何必为他们提供方便呢? - Luke Cousins
3
如果有人远程访问了我的MacBook,我需要担心的事情比我的开发数据库的内容更多。我要再强调一下,这只是用于本地测试,请勿在真实数据上进行此操作。 - superluminary
4
不要担心你的开发数据库内容,除了其他需要担心的事情。你的开发数据库可能(很可能会)包含一些真实数据库数据片段(例如用于复制错误),应该尽一切努力保护其安全。没有必要在没有密码的情况下访问数据库,这甚至不会节省时间,并且不值得潜在的麻烦。 - Luke Cousins
2
也许吧。在我的情况下,那只是垃圾数据,我可以承担这个风险。 - superluminary

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

忽略-p选项,如果MySQL用户没有密码,或者只需按下"[Enter]"按钮进行跳过。用花括号括起来的字符串需要替换为实际值。

13
你可以使用CREATE USER语句创建新用户,并使用GRANT授予他们权限。

创建用户 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; - cgl

11

对我而言,这起作用了。

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

哪里

  • spowner:用户名
  • 1234:spowner的密码
  • test:数据库'spowner'已被授予访问权限

4
如果您想在本地主机上创建一个新用户并为他授予特定数据库(而不是 Mysql 上所有数据库)的全部权限,则可以使用以下命令:
GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这将授予该用户在本地数据库中一个名为test_database(在您的情况下是dbTest)的所有权限。

运行以下命令以检查上述命令对该用户发出的权限。

SHOW GRANTS FOR 'user'@'localhost'

如果您想限制用户仅访问一个单独的表格,请使用以下方法

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

你的第一行代码存在语法错误和拼写错误。"PRIVILEGES ON 'test_datase'" 不应该有引号,应该在后面加上 ".*",例如:test_datase.*,并且 "test_datase" 是一个拼写错误,应该是 "test_database"。 - Brettins

1
如果省略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'

0
例如,您可以通过以下方式将apple数据库中所有表的所有权限(apple.*)授予用户john,使用GRANT命令。*您可能需要使用用户root登录:
GRANT ALL ON apple.* TO 'john'@'localhost';

或者:

GRANT ALL PRIVILEGES ON apple.* TO 'john'@'localhost';

此外,您可以按照下面的示例,将所有数据库中所有表的所有权限(*.*)授予用户john,使用GRANT命令。
GRANT ALL ON *.* TO 'john'@'localhost';

或者:

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

而且,您可以创建超级用户john,该用户可以像默认用户root一样拥有GRANT权限,如下所示。*MySQL具有SUPER权限,但它不是用于创建超级用户的权限。
GRANT ALL ON *.* TO 'john'@'localhost' WITH GRANT OPTION;

或者:

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

-2
尝试在 Windows 机器上运行的 MySQL Workbench 上创建 MySQL 数据库时,遇到了问题。
以下命令可在 Linux 机器上的 MySQL CLI 上正常运行:
CREATE USER 'my_user'@'%' IDENTIFIED BY 'fgj7dyfgteh';
CREATE DATABASE my-database ;
USE my-database ;
GRANT ALL PRIVILEGES ON 'my-database'.* TO 'my_user'@'%' IDENTIFIED BY 'my-password' ;

但是在运行在Windows机器上的MySQL Workbench上没有起作用。我不得不使用下面的命令。请注意如何操作。
`

符号和

'

这些命令中使用了:

CREATE DATABASE `my-database` ;
USE `my-database` ;
GRANT ALL PRIVILEGES ON `my-database`.`*` TO `my_user`@`%` IDENTIFIED BY 'my-password' ;

或者

CREATE SCHEMA `my-database` ;
USE `my-database` ;
GRANT ALL PRIVILEGES ON `my-database`.`*` TO `my_user`@`%` IDENTIFIED BY 'my-password' ;

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