Mysql复习笔记: 基础概念(待补充)

一. 基础概念

在这里插入图片描述

在这里插入图片描述

通用概念:

  1. 网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句

  2. 在数据库中,哪怕执行一条SQL语句,其实也可以是一个独立的事务,只有当你提交事务之后,SQL语句才算执行结束。

SQL 解析器

所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情

查询优化器

针对编写的SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。按照一个什么样的步骤和顺序,去执行哪些操作去完成SQL操作

存储引擎了

存储引擎其实就是执行SQL语句的,他会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据等等…
常用存储引擎: InnoDB、MyISAM、Memory等等

执行器

执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划

InnoDB的重要内存结构:缓冲池

作用: 缓存很多的数据,以便于以后在查询的时候,内存缓冲池里有数据,就可以不用去查磁盘了

示例:
InnoDB存储引擎要执行更新语句的时候 ,比如对“id=10”这一行数据,他其实会先将“id=10”这一行数据看看是否在缓冲池里,如果不在的话,那么会直接从磁盘里加载到缓冲池里来,而且接着还会对这行记录加独占锁。

  • undo日志文件

在MySQL中,"undo 文件"通常是指存储在InnoDB存储引擎中的撤销日志文件。Undo日志是InnoDB事务性存储引擎的一个核心特性,它用于在事务处理中维持ACID属性(原子性、一致性、隔离性、持久性)的一致性和数据完整性。简单来说,Undo日志记录了事务开始之前的数据状态,以便在事务失败或被撤销时可以将数据回滚到原始状态。

Undo日志的作用
数据恢复:在事务失败或被撤销时,可以利用Undo日志将数据恢复到事务开始之前的状态。
MVCC(多版本并发控制):Undo日志支持MVCC,允许在不同事务中查看数据的旧版本,从而提高并发访问性能。
保证事务的ACID属性:通过撤销未完成的事务更改,Undo日志帮助维持数据库的一致性和完整性。
Undo日志的存储
在MySQL中,Undo日志的存储方式有两种:

内部Undo日志空间:在MySQL 5.7及之前版本,默认Undo日志是存储在系统表空间中的。
独立的Undo表空间文件:从MySQL 8.0开始,支持将Undo日志存储在独立的Undo表空间文件中,这些文件通常位于数据目录下,并以.ibd扩展名结尾。这样做的好处包括改善I/O性能、便于管理等。
配置Undo表空间
在MySQL 8.0及更高版本中,可以配置Undo表空间的数量和位置,一些相关的系统变量如下:

innodb_undo_tablespaces:用于设置独立Undo表空间的数量。
innodb_undo_directory:指定存放Undo表空间文件的目录。
MySQL通过优化Undo日志的存储和管理,提高了数据库的性能和可靠性。当需要处理大量事务时,合理配置Undo日志对于维持数据库的高效运作非常关键。




redo日志

在MySQL中,Redo日志是InnoDB存储引擎的一个重要组成部分,其主要目的是保证数据库的持久性和恢复能力。Redo日志主要用于记录那些已经提交到数据库但可能还没有被写入到磁盘中的物理数据页的修改操作。在数据库发生故障时,Redo日志可以用于重做这些操作,以确保数据的一致性和完整性。

### Redo日志的作用

1. **数据恢复**:在系统发生崩溃或宕机时,Redo日志可以用于恢复未来得及写入磁盘的数据,确保事务的持久性。
2. **提高性能**:通过将短期内的多次数据修改先记录在Redo日志中,然后再统一写入磁盘,可以减少磁盘I/O操作,从而提高数据库性能。

### Redo日志的工作机制

1. **写前日志**(Write-Ahead Logging, WAL):在数据实际被写入磁盘之前,所有的修改操作都会先被记录到Redo日志中。这就是WAL的策略,确保了在发生故障时可以通过Redo日志重做(redo)这些操作,恢复到故障发生前的状态。
2. **日志缓冲**(Log Buffer):修改操作首先被写入到内存中的日志缓冲区。之后,这些修改会按照一定的策略(如定时、事务提交时、日志缓冲区满时)被刷新到磁盘上的Redo日志文件中。
3. **日志刷新**:刷新操作确保了即使在突发的系统崩溃情况下,内存中的事务修改也能够通过Redo日志被恢复。

