MySQL 用户管理和权限管理

在项目中,一个数据库有很多人需要使用,不能所有的人都使用相同的权限,如果人比较多,一人一个用户也很难管理。一般来说,会分超级管理员权限,管理员权限,读写权限,只读权限等,这样方便管理。当然,具体怎么管理权限根据实际情况来确定。无论如何,都需要创建多个用户来管理权限。root 是数据库的超级管理员用户,对于普通开发人员来说,权限太大了,如果不小心做了一些不可逆的操作,后果是非常严重的,并且还不容易查出责任人。所以 root 用户不会让开发人员使用,一般会由 DBA 或运维人员统一管理,如果没有 DBA,统一由超级管理员 root 来分配。

1. 查看所有用户

MySQL中所有的用户及权限信息都存储在默认数据库 mysql 的 user 表中。

进入 mysql 数据库,通过 desc user; 可以查看 user 表的结构。

use mysql; desc user;

MySQL 用户管理和权限管理

可以看到 user 中有40多个字段,字段非常多,只要关注主要字段就行了。其中的主要字段有:

host: 允许访问的主机地址,localhost 为本机,% 为任何主机。

user: 用户名。

authentication_string: 加密后的密码值。

使用 select * from user; 查看 user 表中当前有哪些用户。

select host,user,authentication_string from user;

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host     | user         | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root         | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+-----------+---------------+-------------------------------------------+
3 rows in set (0.00 sec)

在安装 MySQL 后,有三个默认的用户。

2. 创建用户

使用 create user ‘用户名’@’访问主机’ identified by ‘密码’; 创建用户。

create user 'admin'@'localhost' identified by 'admin';

mysql> create user 'admin'@'localhost' identified by 'admin';
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host     | user         | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root         | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | admin         | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)

创建用户后,查看用户,多了刚才创建的 admin,创建成功。

3、查看用户权限

使用 show grants for ‘用户名’@’访问主机’; 查看用户的权限。

mysql> show grants for 'admin'@'localhost';
+-------------------------------------------+
| Grants for admin@localhost               |
+-------------------------------------------+
| GRANT USAGE ON *.* TO 'admin'@'localhost' |
+-------------------------------------------+
1 row in set (0.00 sec)

在创建用户的时候,如果没有指定权限,默认会赋予 USAGE 权限,这个权限很小,几乎为0,只有连接数据库和查询information_schema 数据库的权限。虽然. 表示所有数据库的所有表,但因为 USAGE 的限制,不能操作所有数据库。

退出 root 用户,登录到 admin 用户,只能看到 information_schema 数据库。

[root@localhost mysql]# mysql -u admin -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 5.7.38 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases
   -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

4、给用户授权

创建 admin 用户,目的是创建一个管理员,所以要给 admin 授权。退出 admin ,重新登录 root 。

在授权时,常用的权限有 CREATE、ALTER、DROP、INSERT、UPDATE、DELETE、SELECT,ALL PRIVILEGES 表示所有权限。

通过 数据库.数据表 指定对哪个数据库的哪个表授权,. 表示所有数据库中的所有表。

通过 ‘用户名’@’访问主机’ 来表示用户可以从哪些主机登录, ‘%’ 表示可以从任何主机登录。

使用 grant 权限 on 数据库.数据表 to ‘用户名’@’访问主机’ identified by ‘密码’; 来给数据库用户授权。 # mysql8之前的版本 grant all privileges on *.* to 'admin'@'%' identified by 'Mysql!123';

#mysql8版本 mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

mysql> use mysql
Database changed
mysql> grant all privileges on *.* to 'admin'@'%' identified by 'admin';
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host     | user         | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root         | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | admin         | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
| %         | admin         | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-----------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)

给 admin 用户授权后,权限从 USAGE 变成了 ALL PRIVILEGES ,表示 admin 拥有了所有权限。

如果授权没有生效,记得刷新一下权限,使权限生效。

flush privileges;

再重新登陆到 admin 用户上,可以操作所有数据库了。

给用户授权的时候,必须要指定 ‘用户名’@’访问主机’ 来指定用户。如果 ‘访问主机’ 不相同,不是给用户授权,而是创建一个同名同密码的用户,这个用户与原用户可以登陆的主机不相同,权限不同。

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host     | user         | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root         | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | admin         | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
| %         | admin         | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-----------+---------------+-------------------------------------------+
5 rows in set (0.01 sec)

执行上面的语句后,user 表中有两个 admin 用户,用户名和密码都一样,但可以登陆的主机不一样。第一次创建的 admin 访问主机是 localhost,执行上面的语句时指定的访问主机是 % ,访问主机不一样,MySQL 会创建两个用户。虽然用户名密码相同,但这是两个不同的用户,两个用户的权限不一样。给两个用户指定不同的权限,在两个用户都有权限的主机登录时,局部用户的权限会覆盖全局用户的权限,当在 localhost 登录时,’admin’@’localhost’ 的权限会覆盖 ‘admin’@’%’ 的权限。

对于可以从任何主机登录的用户,在查看用户权限时,可以使用 show grants for 用户名; 来查看权限,指定主机的用户在查看权限时,要跟上访问主机才能查看权限。

