文章目录

  • 创建新用户
  • 使用 CREATE USER 语句创建用户
  • 创建新用户,并且使用哈希值设置密码
  • 创建一个只能在数据库所在主机访问数据库的用户
  • 创建一个只能从指定 IP 连接数据库的用户
  • 创建一个可以从任意 IP 连接数据库的用户
  • 创建一个没有密码的用户
  • 在 mysql.user 表中添加用户
  • 使用 GRANT 语句创建用户
  • 创建一个对所有数据库拥有查询权限的用户
  • 创建一个对某个数据库拥有全部权限的用户
  • 创建一个对某个数据库拥有部分权限的用户
  • 创建一个对某个数据库拥有部分权限的用户,但是该用户可以从任意 IP 登录数据库
  • 创建用户时,使用密文设置密码
  • 创建一个对某个数据表拥有部分权限的用户
  • 修改用户
  • 修改密码
  • 使用 rename 语句修改用户名和主机
  • 使用 update 语句修改主机名称
  • 删除用户


创建新用户

MySQL 在安装时,会默认创建一个名为 root 的用户,该用户拥有超级权限,可以控制整个 MySQL 服务器。

在对 MySQL 的日常管理和操作中,为了避免有人恶意使用 root 用户控制数据库,我们通常创建一些具有适当权限的用户,尽可能地不用或少用 root 用户登录系统,以此来确保数据的安全访问。

MySQL 提供了以下三种方法创建用户:

1.使用 CREATE USER 语句创建用户
2.使用 INSERT INTO 语句直接往 mysql.user 表中添加用户
3.使用 GRANT 语句创建用户

1.MySQL 的用户表示格式为:user_name@host,也就是说【用户名+主机名】必须唯一。关于 host 的详解请参见《MySQL的用户表(user)》。

2.如果两个用户的用户名相同,但主机名不同,MySQL 会将它们视为两个用户,并允许为这两个用户分配不同的权限集合。

3.新创建的用户默认拥有数据库 information_schema 只读权限;默认拥有数据库 test 全部的权限,而且还无法撤销这些权限。

使用 CREATE USER 语句创建用户

创建用户的命令语句格式如下:

mysql> CREATE USER 'user_name'@'host' IDENTIFIED BY 'password'; # 密码必须加引号
mysql> CREATE USER user_name IDENTIFIED BY 'password'; # host默认为%
mysql> CREATE USER user_name; # host默认为%,没有密码
mysql> CREATE USER user_name@localhost IDENTIFIED BY 'password'; # 用户名和主机名将引号省略掉
mysql> CREATE USER user_name@'%' IDENTIFIED BY 'password'; # 主机名含有%,必须加引号才可以;@'%'表示任意IP地址

说明:
1.user_name 指定要创建的用户名,用户名必须要有;用户名的引号可以省略
2.host 指定登录数据库的主机名,即指定该用户在哪个主机上可以登陆,通常是主机的 IP 地址。如果是本地用户可用 localhost;如果想让该用户可以从任意远程主机登陆,可以使用通配符 % 3.创建用户时,只指定了用户名,而没指定主机名,那么主机名默认为 %,表示对所有主机开放权限
4.创建用户时,主机名除非含有 %,否则可以省略引号
4.password 指定登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆数据库;密码必须加上引号

创建新用户,并且使用哈希值设置密码

在实际应用中,我们应避免明文指定密码,可以通过 PASSWORD 关键字使用密码的哈希值设置密码。

在 MySQL 中,可以使用 password() 函数获取密码的哈希值。例如,查看 123456 哈希值的 SQL 语句如下:

mysql> select password('123456');
+-------------------------------------------+
| password('123456')                        |
+-------------------------------------------+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 就是字符串“123456”的哈希值,接着创建用户时,使用哈希值作为密码:

mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
Query OK, 0 rows affected, 1 warning (0.00 sec)

用户创建成功后就可以使用密码“123456”登录了。

创建一个只能在数据库所在主机访问数据库的用户

例如,创建一个名为 linux 的用户,该用户只能在数据库服务器所在主机访问数据库,登录密码为:123456