### Redo日志的配置

在MySQL中,可以通过一些配置项来管理Redo日志的行为和性能,包括:
- `innodb_log_file_size`:设置Redo日志文件的大小。
- `innodb_log_buffer_size`:设置日志缓冲区的大小。
- `innodb_flush_log_at_trx_commit`:设置事务提交时Redo日志的刷新行为。

合理配置Redo日志对于优化InnoDB的性能和确保数据安全至关重要。通过调整Redo日志的大小和刷新策略,可以在系统资源使用和事务安全性之间找到适当的平衡点。

redo日志写入磁盘配置 : innodb_flush_log_at_trx_commit

在MySQL中,要查看innodb_flush_log_at_trx_commit这个系统变量的当前设置,你可以使用以下SQL命令:

SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

这条命令会返回innodb_flush_log_at_trx_commit的当前值。innodb_flush_log_at_trx_commit是一个重要的系统变量,用来定义InnoDB存储引擎在事务提交时如何刷新(写入并同步)事务日志到磁盘上。它可以有以下几个值:

  • 当innodb_flush_log_at_trx_commit=1时,InnoDB将在每次事务提交时将log buffer的数据更新到文件系统os buffer中,并调用文件系统的flush操作将数据缓存更新至磁盘中。此种方式下,数据库完全遵守ACID特性,安全性较高。

  • 当innodb_flush_log_at_trx_commit=2时,InnoDB将在每次事务提交时将log buffer中的数据更新到文件系统缓存中,每秒钟将文件系统缓存中的数据更新到磁盘一次,该操作由操作系统调度。因为DDL变更或其他InnoDB内部原因会导致更新磁盘的操作独立于innodb_flush_log_at_trx_commit参数设置,不能完全保证每秒更新磁盘一次,没有被更新到磁盘中的事务可能会因宕机而丢失。

  • 当innodb_flush_log_at_trx_commit=0时,InnoDB会每秒钟将log buffer中的数据更新到磁盘中。因为DDL变更或其他InnoDB内部原因会导致更新磁盘的操作独立于innodb_flush_log_at_trx_commit参数设置,并不能完全保证每秒将数据更新到磁盘一次。因此,在实例崩溃恢复场景中,可能会出现丢失1秒钟的事务。

选择哪种方式取决于你对数据安全性和性能的权衡。对于需要高数据一致性的应用,推荐使用1;而对于追求最高性能,可以接受极端情况下少量数据丢失的场景,可以选择02

通过了解和设置innodb_flush_log_at_trx_commit的值,你可以根据系统的需要来优化MySQL数据库的性能和可靠性。

参考: https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/innodb-flush-log-at-trx-commit

binlog

binlog不是InnoDB存储引擎特有的日志文件,是属于mysql server自己的日志文件

提交事务的时候,同时会写入binlog

当我们把binlog写入磁盘文件之后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置,都写入到redo log日志文件里去,同时在redo log日志文件里写入一个commit标记。

Binary Log(简称binlog)是MySQL数据库中的一个重要组成部分,它记录了所有对数据库修改的操作,包括表的结构变化(DDL语句如CREATE、ALTER、DROP等)以及数据的变更(DML语句如INSERT、UPDATE、DELETE等),但不记录SELECT和SHOW这类只读操作。这些记录是以“事件”的形式存在,按照它们发生的顺序进行记录。

  • binlog的主要用途
  1. 数据复制:binlog是MySQL数据库复制的基础。在主从复制架构中,主服务器的binlog会被从服务器读取并重放,以此来同步主服务器上的数据更改,实现数据的一致性。

  2. 数据恢复:利用binlog可以进行点时间恢复(Point-in-Time Recovery, PITR)。如果数据库发生意外,可以通过回滚到特定时间点前的状态来恢复数据,前提是你有备份和相应时间段的binlog。

  3. 审计:binlog也可用于审计和分析,通过查看binlog内容,可以知道在特定时间段内对数据库做了哪些修改。

  • binlog的格式