mysql> show grants for admin;
+--------------------------------------------+
| Grants for admin@%                         |
+--------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' |
+--------------------------------------------+
1 row in set (0.00 sec)

5. 创建用户并授权(mysql8版本不支持此功能)

使用 grant 权限 on 数据库.数据表 to ‘用户名’@’访问主机’ identified by ‘密码’; 来创建一个用户并指定权限,与上面授权使用的语句相同。

grant create,select on *.* to 'creater'@'%' identified by 'baoyu1234';

mysql> grant create,select on *.* to 'creater'@'%' identified by 'baoyu1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show grants for creater;
+----------------------------------------------+
| Grants for creater@%                         |
+----------------------------------------------+
| GRANT SELECT, CREATE ON *.* TO 'creater'@'%' |
+----------------------------------------------+
1 row in set (0.00 sec)

创建了一个有读写权限的用户 creater,这个用户拥有所有数据库的 SELECT 和 CREATE 权限,可以从任何主机登录数据库。

6. 修改用户的权限

使用 grant 权限 on 数据库.数据表 to ‘用户名’@’访问主机’ identified by ‘密码’; 修改用户的权限,其实前面的授权就是修改权限。

grant all privileges on *.* to 'creater'@'%' identified by 'baoyu1234';

mysql> grant all privileges on *.* to 'creater'@'%' identified by 'baoyu1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show grants for creater;
+----------------------------------------------+
| Grants for creater@%                         |
+----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'creater'@'%' |
+----------------------------------------------+
1 row in set (0.00 sec)

7、删除用户

使用 drop user ‘用户名’@’访问主机’; 来删除用户。

drop user 'admin'@'localhost';

mysql> drop user 'admin'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host     | user         | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root         | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | admin         | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
| %         | creater       | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
+-----------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)

执行删除操作后,user 表中不再有该用户。

8、修改用户名和访问主机

使用 rename user ‘用户名’@’访问主机’ to ‘新用户名’@’新访问主机’; 来修改用户名和用户的访问主机。

rename user 'creater'@'%' to 'create'@'localhost';

修改之后,creater 用户改名 create ,访问主机从 % 变成了 localhost 。

mysql> rename user 'creater'@'%' to 'create'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host     | user         | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root         | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | admin         | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
| localhost | create       | *90CA9738BDB1CD94BC376D2A339531B720EC0721 |
+-----------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)

9、修改用户密码

# mysql8之前的版本
update user set password=password('新密码') where user='用户名';
flush privileges; --刷新MySQL的系统权限相关表

#mysql8版本
ALTER USER '用户名'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
flush privileges; --刷新MySQL的系统权限相关表

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/4305

(0)
安屠生的头像安屠生
上一篇 2022年6月9日 下午3:33
下一篇 2022年6月9日 下午7:15

相关推荐

  • MySQL 如何避免克隆失败后再次初始化

    在我之前关于 CLONE INSTANCE 命令的博客文章《MySQL 克隆插件不是你的备份》中,我提到使用选项 DATA DIRECTORY 有助于避免在克隆操作失败时需要从头开始重新初始化副本和克隆相关设置的情况。 MySQL 克隆插件简化了新副本的配置,但不会简化失败后的服务器恢复,除非您准备从头开始重新安装 M…

    2023年10月23日
    1.9K00
  • Redis 缓存雪崩、缓存穿透、缓存击穿、缓存预热

    缓存雪崩 定义 缓存雪崩是指在短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成了巨大的压力,严重情况下可能会导致数据库宕机的情况叫做缓存雪崩。 正常情况下执行过程: 缓存雪崩下执行过程: 可以看到,当缓存失效时,大量请求直接绕过 Redis 去请求数据库,导致会对数据库造成很大压力。 解决 加锁排队 加锁排队可以起到缓冲的作用,防…

    2022年11月17日
    1.5K00
  • 超微浪潮服务器webbios配置raid

    这段时间比较奇怪,服务器总是和我过不去 ——O(∩_∩)O,前段时间刚搞了一台IBM服务器做RAID0安装EXSi。今天又来了台浪潮NF5245M3,个头一点都不小。上个图看看,第一次接触这个品牌服务器。  好了,说重点吧。这次主要是用来做数据库服务器测试机的,有两个要求:        1、做RAID0,提…

    2024年5月23日
    1.3K00
  • 对象存储

    我们知道,在很长的一段时间里,这三种架构几乎统治了数据存储市场。所有行业用户的数据存储需求,都是在这三者中进行选择。 然而,随着时代的发展,一种新的数据存储形态诞生,开始挑战前面三者的垄断地位。 没错,它就是云计算时代存储技术的新网红——对象存储。 对象存储,也称为“面向对象的存储”,英文是Object-based Storage。现在很多云厂商,也直接称之…

    2024年2月6日
    1.4K00
  • linux中为cp和mv命令添加进度条

    安装高级复制补丁以在 Linux 中向 cp 和 mv 命令添加进度条 cp 和 mv 命令是GNU coreutils. 所以你需要GNU coreutils从这里下载最新的。 现在两个新的补丁的二进制文件即cp与mv将在中创建coreutils-9.0/src的文件夹。只需将它们复制到你的 $PATH 中,如下所示: 该cpg和mvg命令有现在进度条的功…

    2023年6月16日
    1.5K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信