mysql> CREATE USER 'linux'@'localhost' IDENTIFIED BY '123456';

注意:
1.127.0.0.1 表示只能通过该 IP 地址连接数据库服务器,不可以使用 localhost 连接,即使 localhost 指向 127.0.0.1 也不行
2.localhost 表示可以使用 localhost 连接数据库服务器,也可以使用 127.0.0.1 连接数据库服务器

创建一个只能从指定 IP 连接数据库的用户

mysql> CREATE USER 'pig'@'192.168.1.101' IDENTIFIED BY '123456';

创建一个可以从任意 IP 连接数据库的用户

mysql> CREATE USER 'pig'@'%' IDENTIFIED BY '123456'; 
mysql> CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 无法执行
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

创建一个没有密码的用户

mysql> CREATE USER 'pig'@'%' IDENTIFIED BY ''; 
mysql> CREATE USER 'pig'@'%';

在 mysql.user 表中添加用户

可以使用 INSERT 语句将用户的信息添加到 mysql.user 表中,但必须拥有对 mysql.user 表的 INSERT 权限。通常 INSERT 语句只添加 hostuserauthentication_string 这 3 个字段的值。

MySQL 5.7 的 user 表中的密码字段从 password 变成了 authentication_string,如果你使用的是 MySQL 5.7 之前的版本,将 authentication_string 字段替换成 password 即可。

使用 INSERT 语句创建用户的代码如下:

