MySQL/mariadb知识点——操作篇(1)用户管理

在了解mysql的用户管理语句之前,先来了解一下mysql的用户账号格式,即:

username@host 

username对应的用户能够通过那个host登录mysql。

host:次mysql用户能够通过哪些客户端主机ip登录当前服务器上的mysql服务。

注:可以使用通配符表示,%和_;192.168.%即表示这个网段的所有主机

1、查询用户

MariaDB [(none)]> use mysql
Database changed

MariaDB [mysql]> select user,host,password from user;
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
| root | localhost             |          |
| root | localhost.localdomain |          |
| root | 127.0.0.1             |          |
| root | ::1                   |          |
|      | localhost             |          |
|      | localhost.localdomain |          |
+------+-----------------------+----------+

2、创建用户

方法一:使用create user命令创建mysql用户;

MariaDB [mysql]> create user 'Batman' identified by 'Robin';
Query OK, 0 rows affected (0.00 sec)

方法二:直接在mysql库的user表中插入记录;这种方法较少使用,而且这种方法在设置了严格的sql-mode以后便无法使用;

MariaDB [mysql]> insert into mysql.user(user,host,password) values('superman','192.168.%.%',password('Super'));

注意:如果当前mysql数据库的sql-mode设置为严格检查(TRADITIONAL),则无法使用上述方法插入数据;显示为

ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

方法三:在授权数据库的同时,如果对应用户不存在,namemysql将会自动创建对应的用户;

MariaDB [mysql]> grant all on testdb.* to superman identified by 'super';
Query OK, 0 rows affected (0.00 sec)

3、删除用户

通常使用drop命令删除用户或者直接删除mysql.user表中对应的用户记录

方法一:使用delete语句删除mysql.user表中对应的记录,但是会有相关信息残留 

MariaDB [mysql]> DELETE FROM mysql.user WHERE user='superman' and host='%';
Query OK, 1 row affected (0.01 sec)

上例中,使用了delete语句删除了user表中的用户对应的记录,但是如果某些数据库的权限以赋给该用户;那么,在mysql.db表中,该用户相应的权限将不会被删除,当管路员再次创建superman用户时则会出现如下错误:

MariaDB [mysql]> CREATE USER 'superman';
ERROR 1396 (HY000): Operation CREATE USER failed for 'superman'@'%'

 解决上述问题;

我们可以删除mysql.db表中源“superman@%”用户残留的权限数据后,使用

flush privileges 

进行刷新,之后正常创建;

方法二:使用drop user命令删除对应用户;用户与用户对应的所有权限将被删除。

MariaDB [mysql]> DROP USER 'superman';
Query OK, 1 row affected (0.01 sec)

4、重命名用户

可用如下语句重命名账户;

rename user OldName to NewName;

实例:

 1 MariaDB [mysql]> select user,host,password from user;
 2 +--------+-----------------------+-------------------------------------------+
 3 | user   | host                  | password                                  |
 4 +--------+-----------------------+-------------------------------------------+
 5 | root   | localhost             |                                           |
 6 | root   | localhost.localdomain |                                           |
 7 | root   | 127.0.0.1             |                                           |
 8 | root   | ::1                   |                                           |
 9 |        | localhost             |                                           |
10 |        | localhost.localdomain |                                           |
11 | Batman | %                     | *5CEE5F1426974EA6CD9708CB85FF206C98ADF749 |
12 +--------+-----------------------+-------------------------------------------+
13 7 rows in set (0.00 sec)
14 
15 MariaDB [mysql]> rename user Batman to Robin;
16 Query OK, 0 rows affected (0.00 sec)
17 
18 MariaDB [mysql]> select user,host,password from user;
19 +-------+-----------------------+-------------------------------------------+
20 | user  | host                  | password                                  |
21 +-------+-----------------------+-------------------------------------------+
22 | root  | localhost             |                                           |
23 | root  | localhost.localdomain |                                           |
24 | root  | 127.0.0.1             |                                           |
25 | root  | ::1                   |                                           |
26 |       | localhost             |                                           |
27 |       | localhost.localdomain |                                           |
28 | Robin | %                     | *5CEE5F1426974EA6CD9708CB85FF206C98ADF749 |
29 +-------+-----------------------+-------------------------------------------+
30 7 rows in set (0.00 sec)
命名

 5、用户密码管理

方法一:管理员在系统命令中使用mysqladmin命令设置mysql密码。

mysqladmin -u用户名 -p旧密码 password 新密码

实例:

[root@localhost ~]# mysqladmin -uRobin -pRobin password 123456

如果数据库刚刚被初始化 用户还没有密码,则可用不指定旧密码;

[root@localhost ~]# mysqladmin -uroot password 123456

方法二:使用root用户登入以后,使用SET PASSWORD命令设置用户密码

MariaDB [(none)]> SET PASSWORD for Robin = password('123456');
Query OK, 0 rows affected (0.00 sec)

方法三:忘记root密码,破解root账号密码

  • 空数据库的情况下恢复密码
