MySQL之体系结构和基础管理

前言

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

MySQL体系结构

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

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

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

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

-- socket文件路径通过下述命令找到socket = /xx/mysql.sock
cat /etc/my.cnf

-- 本地通过socket文件连接MySQL服务端:mysql -S socket文件路径
mysql -S /tmp/mysql.sock

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

-- mysql -u 用户名(默认就是root) -p -h ip地址 -P 端口
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;查看连接线程的基本情况。

mysql> show processlist;
+----+------+-----------------+------+---------+------+-------+------------------+
| Id | User | Host            | db   | Command | Time | State | Info             |
+----+------+-----------------+------+---------+------+-------+------------------+
| 30 | root | localhost:63292 | NULL | Query   |    0 | init  | show processlist |
+----+------+-----------------+------+---------+------+-------+------------------+
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。比如:

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

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

-- 查看当前所有的MySQL用户
mysql> select user, host, password from mysql.user;
+--------+-----------+-------------------------------------------+
| user   | host      | password                                  |
+--------+-----------+-------------------------------------------+
| root   | localhost | *6AD24CD1D6D180895D5EF57D84E41A40094C85DB |
|        | localhost |                                           |
| xu1    | 10.0.0.%  | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| python | localhost |                                           |
| xu     | 10.0.0.%  | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+--------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)


-- 新增用户
mysql>create user python@'localhost';   -- 增加用户时没有设置密码
Query OK, 0 rows affected (0.00 sec)

mysql>create user xu@'10.0.0.%' identified by '123';  -- 创建xu@'10.0.0.%'用户,密码是123
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host, authentication_string from mysql.user;
+--------+-----------+-----------------------+
| user   | host      | authentication_string |
+--------+-----------+-----------------------+
| root   | localhost |                       |
|        | localhost | NULL                  |
| python | localhost |                       |
| xu     | 10.0.0.%  |                       |
+--------+-----------+-----------------------+
4 rows in set (0.00 sec)

-- 对用户信息进行修改,在5.7版本中可以正常使用
mysql>alter user xu@'10.0.0.%' identified by '456'; --xu@'10.0.0.%'用户修改密码
Query OK, 0 rows affected (0.00 sec)

-- 删除用户
mysql> drop user xu@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

权限管理

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

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

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

-- grant 权限 on 数据库对象 to 用户 (identified by '密码');
-- 权限的种类:
all:所有权限
权限1,权限2...:为开发人员和业务用户开通的部分权限
with grant option:超级管理员,可以为其他用户授权 --

-- 权限作用范围:
*.*:所有数据库的所有权限
库名.*:某个数据库下的所有表
库名.表名:某个数据库下的某张表 --

-- 授权举例
create user python@'%' identified by '123';
create user java@'%' identified by '123';

-- 为python@'%'用户授予超级管理员权限,可以操作所有的表并且可以为其他用户授权
grant all on *.* to python@'%' with grant option;  

-- 为java@'%'用户授予app库下的所有表的增删改查的权限并修改密码
grant select, update, insert, delete, create on app.* to java@'%' identified by '456';

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

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

连接管理

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

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

使用本地socket文件连接:

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/476785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ribbon知识点

1、通过类实现重写Ribbon规则 1.1注意 这个类一定不能跟启动类放在同一个包下面&#xff0c;不能被componentScan给扫描到。 需要如图放置&#xff1a; 要是被componentScan给扫描到&#xff0c;则会被所有的服务提供方所共享&#xff0c;那么就不能实现指定服务用不同的Ribbo…

pycharm中的Mark Directory As 里的 Sources Root、Excluded...

这里主要提到两个文件夹的作用&#xff0c;分别是Sources Root、Excluded 1、Sources Root 1、场景 平时使用pycharm&#xff0c;有时出现导包问题&#xff0c;将那个目录Mark Directory as sources root&#xff0c;然后就可以正常运行代码了 2、原理 其实主要就是将那个目录…

官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会

摘要&#xff1a;本文整理自阿里云开源大数据平台徐榜江 (雪尽)&#xff0c;关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会&#xff0c;内容主要分为以下四部分&#xff1a; 1、Flink CDC 新仓库&#xff0c;新流程 2、Flink CDC 新定位&#xff0c;新玩法 3、Flin…

从相机空间到像素空间的投影和反投影原理和代码

目录 从相机空间到像素空间的投影 效果 ​编辑 公式 ​编辑 代码 像素空间到相机空间的反投影 记录一下从相机空间到像素空间的投影&#xff08;3D-->2D&#xff09;和像素空间到相机空间的反投影&#xff08;2D-->3D&#xff09;。 推荐blog&#xff1a;SLAM入门之视…

Leetcode 684. 冗余连接

心路历程&#xff1a; 最开始的想法是把环给破开就行&#xff0c;思路&#xff1a;建图&#xff0c;遍历找环&#xff0c;然后找到edges里属于环的一个边&#xff1b;每次不选择上一步走过的边&#xff0c;DFS&#xff0c;需要回溯。后来查阅资料发现这道题适合用一个叫并查集…

