文章目录
- 创建新用户
- 使用 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 语句只添加 host
、user
和 authentication_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_cipher
、x509_issuer
和 x509_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 user
和 insert 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'
上面的命令将删除用户帐户及其权限。