初学MySQL必备SQL语句-MySQL账户管理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 初学MySQL必备SQL语句-MySQL账户管理

本来这一篇应该放在安装之后说的,但是当时没想起来,直到昨天我安装软件需要用到数据库,我才想起来。今天赶紧补上,话不多说。开干!

MySQL账户管理

MySQL中的账户管理主要是对连接MySQL服务的账户做出管理,判断是否为合法账户。
如果合法,可根据相应权限访问指定的数据库。

1.MySQL中的权限表

  • 可以通过以下几条语句来查看权限表
mysql> show databases;
mysql> use mysql;
mysql> show tables;
#具体内容为查看都有哪些数据库,进入mysql数据库,查看都有哪些数据表。
  • 以下列举几个与用户和权限相关的表
user表:存储连接MySQL服务的账户信息,全局有效
db表:存储用户对某个具体数据库的操作权限
tables_priv:存储用户对某个数据表的操作权限
columns_priv:存储用户真数据表中某列的操作权限
procs_priv表:存储用户对存储过程和函数的操作权限
password_history:存储用户密码历史更改记录

2.创建普通用户

2.1.使用CREATE USER语句创建

注意:创建用户时,当前登录的用户需要有相应的权限
  • 创建一个名为张四的MySQL用户,主机名为localhost
mysql> create user 'zhangsi'@'localhost';
Query OK, 0 rows affected (0.05 sec)
  • 查看刚创建的用户信息
mysql> select
    -> host,user,authentication_string
    -> from mysql.user
    -> where user = 'zhangsi';
+-----------+---------+-----------------------+
| host      | user    | authentication_string |
+-----------+---------+-----------------------+
| localhost | zhangsi |                       |
+-----------+---------+-----------------------+
1 row in set (0.00 sec)
注:以上举例只为演示创建用户过程,没有设置密码,没有权限
  • 支持创建用户在某个IP段内可连接MySQL数据库
mysql> create user 'lisan'@'192.168.10.%';
  • 当想让所有人都可以连接MySQL数据库,语句如下(生产中不要这样)
mysql> create user 'wangliu';
  • 创建MySQL用户时,指定密码
mysql> create user 'yyang'@'localhost' identified by '123123';
Query OK, 0 rows affected (0.02 sec)
当然,有密码时查看用户信息的时候看到的密码是一串密文
  • MySQL支持使用密文作为密码。这个这个这个。。。
mysql> select host,user,authentication_string from mysql.user where user = 'yyang';
+-----------+-------+------------------------------------------------------------------------+
| host      | user  | authentication_string                                                  |
+-----------+-------+------------------------------------------------------------------------+
| localhost | yyang | $A$005$CojF+TUd84E)/K~sJr8lv.a1Yyxottw28XsZc2gUkMa4NyPmEG/uoovIxM/ |
+-----------+-------+------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create user 'yang'@'192.168.10.%' identified by '$A$005$CojF+TUd84E)/K~sJr8lv.a1Yyxottw28XsZc2gUkMa4NyPmEG/uoovIxM/';
Query OK, 0 rows affected (0.01 sec)
#看明白没,就是先查看yyang用户的密文密码,
#然后创建yang用户时使用密文密码,
#当然当使用 yang账户登录MySQL时输入的密码还是‘123123’
  • 创建用户指定插件认证方式
mysql> create user 'zhangsan'@'localhost'
    -> identified with
    -> mysql_native_password by '123123';
Query OK, 0 rows affected (0.01 sec)

2.2.使用GRANT语句创建用户

注意:MySQL8.0版本不再支持GRANT语句一条命令既创建用户又完成授权
所以下面只简单列举其他版本可以使用的一条例子,详细内容就不在这里写了。
文章最后一部分会对此做出说明。
  • 创建一个名为hehe的用户,并赋予所有表查的权限
mysql> grant select on *.* to 'hehe'@'localhost' identified by '123123';
# 其他的使用方法也是围绕这个语句,有兴趣的可以自己找找资料

3.为用户授权

授权使用grant语句,类似与2.2节内容

3.1.权限的层次

  • 全局授权,作用与MySQL下所有数据库
GRANT ALL ON *.*
  • 数据库级授权,作用与具体某个库
GRANT ALL ON 库名.*
  • 数据表级别授权,作用域某个库下具体某个表
GRANT ALL ON 库名.表名
  • 字段级别授权,作用于库下某个表中特定的字段
GRANT SELECT(列名称) ON 库名.表名
#以上语句为授予某库中某表的某列查看权限
  • 子程序级别,作用于存储过程和函数
权限包括:GRANT ROUTINE;ALTER ROUTINE;EXECUTE;GRANT

3.2.使用grant语句为用户授权

  • 授予yyang用户所有数据库执行权限,只能从本地登录
mysql> grant all privileges on *.* to yyang@localhost;
Query OK, 0 rows affected (0.01 sec)
  • 查看yyang用户所拥有权限
mysql> select * from mysql.user where user = 'yyang' and host = 'localhost' \G
# 内容太多,就不贴过来了,发现拥有了除grant外的大部分权限
  • 为yyang用户赋予grant权限
mysql> grant all privileges on *.* to yyang@localhost with grant option;
Query OK, 0 rows affected (0.03 sec)
  • 权限一般越小越好,通常我们会用以下几个常用权限