mysql> INSERT INTO mysql.user(host, user,  authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('host', 'user_name', PASSWORD('password'), '', '', '');

由于 mysql 数据库的 user 表中,ssl_cipherx509_issuerx509_subject 这 3 个字段没有默认值,所以向 user 表插入新记录时,一定要设置这 3 个字段的值,否则 INSERT 语句将不能执行。

下面使用 INSERT 语句创建名为 lwx 的用户,主机名是 localhost,密码也是 123456。SQL 语句如下:

mysql> INSERT INTO mysql.user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('localhost', 'lwx', PASSWORD('lwx'), '', '', '');
Query OK, 1 row affected, 1 warning (0.02 sec)

结果显示,新建用户成功。但是这时如果通过该账户登录 MySQL 服务器,不会登录成功,因为 lwx 用户还没有生效。

可以使用 FLUSH 命令让用户生效,命令如下:

mysql> FLUSH PRIVILEGES;

使用以上命令可以让 MySQL 刷新系统权限相关表。执行 FLUSH 命令需要 RELOAD 权限。

注意:
1.密码必须使用函数 password() 转换成哈希值,如果不是要这个函数,直接将密码字符串存储到字段 authentication_string 中,使用的时候根本无法使用,因为在登录数据库的时候 mysql 命令会自动将输入的密码串转换成哈希值再和 user 表中的 authentication_string 字段的值进行比较

2.user 字段值区分大小写,如果你设置的是大写字母,那么登录时输入的也必须是大写字母

3.host 字段值区分大小写,如果字段值含有大写字母,用户创建成功后,无法使用命令 drop user 语句删除;但是在登录时候,则没有大小写限制。

例如,添加用户时,你将 host 的值指定为 lOcalhost,如下所示:

mysql> INSERT INTO mysql.user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('lOcalhost', 'lwx', PASSWORD('lwx'), '', '', '');

创建成功后,你可以正常登录数据库:

mysql> [root@htlwk0001host ~]# mysql -hlocalhost -ulwx -plwx;

但是无法使用 drop user 语句删除:

mysql> drop user 'lwx'@'lOcalhost';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,authentication_string from mysql.user;
+---------------+--------------+-------------------------------------------+
| user          | host         | authentication_string                     |
+---------------+--------------+-------------------------------------------+
| root          | localhost    | *6969E01196B0CE74725D5CD9F8C58F1D7529C352 |
| root          | liaowenxiong | *6969E011096ECE74725D5CD9F8C58F1D7529C352 |
| root          | 127.0.0.1    | *6969E01196BECE74725D5CD9F8C58F1D7529C352 |
| root          | ::1          | *6969E01196BECE74725D5CD9F8C58F1D7529C352 |
| qppdd         | %            | *E076A4B08AE3A5232C8C9A2E8F66453026E6DDC4 |
| qsspw         | %            | *F252153EE4DB6A240EF45B402E625E901D052B38 |
| qsspw         | localhost    | *F252153EE4DB6A240EF45B402E625E901D052B38 |
| zentao        | 127.0.0.1    | *BB2C46D0478D229369733842BB14115A52D901C6 |
| root          | %            | *6969E01196BECE74725D5CD9F8C58F1D7529C352 |
| mysql.session | localhost    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| lwx           | lOcalhost    | *95A0014C845E6CF09BDE5EA63128614AF92E6C8F |
+---------------+--------------+-------------------------------------------+
12 rows in set (0.00 sec)

使用 GRANT 语句创建用户

虽然 create userinsert into mysql.user 语句都可以创建普通用户,但是这两种方式不便授予用户权限,而 grant 语句可以在创建新用户的同时给用户授权。

注:通过命令 grant 创建用户时必须加上 identified by 语句,而且密码必须加引号。

创建一个对所有数据库拥有查询权限的用户

下面使用 grant 语句创建名为 lwx 的用户,主机名为 localhost,密码为 lwx。该用户对所有数据库的所有表都有 select 权限。SQL 语句如下所示:

mysql> GRANT SELECT ON *.* TO 'lwx'@localhost IDENTIFIED BY 'lwx';
Query OK, 0 rows affected, 1 warning (0.01 sec)

创建一个对某个数据库拥有全部权限的用户

创建一个名为 lwx 的新用户,登录密码为 123456,该用户可以从 192.168.0.0 ~ 192.168.0.255 之间的网段访问数据库。该用户对数据库 test 拥有全部的权限:

mysql> grant all on test.* to lwx@'192.168.0.%' identified by "123456";

创建一个对某个数据库拥有部分权限的用户

mysql> grant select,insert,update on db_name.* to user_name@host_name identified by "password";

创建一个对某个数据库拥有部分权限的用户,但是该用户可以从任意 IP 登录数据库

mysql> grant select,insert,update,delete on test.* to lwx@'%' identified by "password";

表示创建一个新用户 lwx,登录密码是 password,该用户可以在任意 IP 地址登陆数据库系统,但是该用户只能对数据库 test 的数据进行查询操作、插入操作、更新操作、删除操作。

创建用户时,使用密文设置密码

在创建用户时也可以使用密文密码,你需要通过函数 password() 先获得密文密码,再使用关键词 PASSWORD 设置,例如,获取字符串 123 的密文:

mysql> select password('123');
+-------------------------------------------+
| password('123')                           |
+-------------------------------------------+
| *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

获取到密文密码后,通过关键词 PASSWORD 设置密码:

mysql> GRANT SELECT ON *.* TO 'lwx'@localhost IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257';

创建成功后,该用户就可以使用密码 123 登录数据库了

创建一个对某个数据表拥有部分权限的用户

mysql> grant update,delete on db_name.tbl_name to user_name@host_name identified by "password";

修改用户

修改密码

语法格式:

mysql> SET PASSWORD FOR 'user_name'@'host' = PASSWORD('newpassword');

修改当前登陆用户自己的密码的语法格式:

mysql> SET PASSWORD = PASSWORD("newpassword");

例如,将用户 pig@% 的密码改成 123456

mysql> SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");

也可以直接通过用户表修改密码:

mysql> update mysql.user set password=password('new_password') where user="user_name" and host="host_name";

使用 rename 语句修改用户名和主机

语法格式:

rename user 'user_name'@'host' to 'newuser_name'@'new_host';

使用 update 语句修改主机名称

如果要对用户所用的登录终端(登录 IP 地址)进行限制,可以更新 user 表中相应用户的 host 字段:

update user set host='37.164.59.204' where user='lwx';

删除用户

mysql> DROP USER 'user_name'@'host'

上面的命令将删除用户帐户及其权限。