MySQL的内部组件结构

image.png

Server层

主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数
(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

Store层

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在
最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。也就是说如果我们在create table时不指定
表的存储引擎类型,默认会给你设置存储引擎为InnoDB。

连接器

  1. mysql h host[数据库地址] u root[用户] p root[密码] P 3306
  1. CREATE USER 'username'@'host' IDENTIFIED BY 'password'; //创建新用户
  2. grant all privileges on *.* to 'username'@'%'; //赋权限,%表示所有(host)
  3. flush privileges //刷新数据库
  4. update user set password=password(”123456″) where user=’root’;(设置用户名密码)
  5. show grants for root@"%"; 查看当前用户的权限

连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在 show processlist 命令中看到它。文本中这个图是 show processlist 的结果,其中的 Command 列显示“Sleep”的这一行,就表示现在系统里面有一个空闲连接。
image.png
客户端如果长时间不发送command到Server端,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。

  1. show global variables like "wait_timeout";
  2. set global wait_timeout=28800; 设置全局服务器关闭非交互连接之前等待活动的秒数

image.png

查询缓存

  1. show databases; 显示所有数据库
  2. use dbname; 打开数据库:
  3. show tables; 显示数据库mysql中所有的表;
  4. describe user; 显示表mysql数据库中user表的列信息);

大多数情况查询缓存就是个鸡肋,为什么呢?
因为查询缓存往往弊大于利。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。 因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率 会非常低。 一般建议大家在静态表里使用查询缓存,什么叫静态表呢?就是一般我们极少更新的表。比如,一个系统配置表、字典 表,那这张表上的查询才适合使用查询缓存。好在 MySQL 也提供了这种“按需使用”的方式。你可以将my.cnf参数 query_cache_type 设置成 DEMAND。
mysql8.0已经移除了查询缓存功能

分析器

词法分析器原理
1、词法分析
2、语法分析
3、语义分析
4、构造执行树
5、生成执行计划
6、计划的执行

优化器

经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

开始执行的时候,要先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误, (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限)。

bin-log归档

删库是不需要跑路的,因为我们的SQL执行时,会将sql语句的执行逻辑记录在我们的bin-log当中,什么是bin-log呢?
binlog是Server层实现的二进制日志,他会记录我们的cud操作。Binlog有以下几个特点:
1、Binlog在MySQL的Server层实现(引擎共用)
2、Binlog为逻辑日志,记录的是一条语句的原始逻辑
3、Binlog不限大小,追加写入,不会覆盖以前的日志
如果,我们误删了数据库,可以使用binlog进行归档!要使用binlog归档,首先我们得记录binlog,因此需要先开启MySQL的
binlog功能。
配置my.cnf

  1. 配置开启binlog
  2. logbin=/usr/local/mysql/data/binlog/mysqlbin
  3. 注意5.7以及更高版本需要配置本项:
  4. serverid=123454(自定义,保证唯一性);
  5. #binlog格式,有3种statement,row,mixed
  6. binlogformat=ROW
  7. #表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交时mysql不做刷盘操作,由系统决定
  8. syncbinlog=1

binlog命令

  1. mysql> show variables like '%log_bin%'; 查看binlog是否开启
  2. mysql> flush logs; 会多一个最新的binlog日志
  3. mysql> show master status; 查看最后一个binlog日志的相关信息
  4. mysql> reset master; 清空所有的binlog日志

查看binlog内容

  1. mysql> /usr/local/mysql/bin/mysqlbinlog ‐‐nodefaults /usr/local/mysql/data/binlog/mysqlbin. 000001 查看binlog内容

数据归档操作

  1. binlog恢复数据
  2. 恢复全部数据
  3. /usr/local/mysql/bin/mysqlbinlog ‐‐nodefaults /usr/local/mysql/data/binlog/mysqlbin.000001 |mysql uroot p test(数据库名)
  4. 恢复指定位置数据
  5. /usr/local/mysql/bin/mysqlbinlog ‐‐nodefaults ‐‐startposition="408" ‐‐stopposition="731" /usr/local/mysql/data/binlog/mysqlbin.000001 |mysql uroot p test(数据库)
  6. 恢复指定时间段数据
  7. /usr/local/mysql/bin/mysqlbinlog ‐‐nodefaults /usr/local/mysql/data/binlog/mysqlbin.000001 ‐‐stopdate= "2018‐03‐02 12:00:00" ‐‐startdate= "2019‐03‐02 11:55:00"|mysql uroot p test(数据库)