当前位置:   article > 正文

MySQL之体系结构和基础管理

MySQL之体系结构和基础管理

前言

本文以linux系统的MySQL为例详细介绍MySQL的体系结构,因为在实际生产环境中MySQL的运行环境都是linux系统。同时介绍MySQL的基础管理,包括用户管理和权限管理等。

MySQL体系结构

MySQL客户端/服务器工作模型

MySQL是C/S架构,工作模型大致如下图所示:

MySQL客户端连接MySQL服务端mysqld有两种方式:

第一种,通过本地socket文件连接,只能在本地使用,不依赖IP和端口

  1. -- socket文件路径通过下述命令找到socket = /xx/mysql.sock
  2. cat /etc/my.cnf
  3. -- 本地通过socket文件连接MySQL服务端:mysql -S socket文件路径
  4. mysql -S /tmp/mysql.sock

第二种,远程TCP/IP连接,这种连接方式在本地和远程都可以使用,依赖IP和端口

  1. -- mysql -u 用户名(默认就是root) -p -h ip地址 -P 端口
  2. mysql -u root -p -h 127.0.0.1 -P 3306 -- 建议回车后再输入密码

mysqld工作原理

mysqld是MySQL的服务端,也称为MySQL实例,这个实例包括mysqld的后台守护进程和工作线程,每个线程都负责不同的任务,另外还有预分配的内存结构,实例的功能就是管理数据。

mysqld的程序结构如下图所示:

mysqld分为server层(连接层+SQL层)和存储引擎层,server层中的连接层和SQL层并不是MySQL官方提出的分层,只是因为这样分层更加方便理解而已。

当客户端输入mysql -u root -p xxx -h ip地址-P 3306回车后,就会连接到server端的连接层,连接层共用三个作用,分别是:

①提供连接协议,tcp/ip协议;

②提供验证,验证客户端发送过来的用户名、密码、IP地址和端口信息是否正确;

③提供专用的连接线程,接收客户端发送过来的SQL语句并将SQL语句的执行结果返回给客户端;

ps:可以通过show processlist;查看连接线程的基本情况。

  1. mysql> show processlist;
  2. +----+------+-----------------+------+---------+------+-------+------------------+
  3. | Id | User | Host | db | Command | Time | State | Info |
  4. +----+------+-----------------+------+---------+------+-------+------------------+
  5. | 30 | root | localhost:63292 | NULL | Query | 0 | init | show processlist |
  6. +----+------+-----------------+------+---------+------+-------+------------------+
  7. 1 row in set (0.00 sec)

连接mysqld成功之后,客户端会输入SQL语句后回车发送给服务端,由SQL层执行SQL语句,SQL层主要负责下述功能(功能较多):

①接收上层(连接层)发送的SQL语句;

②通过语法验证模块研恒SQL语句是否符合语法规则;

③进行语义检查,判断SQL语句的类型(DDL/DML/DCL);

④进行权限检查,判断当前用户对当前SQL语句的执行是否有权限进行操作;

⑤解析器在SQL语句执行前进行预处理,生成多种执行计划,就像出门去目的地的几种路线一样;

⑥优化器根据解析器得到的多种执行计划进行评估,选择最优的执行计划;

⑦执行器会根据优化器选择的执行计划执行SQL语句,产生执行结果;

⑧提供查询缓存(query cache),但是这个功能有点鸡肋,默认是没有开启的,因为在实际开发中,通常会使用redis代替查询缓存功能;

⑨提供日志记录,比如binlog(二进制日志),默认也是没有开启的。

存储引擎层是和磁盘进行交互的模块,根据SQL层执行的结果从磁盘上获取数据,将16进制的数据交给SQL结构化成表,再通过连接层的专用线程返回给客户端。

MySQL的物理存储结构

页(page):MySQL的最小IO单元是页,一个页默认是16kb,由连续的4个OS block块组成;

区(extent):一个区(簇),默认是1M,由连续的64pages构成。

段:一张表就是一个段,可以由1个或者多个区构成,不一定是连续的区。分区表除外(一个段拆成几个段,每个段还是由1个或者多个区构成)

MySQL使用段区页的概念就是为了连续IO,提高查询速度。

MySQL体系结构总结

根据上述mysqld的结构和MySQL物理存储结构可以总结出MySQL体系结构图如下:

MySQL基础管理

用户管理

用户的作用就是登录MySQL数据库并且管理MySQL对象,可以通过user表查看所有的用户。

用户到底长啥样呢?就长这个样子用户名@'白名单',白名单是地址,允许白名单的IP 登录MySQL并且管理MySQL。比如:

  1. root@'localhost' -- root用户可以通过本地登录MySQL(socket登录)
  2. gui@'10.0.0.10' -- gui用户能够在IP地址为10.0.0.10的主机远程登录MySQL
  3. root@'10.0.0.%' -- root用户能够在IP地址为某个网段的主机上远程登录MySQL
  4. root@'%' -- root用户能够在任意主机上登录MySQL