那些场景需要额外注意线程安全问题

主要学习那些场景需要额外注意线程安全问题&#xff0c;在这里总结了四中场景。 访问共享变量或资源 第一种场景是访问共享变量或共享资源的时候&#xff0c;典型的场景有访问共享对象的属性&#xff0c;访问static静态变量&#xff0c;访问共享的缓存&#xff0c;等等。因为…

旅游小程序的市场与发展趋势

随着科技的发展&#xff0c;移动互联网已经成为我们生活中不可或缺的一部分。在这个时代&#xff0c;小程序已经成为了一种新的趋势&#xff0c;尤其是在旅游行业。那么&#xff0c;旅游小程序有哪些市场&#xff0c;发展趋势又怎么样呢&#xff1f; 一、旅游小程序的市场 1. 用…

WebGIS航线编辑器(无人机航线规划)

无人机航点、航线规划&#xff0c;实现全自动航点飞行作业及飞行航拍。禁飞区、作业区功能保障飞行安全。 GIS引擎加载 const viewer new Cesium.Viewer("cesiumContainer", { imageryProvider: new Cesium.IonImageryProvider({ assetId: 3872 }), }); const im…

基于微信小程序的CMS内容管理系统开发笔记

背景调研 内容管理CMS小程序的帮助运营者创建和管理小程序内容&#xff0c;提供一个直观的操作界面&#xff0c;能够轻松地添加、编辑和发布内容&#xff0c;而无需了解复杂的编程知识。可以进行栏目管理&#xff0c;文章管理&#xff0c;编辑文章内容&#xff0c;包括文字、图…

使用CUDA 为Tegra构建OpenCV

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 下一篇&#xff1a;在iOS中安装 警告&#xff1a; 本教程可能包含过时的信息。 使用CUDA for Tegra 的OpenCV 本文档是构建支持 CUD…

解读“CFMS中国闪存市场峰会”存储技术看点-2

根据Yole机构分析数据显示&#xff0c;CXL在2024年开始爬坡&#xff0c;在2025年将会大规模上量&#xff0c;也就是代表着CXL的时代从2025年开始正式到来。 服务器目前正面临着内存性能挑战&#xff0c;而CXL部署提供了短期和长期的解决方案。从CXL 1.1开始&#xff0c;AI云服务…

基于python+vue中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

Mysql 怎么产生隐藏主键 和 还要不要学MySQL

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…

【Django开发】前后端分离美多商城项目第3篇:用户部分,1. 后端接口设计:【附代码文档】

美多商城项目4.0文档完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;美多商城&#xff0c;项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业。项目准备&#xff0c;配置1. 修改settings/dev.py 文件中的路径信息,2. INS…

Amazon SageMaker + Stable Diffusion 搭建文本生成图像模型

如果我们的计算机视觉系统要真正理解视觉世界&#xff0c;它们不仅必须能够识别图像&#xff0c;而且必须能够生成图像。文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。 近两年&#xff0c;以ChatGPT为代表的AIGC技术崭露头角&#xff0c;逐渐从学术研究的象牙塔迈…

面试笔记——MySQL(优化篇:定位慢查询、SQL执行计划、索引、SQL优化)

定位慢查询 在MySQL应用中&#xff0c;慢查询 通常指的是执行时间超过一定阈值的查询语句。这个阈值通常由管理员或开发人员根据具体情况设置&#xff0c;一般是以毫秒为单位。慢查询可能会影响系统性能和用户体验&#xff0c;因此需要及时识别和优化。 表象&#xff1a; 页面…

探秘开源隐语:架构深度剖析与隐私计算技术之旅

1.隐语架构 隐语&#xff08;SecretFlow&#xff09;作为蚂蚁集团开源的可信隐私计算框架&#xff0c;其架构设计具有多层次的特点&#xff0c;虽然具体分层名称可能会根据实际描述略有差异&#xff0c;但我们可以依据已有的技术和信息对其进行结构化的拆解&#xff1a; 硬件层…

第一单元日考技能

文章目录 第一单元1.请用c程序随机输入20个数&#xff08;每小题10分&#xff09;2.①按要求输出*形状3.计算题  s1*12*23*3...100*100 &#xff08;每问10分&#xff09;4.1. 使用 C 创建一个简单的计算器&#xff0c;可以实现 , -, *, / 。 if switch5.图形打印 第一单元 1…

Lua | 一篇文章讲清Lua语法及热更新

目录 一、环境搭建 二、Lua语法 1.输出print、单行注释、多行注释 2.变量 &#xff08;1&#xff09;nil &#xff08;2&#xff09;number &#xff08;3&#xff09;string &#xff08;3.1&#xff09;字符串长度 &#xff08;3.2&#xff09;字符串拼接 &#xf…

LeetCode每日一题——数组串联

数组串联OJ链接&#xff1a;1929. 数组串联 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 题目说 ans 由两个 nums 数组 串联 形成。那么我们就只需要历遍两次nums数组&#xff0c;将它放在我们的ans数组里。 注意&#xff1a; 题目函数对于我…