我想在 MySQL 中创建一个新用户并授予它对一个数据库的完全访问权限,例如 dbTest
,我使用 create database dbTest;
之类的命令创建该数据库。执行此操作的 MySQL 命令是什么?
试试这个来创建用户:
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'
- 正如您已经猜到的那样,这会设置该用户的密码。
句法
要在 MySQL/MariaDB 5.7.6 及更高版本中创建用户,请使用 CREATE USER
syntax:
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';
然后授予对数据库的所有访问权限(例如 my_db
),使用 GRANT
Syntax,例如
GRANT ALL ON my_db.* TO 'new_user'@'localhost';
其中 ALL
(priv_type) 可以替换为特定权限,例如 SELECT
、INSERT
、UPDATE
、ALTER
等。
然后重新加载新分配的权限运行:
FLUSH PRIVILEGES;
执行
要运行上述命令,您需要运行 mysql
命令并在提示符中键入它们,然后通过 quit
命令或 Ctrl-D 注销。
要从 shell 运行,请使用 -e
参数(将 SELECT 1
替换为上述命令之一):
$ mysql -e "SELECT 1"
或从标准输入打印语句:
$ echo "FOO STATEMENT" | mysql
如果您在上面遇到 Access denied,请指定 -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 历史记录中留下痕迹(例如密码),请检查:How to prevent commands to show up in bash history?
~/.my.cnf
中,它将使用密码。
GRANT ALL ON *.* TO 'new_user'@'localhost';
授予权限,请使用此选项,不要忘记运行 FLUSH PRIVILEGES;
创建用户并授予数据库的所有权限。
登录到 MySQL:
mysql -u root
现在创建并授予
GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';
匿名用户(仅用于本地测试)
或者,如果您只想授予对数据库的完全不受限制的访问权限(例如,在本地计算机上的测试实例上,您可以授予匿名用户访问权限,如下所示:
GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'
意识到
这对于开发中的垃圾数据很好。不要对你关心的任何事情这样做。
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"
忽略 -p 选项,如果 mysql 用户没有密码或者只是按“[Enter]”按钮绕过。用大括号括起来的字符串需要用实际值替换。
对我来说,这很有效。
CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost';
FLUSH PRIVILEGES;
在哪里
spowner : 用户名
1234 : spowner 的密码
测试:数据库“spowner”有权访问
如果您想创建一个新用户,则以下命令将起作用,让他拥有对本地主机上特定数据库(不是 Mysql 中的所有数据库)的所有访问权限。
GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';
这将向 localhost 上的该用户授予一个数据库 test_database
(在您的情况下为 dbTest
)的所有权限。
通过运行以下命令检查上述命令向该用户发出的权限。
SHOW GRANTS FOR 'user'@'localhost'
以防万一,如果您想限制用户只能访问一个表
GRANT ALL ON mydb.table_name TO 'someuser'@'host';
如果省略 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'