当前位置: 首页 > news >正文

MySQL进阶之触发器、锁、InnoDB引擎和MySQL管理

一.触发器

1.触发器介绍: 

2.触发器insert类型:

触发器的主体是当前数据库。 

 

 再次向当前数据库中插入数据后,

就 可以在日志表中查询到insert记录

2.触发器update类型:

 此时我们来更新以下数据

我们再打开日志记录,就可以看到update有触发了一次。

 因为是行级触发,所以若一个SQL语句修改了5行数据,触发器就会触发5次。相应的日志里就会有5行日志记录。

3.触发器delete类型:

 相应的执行这条SQL语句,在日志中也是可以查到记录的。

 二.锁

1.锁的概述:

 

 2.全局锁:

 故我们需要全局锁来确保数据的一致性

只能执行读取数据,不能写入数据。 

 从上到下执行语法。

当修改数据的时候,如下图可以看到报错:

 -uroot标明root用户,-p1234标明密码1234,db01是要备份的数据,D:/db01.sql标明要存放的数据文件的目录。特别注意此条语句要在window下执行,而不是mysql下执行。

 如上图,若要连接远程的数据库,还要加上-h和ip地址。

最后再unlock以下锁 

 

3.表级锁:

 

 

读锁:

 如下图所示,不能修改数据。在另一个客户端的也不能修改数据,执行修改数据的sql语句就一直阻塞。直到前一个客户端解锁

 

 写锁:

 执行写锁后,第一个客户端可以执行读写操作,但第二个客户端不能执行读写操作,直到解锁。

 

元数据锁:

在一个客户端使用alter table,,,SQL语句,会发生阻塞现象,说明产生的exclusive会与其他的锁互斥。直至另一个客户端commit提交

 此条语句无需改动,直接复制粘贴。

意向锁:

 

 这些意向锁是执行对应SQL语句时自动加上去的

 当我们用意向锁后,要注意哪些表锁与意向锁互斥,否则乱用会一直处于阻塞状态。

4.行级锁:

1.概述: 

行锁:

 也就是说一个事务获取了一行的共享锁,其他事务就不能获取排他锁。两者是冲突的。

每一条SQL语句对应的行锁:

 

 温馨提示:关于事务,一般是以begin开始,commit提交为结束。

第一个客户端:

第二个客户端:

 可以明显看到第二个客户端执行update语句时发生了阻塞,是因为第一个客户端对id=1执行了共享锁,这与update对id=1数据进行修改时会产生的排他锁互斥。

间隙锁和临界锁:

间隙锁 是 Innodb 在 RR(可重复读) 隔离级别 下为了解决幻读问题时引入的锁机制。间隙锁是innodb中行锁的一种

请务必牢记:使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据

事务开启后,当修改一个表中不存在的数据行时,就会产生一个间隙锁,如下图的GAP ,位于查询条件相邻的两行之间。

此时再向间隙插入数据,会发现出现阻塞现象,直到第一个客户端commit事务。

 commit提交之后,id=7的数据也就插进去表里了,但也会在3和7之间再次建立一个间隙锁。

 临建锁:

Next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁

也可以理解为一种特殊的间隙锁。通过临建锁可以解决幻读的问题。 每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的一点是,InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁

锁的总结:

三.InnoDB引擎(MySQL默认引擎):

.ibd文件就是MySQL的表空间文件,存放表结构,数据以及索引。

InnoDB引擎的架构分为两部分:内存结构和磁盘结构 

(1).内存结构:

1.Buffer Pool缓冲池

那一个一个小方格是页,不同颜色表示页的状态不同。

 2.Change Buffer更改缓冲区(缓冲区的缓存区):

3.adaptive hash index: 

4.日志缓冲区:

 

 (2).磁盘结构:

1.系统表空间:

 2.三种表空间: 

ts_itheima表示使用itheima的表空间。 

 3.双写缓冲区和重做日志:

 undo log撤销日志

几种后台线程: 

总结:业务首先操作缓冲区,如果没有数据,将磁盘的数据加载过来,再缓存到缓冲区中,我们的增删改查就是在操作我们的缓冲区,缓冲区的数据会以一定的速率,频率以后台线程刷新到磁盘中,在磁盘中进行永久性的保存。

三。事务的原理:

 

1.redo log撤销日志 

脏页指的是缓冲区的数据修改而磁盘里并还没有修改,过一会就会把脏页的数据刷新到磁盘中。

 这里的ib_logfile可以用于当刷新失败时进行数据修复。注意每隔一段时间就会去删掉redo log文件,所以redo log主要用来保证数据修复和使用。

2.undo log回滚日志:

 四.MVCC机制(多版本并发控制):

1.基本概念:

 

 

ibd2sdi+后面加上表空间文件,可以查看对应表空间的文件里面相关的内容。 

2.MVCC实现原理:

 

 

 

一致性是由redo log和undo log共同维护。 

五.MySQL管理

1.系统数据库:系统自带数据库

 2,常用工具1:

并不用登录到MySQL就能查询到MySQL中某个数据库的表内容

 

 

 MySQL的二进制文件存放地址如上图。尾部都是.0001,0002

直接使用cat去查看这些二进制文件会出现很多乱码,而是要用mysqlbinlog去查看

在二进制文件名前面加上-s,呈现出来的内容会更加紧凑,会过滤掉无效的消息。

 

 

 此条SQL语句用来统计数据库中表的情况。也可以在--count前面加上指定的数据库名以及表名或以及属性名,查看当前的数据库表、属性的状态信息。

 

 -u和-p表示自动登录,把db01备份到db02.sql文件中。-t表示不包含创建表的建表语句。

使用-T备份文件,默认备份文件为,其他指定路径会提醒不安全。

会产生两个文件。

 注意要导入的是文本文件还是二进制文件,有对应的SQL语句。

总结:

相关文章:

  • 【Linux】虚拟机安装Ubuntu后的一些通用设置
  • [Android]使用Android打包Unity工程
  • 【STM32】PWM输出
  • 神经网络每次结果不一样,神经网络预测问题
  • Python常用命令总结【持续更新】
  • 什么样的人适合学习网络安全?
  • python作业8
  • 【css伪类选择器及透明度——附项目图片及代码】
  • Hadoop 3.x(生产调优手册)----【HDFS--存储优化】
  • SpringBoot项目的发布与运行
  • 基于Hi3861的听话的狗子
  • 【组件】Vue组件之间的通信父传子 | 子传父
  • 万字爽文一篇带你掌握Java8新特性Stream流
  • libusb系列-005-部分API简介
  • 深度学习提高模型准确率方法
  • Android Volley源码解析
  • axios 和 cookie 的那些事
  • Git的一些常用操作
  • go append函数以及写入
  • gulp 教程
  • HTTP--网络协议分层,http历史(二)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Laravel核心解读--Facades
  • nodejs调试方法
  • PAT A1017 优先队列
  • Promise初体验
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 对象管理器(defineProperty)学习笔记
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 你不可错过的前端面试题(一)
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 问题之ssh中Host key verification failed的解决
  • 移动端 h5开发相关内容总结(三)
  • 异常机制详解
  • 在Unity中实现一个简单的消息管理器
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # 达梦数据库知识点
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (arch)linux 转换文件编码格式
  • (LeetCode 49)Anagrams
  • (Qt) 默认QtWidget应用包含什么?
  • (四)Controller接口控制器详解(三)
  • (四)模仿学习-完成后台管理页面查询
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)ABI是什么
  • ***监测系统的构建(chkrootkit )
  • .a文件和.so文件
  • .NET 5种线程安全集合
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net 代码性能 - (1)
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)