# systemctl stop mariadb
# rm -rf /var/lib/mysql/*  #删库跑路
# systemctl start mariadb
  • 有数据的情况下恢复密码
  1)在/etc/my.cnf配置文件的[mydqld]下添加skip-grant-tables和skip-networking参数
  2)# systemctl restart mariadb 重启服务
  3)执行mysql登录到数据库
  4)MariaDB [(none)]> UPDATE mysql.user SET password=PASSWORD('newpassword') WHERE user='root' AND host='localhost';  #更新密码
  5)MariaDB [(none)]> FLUSH PRIVILEGES;  #刷新授权表
  6)退出,修改配置文件,删除skip-grant-tables和skip-networking参数,重启服务

  注:也可以在启动mysqld进程时,使用如下选项:

--skip-grant-tables
--skip-networking

6、授权管理

1)授权

使用授权语句的语法:

GRANT priv_type ON [object_type] priv_level TO user@'%' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];

如同创建用户方法三;授权时如果用户不存在则创建,所以我们一般不会单独去创建一个用户,而是授权创建一块完成。

 1 priv_type 授权类型
 2     SELECT
 3 ​    INSERT
 4     ​UPDATE
 5 ​    DELETE
 6 ​    CREATE
 7 ​    DROP
 8     INDEX
 9     ALTER
10     ​SHOW DATABASES
11     ​CREATE TEMPORARY TABLES
12     ​LOCK TABLES
13     ​CREATE VIEW
14     SHOW VIEW
15     CREATE USER
16     ALL PRIVILEGES 或 ALL
17 object_type 授权对象
18     TABLE
19     FUNCTION
20     PROCEDURE
21 priv_level 授权级别
22     *或*.* 表示所有库
23     db_name.* 表示指定库中的所有表
24     db_name.tbl_name 指定库中的指定表
25     tbl_name 表示当前库的表
26     db_name.routine_name 表示指定库的函数,存储过程,触发器
27 WITH GRANT OPTION
28     MAX_QUERIES_PER_HOUR count
29     MAX_UPDATES_PER_HOUR count
30     MAX_CONNECTIONS_PER_HOUR count
31     MAX_USER_CONNECTIONS count
授权

实例:

MariaDB [school]> GRANT SELECT(stuid,name) ON TABLE school.students TO admin@'%' IDENTIFIED BY 'admin';  
#把students表的stuid和name字段的查询权限授权于admin@'%'用户
MariaDB [school]> FLUSH PRIVILEGES;  
#刷新授权表

授权用户某个数据库多个权限:

MariaDB [school]> GRANT INSERT,DELETE,UPDATE,SELECT ON school.* TO superman'192.168.%.%';
MariaDB [school]> FLUSH PRIVILEGES;

同时授权多个用户:

MariaDB [school]> GRANT INSERT,DELETE,UPDATE,SELECT ON school.* TO superman,batman;
MariaDB [school]> FLUSH PRIVILEGES;

2)查询授权

查询指定用户的权限

MariaDB [school]> SHOW GRANTS FOR admin@'%'\G  #查看指定用户的权限
*************************** 1. row ***************************
Grants for admin@%: GRANT USAGE ON *.* TO 'admin'@'%' IDENTIFIED BY PASSWORD '*4ACFE3202A5FF5CF467898FC58AAB1D615029441'
*************************** 2. row ***************************
Grants for admin@%: GRANT SELECT (stuid, name) ON `school`.`students` TO 'admin'@'%'

查询自己的权限

[root@working ~]# mysql -uadmin -padmin -h192.168.0.7
MariaDB [(none)]> SHOW GRANTS FOR CURRENT_USER()\G  #查询自己的权限
*************************** 1. row ***************************
Grants for admin@%: GRANT USAGE ON *.* TO 'admin'@'%' IDENTIFIED BY PASSWORD '*4ACFE3202A5FF5CF467898FC58AAB1D615029441'
*************************** 2. row ***************************
Grants for admin@%: GRANT SELECT (stuid, name) ON `school`.`students` TO 'admin'@'%'

3)收回授权

MariaDB [school]> REVOKE SELECT(stuid) ON school.students FROM admin@'%';  
#收回admin@'%'用户对stuid字段的查询权限

注:当一个用户被创建时,mysql会自动授予usage权限;usage权限只能用于登录数据,不能执行其他操作。

如果用户有可能会跨越不安全的网络连接到数据库,我们可以强制用户使用ssl建立会话:

grant usage on *.* to 'superman'@'222.222.222.222' require ssl;

如果取消上述ssl连接,使用如下命令撤销:

grant usage on *.* to 'superman'@'222.222.222.222' require none;

如果,root用户授权了superman用户权限时,搭配了grant选项,那么superman有权将已拥有的权限授予其他用户。这样做很危险;请勿随意使用此选项;示例如下

grant select on *.* to superman@'192.168.%.%'  with grant option;

在上面提到了WITH GRANT OPTION这一项,管理员爸爸还可以通过这些选项对用户进行一些其他限制。

posted @ 2018-06-14 16:33  Gmiao  阅读(713)  评论(0编辑  收藏  举报