如何对用户进行管理呢?就是如何对用户进行增删改查呢,请看下述SQL语句:

  1. -- 查看当前所有的MySQL用户
  2. mysql> select user, host, password from mysql.user;
  3. +--------+-----------+-------------------------------------------+
  4. | user | host | password |
  5. +--------+-----------+-------------------------------------------+
  6. | root | localhost | *6AD24CD1D6D180895D5EF57D84E41A40094C85DB |
  7. | | localhost | |
  8. | xu1 | 10.0.0.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
  9. | python | localhost | |
  10. | xu | 10.0.0.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
  11. +--------+-----------+-------------------------------------------+
  12. 5 rows in set (0.00 sec)
  13. -- 新增用户
  14. mysql>create user python@'localhost'; -- 增加用户时没有设置密码
  15. Query OK, 0 rows affected (0.00 sec)
  16. mysql>create user xu@'10.0.0.%' identified by '123'; -- 创建xu@'10.0.0.%'用户,密码是123
  17. Query OK, 0 rows affected (0.00 sec)
  18. mysql> select user, host, authentication_string from mysql.user;
  19. +--------+-----------+-----------------------+
  20. | user | host | authentication_string |
  21. +--------+-----------+-----------------------+
  22. | root | localhost | |
  23. | | localhost | NULL |
  24. | python | localhost | |
  25. | xu | 10.0.0.% | |
  26. +--------+-----------+-----------------------+
  27. 4 rows in set (0.00 sec)
  28. -- 对用户信息进行修改,在5.7版本中可以正常使用
  29. mysql>alter user xu@'10.0.0.%' identified by '456'; --xu@'10.0.0.%'用户修改密码
  30. Query OK, 0 rows affected (0.00 sec)
  31. -- 删除用户
  32. mysql> drop user xu@'10.0.0.%';
  33. Query OK, 0 rows affected (0.00 sec)

权限管理

MySQL的用户和计算机的用户是类似的,不同的用户有不同的权限,MySQL中的权限管理就是管理用户对数据库的操作有哪些权限,用户权限的管理请看下述SQL:

  1. -- 查看所有权限
  2. mysql> show privileges\G;

对用户进行授权,需要通过grant语句。这里需要注意的是,在8.0版本之前,创建用户并赋予权限可以使用一条grant语句完成,但是在8.0版本及之后,都需要创建用户之后再对用户进行授权。推荐使用先创建用户再授权

  1. -- grant 权限 on 数据库对象 to 用户 (identified by '密码');
  2. -- 权限的种类:
  3. all:所有权限
  4. 权限1,权限2...:为开发人员和业务用户开通的部分权限
  5. with grant option:超级管理员,可以为其他用户授权 --
  6. -- 权限作用范围:
  7. *.*:所有数据库的所有权限
  8. 库名.*:某个数据库下的所有表
  9. 库名.表名:某个数据库下的某张表 --
  10. -- 授权举例
  11. create user python@'%' identified by '123';
  12. create user java@'%' identified by '123';
  13. -- 为python@'%'用户授予超级管理员权限,可以操作所有的表并且可以为其他用户授权
  14. grant all on *.* to python@'%' with grant option;
  15. -- 为java@'%'用户授予app库下的所有表的增删改查的权限并修改密码
  16. grant select, update, insert, delete, create on app.* to java@'%' identified by '456';

既然能够为用户授予权限就能回收用户的权限,MySQL中不能通过重复授权对用户进行修改权限,只能通过回收权限的方式对用户的权限进行修改,如下:

  1. -- 将java@'%'用户的create权限进行回收
  2. grant select ,update,insert,delete on app.* to app@'10.0.0.%'; -- ❌,用户的权限并未修改
  3. revoke create(权限) on app.*(对象) from app@'10.0.0.%'(用户); -- ✔️,用户的权限修改成功,回收了用户的create权限

连接管理

使用MySQL自带客户端连接MySQL服务端时,有以下常用的参数:

  1. -u 用户名
  2. -p 密码
  3. -s 本地socket文件位置
  4. -h 数据库IP地址
  5. -P 端口号
  6. -e 免交互执行数据库命令
  7. < 导入sql脚本

使用本地socket文件连接:

  1. -- 使用root用户登录时下述连接方式任选
  2. mysql -u root -p 123 -S /tmp/mysql.sock(my.cnf中可以查看mysql.sock文件的位置)
  3. mysql -u root -p -S /tmp/mysql.sock ---- 推荐方式
  4. mysql
  5. mysql -p

使用tcp/ip远程连接,前提是必须创建好可以远程连接的用户:

mysql -u python -p 123 -h 112.126.87.94 -P 3306

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/294696
推荐阅读
相关标签
  

闽ICP备14008679号