MySQL支持三种不同的binlog格式:

  1. STATEMENT:基于SQL语句的复制。记录执行的每个SQL语句。这种方式可能在某些特定的操作下(如使用了非确定性函数的语句)不能准确复制数据到从服务器。

  2. ROW:基于行的复制。记录被修改行的内容变化。这种格式记录的信息更为详细,准确性更高,但会产生更多的日志数据,占用更多的磁盘空间。

  3. MIXED:混合模式,默认情况下,MySQL会使用STATEMENT格式记录日志,但在某些情况下(当STATEMENT格式可能导致数据不一致时),会自动切换到ROW格式。

  • 配置binlog

在MySQL服务器的配置文件(通常是my.cnfmy.ini)中,可以通过设置log_bin选项来启用binlog。

例如:

[mysqld]
log_bin = /var/log/mysql/mysql-bin.log

此外,还可以配置binlog的格式(binlog_format)、过期时间(expire_logs_days)等选项来满足不同的需要。

  • 查看binlog内容

MySQL提供了mysqlbinlog工具来查看和处理binlog文件。你可以使用这个工具来解析binlog文件的内容,或将其转换为SQL语句。

mysqlbinlog /path/to/binlog-file

binlog如何过滤数据库

在MySQL中,Binary Log(binlog)记录了数据库更改操作的所有细节,对于实现数据复制、恢复以及审计等功能至关重要。尽管binlog记录了所有数据库的活动,但在实际应用中,我们有时候需要针对特定数据库(db)的活动进行过滤或者分析,这就需要我们能够区分不同数据库的binlog记录。

  • 指定数据库的binlog记录

当你需要开启binlog功能并指定只针对特定的数据库进行记录时,可以通过在MySQL的配置文件(通常是my.cnfmy.ini)中设置binlog-do-db来实现。例如,如果你只想记录数据库mydb的更改操作,可以这样设置:

[mysqld]
log_bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mydb

请注意,这种方法有其局限性:

  • 如果事务中涉及多个数据库,但当前默认数据库是binlog-do-db中指定的,那么整个事务的更改都会被记录下来,即使事务中有些更改是针对未在binlog-do-db中指定的数据库。

  • 使用binlog-do-db时,需要确保应用在执行更改前正确地选择了数据库(即执行了USE database_name语句)。

  • 使用mysqlbinlog工具过滤数据库

如果你已经有了一个包含多个数据库活动的binlog文件,而现在需要筛选出特定数据库的活动,可以使用mysqlbinlog工具的数据库过滤功能。mysqlbinlog命令提供了--database(或-d)选项,允许你仅显示指定数据库的binlog事件。例如:

mysqlbinlog --database=mydb /path/to/mysql-bin.000001

这个命令将只显示日志文件/path/to/mysql-bin.000001mydb数据库的事件。

  • 注意事项

  • 当你需要严格地按数据库过滤binlog时,应细致地规划数据库操作和事务管理,以确保binlog准确地反映了所需数据库的变更。

  • 也可以使用binlog-ignore-db来指定哪些数据库的更改不应该被记录到binlog中,这是另一种通过排除法来间接指定记录的数据库的方法。

总的来说,虽然MySQL的binlog记录了所有数据库的变更操作,但通过合理配置和使用工具,我们可以实现对特定数据库更改操作的跟踪和分析。这在数据库管理、故障恢复和数据复制等方面提供了很大的灵活性和便利。

binlog 参数 sync_binlog 默认值

sync_binlog是MySQL Binlog日志的重要参数,用于控制Binlog的更新策略,通过对该参数的调优,可以提升数据库的性能和数据安全性:

MySQL 5.6及之前的版本中,sync_binlog的默认值是0
MySQL 5.7开始,sync_binlog的默认值被改变为1