INSERT DELETE UPDATE SELECT
#增、删、改、查
  • 数据库管理权限
SUPER PROCESS FILE
#注:以上权限不能指定某个数据库,不然会报错
#尽量不要为普通用户授权以上权限

4.查看用户权限

可以使用SHOW GRANT FOR语句查看用户权限

4.1.使用SHOW GRANT FOR语句查看用户权限

  • 例,查看yyang用户权限
mysql> show grants for yyang@localhost \G
*************************** 1. row ***************************
Grants for yyang@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `yyang`@`localhost` WITH GRANT OPTION
。。。 。。。
# 后边内容就不贴了

4.2.通过查询mysql.user表查看用户权限

mysql> select * from mysql.user where user = 'yyang' and host = 'localhost' \G
*************************** 1. row ***************************
                    Host: localhost
                    User: yyang
             Select_priv: Y
             Insert_priv: Y
             Update_priv: Y
             Delete_priv: Y
      。。。 。。。

5.修改用户权限

此部分内容与标题4内容类似

6.撤销用户权限

使用REVOKE语句撤销用户权限
  • 例:撤销yyang用户对所有数据库及表的删除权限
mysql> revoke delete on *.* from 'yyang'@'localhost';
Query OK, 0 rows affected (0.01 sec)
  • REVOKE语句不能撤销用户的USAGE权限,即使语句执行成功,依然无效。

7.修改用户密码

支持使用mysqladmin命令修改密码,也可以使用SET PASSWORD语句修改密码,还有其他方式就不说了
  • 使用mysqladmin修改密码
[root@centos7 ~]# mysqladmin -u yyang -h localhost -p password "yyang"
Enter password: 输入原密码
[root@centos7 ~]# mysql -uyyang -pyyang
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 396
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, 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> 
  • 使用SET PASSWORD语句修改密码
mysql> set password for 'yyang'@'localhost' = password('123123');
#注:这条命令在8版本中使用失败,网上说是版本太新的原因
#是不是这个原因我也不清楚,有兴趣可以自己找找
  • 可以使用下列这条修改
mysql> alter user 'yyang'@'localhost' identified by '123123';
Query OK, 0 rows affected (0.01 sec)


8.忘记root密码怎么办?

  • 修改配置文件
  • 编辑my.conf文件,在[mysqld]下添加以下配置
skip-grant-tables=1
  • 重启MySQL数据库
systemctl restart mysqld
  • 登录数据库
[root@centos7 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, 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> 
#注:密码那里直接回车
  • 修改root密码。
#5.7以下修改密码
mysql> update mysql.user set password=password('123456') where user='root' and host='localhost';
#8.0版本修改密码
#首先重新重新加载授权表
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
#然后修改root密码
mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
  • 退出MySQL,删除my.cnf文件中添加的配置,重启
vim /etc/my.cnf
systemctl restart mysqld
  • 使用新密码登录
[root@centos7 ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, 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> 

9.删除用户

9.1.使用DROP USER语句删除用户

  • 首先查看都有哪些用户
mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| yang             | 192.168.10.% |
| zabbix           | 192.168.10.% |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
| yyang            | localhost    |
| zhangsan         | localhost    |
| zhangsi          | localhost    |
+------------------+--------------+
9 rows in set (0.00 sec)
  • 删除zhangsi用户
mysql> drop user 'zhangsi'@'localhost';
Query OK, 0 rows affected (0.02 sec)
  • 再次查看,发现zhangsi用户已删除
mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| yang             | 192.168.10.% |
| zabbix           | 192.168.10.% |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
| yyang            | localhost    |
| zhangsan         | localhost    |
+------------------+--------------+
8 rows in set (0.00 sec)

9.2.使用DELETE语句删除用户

mysql> delete from mysql.user where user = 'zhangsan' and host = 'localhost';
Query OK, 1 row affected (0.01 sec)

10.MySQL8.0中一些变化

10.1.创建用户与授权

  • 8.0中不能使用grant语句创建并授权用户
  • 只能是先create user创建,然后grant授权

10.2.认证插件更新

  • 8.0中默认身份插件为caching_sha2_password代替了之前的mysql_native_password
  • 可通过show variables like 'default_authentication%';查看

10.3.密码管理

  • password_hostory=n表示新密码不能和近n次使用的密码相同
  • password_reuse_interval=n按日期,表示新密码不能与n天内使用的密码相同
  • password_require_current=ON表示修改密码,需要提供当前密码
  • 查看密码重用策略
show variables like 'password%';

就到这吧,这篇不是一天写完的,有点多,所有中途可以有的地方显得比较乱。见谅~

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
mysql 简单的sql语句,入门级增删改查
介绍MySQL中的基本SQL语句,包括数据的增删改查操作,使用示例和简单的数据表进行演示。
mysql 简单的sql语句,入门级增删改查
|
19天前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
165 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
19天前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
12天前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
31 7
|
18天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
29 2
|
3天前
|
SQL 存储 缓存
MySQL 是怎么执行 SQL 语句的?
MySQL 是怎么执行 SQL 语句的?
8 0
|
6天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
67 13
|
3月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
3月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
48 6
下一篇
无影云桌面