- MySQL 在安装时,会默认创建一个名为 root 的用户,该用户拥有超级权限,可以控制整个 MySQL 服务器。
- 在对 MySQL 的日常管理和操作中,为了避免有人恶意使用 root 用户控制数据库,我们通常创建一些具有适当权限的用户,尽可能地不用或少用 root 用户登录系统,以此来确保数据的安全访问。
- mysql是通过使用 用户名+主机名 来判断一个用户的身份,也是由此来判断一个用户的权限
- MySQL 提供了以下 3 种方法创建用户。
- 使用 CREATE USER 语句创建用户
- 使用 INSERT 语句在 mysql.user 表中添加用户
- 使用 GRANT 语句创建用户
使用CREATE USER语句
- 可以使用 CREATE USER 语句来创建 MySQL 用户,并设置相应的密码。
语法
CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] '<密码>' ] ,<用户名> [ IDENTIFIED BY [ PASSWORD ] '<密码>' ]
解析
参数 |
描述 |
<用户> |
指定创建用户账号,格式为 user_name'@'host_name。 这里的user_name是用户名,host_name为主机名,即用户连接 MySQL 时所用主机的名字 如果在创建的过程中,只给出了用户名,而没指定主机名,那么主机名默认为“%”,表示一组主机,即对所有主机开放权限 |
IDENTIFIED BY |
用于指定用户密码。新用户可以没有初始密码,若该用户不设密码,可省略此子句。 |
PASSWORD |
PASSWORD 表示使用哈希值设置密码,该参数可选。如果密码是一个普通的字符串,则不需要使用 PASSWORD 关键字。 |
<密码> |
表示用户登录时使用的密码,需要用单引号括起来,例如 '123456' |
注
- CREATE USER 语句可以不指定初始密码。但是从安全的角度来说,不推荐这种做法。
- 使用 CREATE USER 语句的权限用户必须拥有 mysql 数据库的 INSERT 权限或全局 CREATE USER 权限。
- 使用 CREATE USER 语句创建一个用户后,MySQL 会在 mysql 数据库的 user 表中添加一条新记录。
- CREATE USER 语句可以同时创建多个用户,多个用户用逗号隔开。
示例
mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
Query OK, 1 rows affected (0.06 sec)
- 在 MySQL 中,可以使用 password() 函数获取密码的哈希值
示例
mysql> SELECT
password('test1');
+-------------------------------------------+
| password('test1')
|
+-------------------------------------------+
| *06C0BF5B64ECE2F648B5F048A71903906BA08E5C
|
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
- 通过 PASSWORD 关键字使用密码的哈希值设置密码
示例
mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY PASSWORD
'*06C0BF5B64ECE2F648B5F048A71903906BA08E5C';
Query OK, 0 rows affected, 1 warning (0.00 sec)
- 新创建的用户拥有的权限很少,它们只能执行不需要权限的操作。如登录 MySQL、使用 SHOW 语句查询所有存储引擎和字符集的列表等。如果两个用户的用户名相同,但主机名不同,MySQL 会将它们视为两个用户,并允许为这两个用户分配不同的权限集合。
使用 INSERT 语句
- 可以使用 INSERT 语句将用户的信息添加到 mysql.user 表中,但必须拥有对 mysql.user 表的 INSERT 权限。通常 INSERT 语句只添加 Host、User 和 authentication_string 这 3 个字段的值
语法
INSERT INTO mysql.user
(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES
('主机名', '权限用户名', PASSWORD('密码'), '', '', '')
注
- User 和 Host 字段区分大小写,创建用户时要指定正确的用户名称或主机名
- 如果你使用的是 MySQL 5.7 之前的版本,将 authentication_string 字段替换成 Password 即可。
- 由于ssl_cipher、x509_issuer 和 x509_subject 这 3 个字段没有默认值,所以向 user 表插入新记录时,一定要设置这 3 个字段的值,否则 INSERT 语句将不能执行
示例
mysql> INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('host', 'username', PASSWORD('password'), '', '', '');
Query OK, 1 row affected, 1 warning (0.02 sec)
- 结果显示,新建用户成功。但是这时如果通过该账户登录 MySQL 服务器,不会登录成功,因为 test2 用户还没有生效。可以使用 FLUSH 命令让用户生效,命令如下:
FLUSH PRIVILEGES;
- 使用以上命令可以让 MySQL 刷新系统权限相关表。执行 FLUSH 命令需要 RELOAD 权限
使用GRANT语句
MySQL 提供了 GRANT 语句,可以在创建权限用户的同时,为用户添加权限
语法
GRANT <权限> ON database.table TO <用户> [IDENTIFIED BY [PASSWORD] '<密码>']
参数 |
描述 |
<权限> |
表示新用户的权限 |
database.table |
表示新用户的权限范围,即只能在指定的数据库和表上使用自己的权限 |
<用户> |
指定新用户的账号,由用户名和主机名构成;格式为 user_name'@'host_name。 |
IDENTIFIED BY |
用于指定用户密码。新用户可以没有初始密码,若该用户不设密码,可省略此子句。 |
PASSWORD |
PASSWORD 表示使用哈希值设置密码,该参数可选。如果密码是一个普通的字符串,则不需要使用 PASSWORD 关键字。 |
<密码> |
表示用户登录时使用的密码,需要用单引号括起来,例如 '123456' |
示例
mysql> GRANT SELECT ON *.* TO 'test3'@localhost IDENTIFIED BY 'test3';
Query OK, 0 rows affected, 1 warning (0.01 sec)
- 其中“*.*” 表示所有数据库下的所有表。结果显示创建用户成功,且 test3 用户对所有表都有查询(SELECT)权限