当sync_binlog=1时,MySQL会在每次事务提交后,将Log Buffer中的数据更新到磁盘上,此时MySQL安全性较高,但是IO消耗也较高。

当sync_binlog=0时,MySQL会在每次事务提交后将binlog_cache中的数据更新至文件系统缓冲区,但不会进行持久化,而是依赖操作系统来调度数据刷入磁盘。

当sync_binlog=N时,MySQL会在每N组事务提交后将数据更新到磁盘中。通过这种方式,可以在一定程度上平衡MySQL的性能和数据的安全性。如果N设置得比较大,可以提高系统的性能,但会降低数据的安全性。

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

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

相关文章

Python | Leetcode Python题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def generateMatrix(self, n: int) -> List[List[int]]:matrix [[0] * n for _ in range(n)]num 1left, right, top, bottom 0, n - 1, 0, n - 1while left < right and top < bottom:for col in range(left, r…

pandas学习笔记11

DataFrame结构 DataFrame 一个表格型的数据结构&#xff0c;既有行标签&#xff08;index&#xff09;&#xff0c;又有列标签&#xff08;columns&#xff09;&#xff0c;它也被称异构数据表&#xff0c;所谓异构&#xff0c;指的是表格中每列的数据类型可以不同&#xff0c;…

python中type,object,class 三者关系

type,object,class 三者关系 在python中&#xff0c;所有类的创建关系遵循&#xff1a; type -> int -> 1 type -> class -> obj例如&#xff1a; a 1 b "abc" print(type(1)) # <class int> 返回对象的类型 print(type(int)) …

力扣打卡第二天

206. 反转链表 class Solution { public:ListNode* reverseList(ListNode* head) {// //迭代法// ListNode *pre nullptr;// ListNode *curr head;// while(curr){// ListNode *next curr -> next;// curr -> next pre;// pre curr;// curr next;/…

Unity UGUI Image 点击事件忽略空白像素区域

我们会遇到图片不是方形的不规则图片。这个时候我们希望只有点击到图像内容本身才算点击&#xff0c;点击空白区域则不算点击。而UGUI对图片的处理是整个图片都会算作点击区域&#xff0c;这样不能满足于我们的使用需求了。 首先我们需要把图片本身的Read/Write 选项打开 然后…

质因数分解(cpp实现)--一种快速求得一个数有多少个因子的黑魔法

前言 最近机试没少吃不会质因数分解的亏&#xff0c;用传统的求得因子个数只能过一点点…(ex, 20%) 质因数分解后&#xff0c;可以将因子问题转化为 集合的组合问题&#xff0c;因此会很快&#xff0c;目测是 l o g n log n logn (n是该整数的值)。 传统解法 假设输入整数的…

基于OpenCv的图像特征点检测

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

从0开始linux(1)——文件操作

欢迎来到博主的专栏——从0开始linux 博主ID&#xff1a;代码小豪 博主使用的linux发行版是&#xff1a;CentOS 7.6 不同版本下的操作可能存在差异 文章目录 命令文件操作命令文件树和文件路径文件树绝对路径相对路径 文件属性tree指令删除文件复制文件 大家还记得在小学第一次…

C语言-链表实现贪吃蛇控制台游戏

使用C语言和链表实现贪吃蛇游戏 一、引言 贪吃蛇游戏是一个经典的游戏&#xff0c;它的玩法简单而富有挑战性。在这个博客中&#xff0c;我将分享如何使用C语言和链表数据结构来自主实现贪吃蛇游戏。我会详细介绍游戏的设计思路、编码过程、遇到的问题及解决方案&#xff0c;…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段&#xff1a; 1. 概论 自动驾驶系统的认知中有一些模糊的地方&#xff0c;比如自动驾驶系统如何定义的问题&#xff0c;自动驾驶的研发为什么会有那么多的子模块&#xff0c;怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍&#xff0c;了解自动驾…

Rust 生命周期浅谈

1. 简述 Rust 中的每一个引用都有其 生命周期&#xff08;lifetime&#xff09;&#xff0c;也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的&#xff0c;正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型&#xff0c;…

JAVA语言开发的智慧城管系统源码:技术架构Vue+后端框架Spring boot+数据库MySQL

通过综合应用计算机技术、网络技术、现代通信技术等多种信息技术&#xff0c;充分融合RS遥感技术、GPS全球定位技术、GIS地理信息系统&#xff0c;开始建设一个动态可视的、实时更新的、精细量化的城市管理系统。智慧城管将采用云平台架构方式进行建设&#xff0c;基于现有数字…

【idea-sprongboot项目】SSH连接云服务器进行远程开发

继上一篇博客【阿里云服务器】ubuntu 22.04.1安装docker以及部署java环境-CSDN博客 目录 五、远程开发方式 1&#xff09;SSH进行远程开发 步骤 配置文件同步 window电脑远程操控 正式通过window电脑远程操控 运行在linux服务器上的远程程序 调试在linux服务器上的远程程…

恶补《操作系统》5_2——王道学习笔记

5.2_1 I-O核心子系统 1、用户层软件 假脱机系统 2、设备独立性软件&#xff08;设备无关性软件&#xff09; IO调度、设备保护、设备分配与回收、缓冲区管理 3、设备驱动程序&#xff08;比如打印机驱动&#xff09; 4、中断处理程序 5、硬件 5.2_2 假脱机技术&#xff…

PHP医疗不良事件上报系统源码 AEMS开发工具vscode+ laravel8 医院安全(不良)事件报告系统源码 可提供演示

PHP医疗不良事件上报系统源码 AEMS开发工具vscode laravel8 医院安全&#xff08;不良&#xff09;事件报告系统源码 可提供演示 医院安全不良事件报告系统&#xff08;AEMS&#xff09;&#xff1b;分为外部报告系统和内部报告系统两类。内部报告系统主要以个人为报告单位&…

智慧文旅开启沉浸式文化体验,科技让旅行更生动:借助智慧技术,打造沉浸式文化体验场景,让旅行者在旅行中深度感受文化的魅力

一、引言 随着科技的飞速发展&#xff0c;传统旅游行业正经历着前所未有的变革。智慧文旅&#xff0c;作为一种新兴的旅游模式&#xff0c;正以其独特的魅力&#xff0c;吸引着越来越多的旅行者。智慧文旅不仅改变了人们的旅行方式&#xff0c;更在深度上丰富了人们的文化体验…

linux上如何排查JVM内存过高?

怎么排查JVM内存过高&#xff1f; 前言&#xff1a; 想必工作一两年以后的同学都会逐渐面临到&#xff0c;jvm等问题&#xff0c;但是可能苦于无法熟练的使用一些工具&#xff1b;本文将介绍几个比较常用分析工具的使用方法&#xff0c;带着大家一步步定位分析问题。 1、top 查…

代码随想录算法训练营DAY54|C++动态规划Part15|647.回文子串、516最长回文子序列、

文章目录 647.回文子串思路CPP代码双指针 516最长回文子序列思路CPP代码 动态规划总结篇 647.回文子串 力扣题目链接 文章链接&#xff1a;647.回文子串 视频链接&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串 其实子串问…

【C++第八课 - string的底层实现】

目录 基础知识string构造函数和析构函数的坑构造函数析构函数 迭代器、范围for运算符重载operator [] const增删查改push_backreserveappendinserteraseswapfindsubstr拷贝构造 流插入和流提取<<流插入>>流提取clear 深浅拷贝传统写法现代写法 赋值传统写法现代写法…

## 01深度学习介绍与安装PyTorch

文章目录 深度学习的发展历史和基本概念早期历史兴起与发展基本概念 如何安装和设置PyTorch环境系统要求安装步骤验证安装 结语 深度学习的发展历史和基本概念 深度学习&#xff0c;一种通过使用具有多层结构的神经网络来学习数据的复杂模型的机器学习技术&#xff0c;近年来已…