【MySQL】——数据库恢复技术

【MySQL】——数据库恢复技术
💻博主现有专栏:

                C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,Python机器学习等
🥏主页链接:

                
Y小夜-ZEEKLOG博客

目录

🎯事务的基本概念

🎃事务

🎃事务的ACID特性

🎯数据库恢复概述

🎯故障的种类

🎃事务内部的故障

🎃系统故障

🎃介质故障

🎃计算机病毒

🎯恢复的实现技术

🎃  数据转储

✨静态转储与动态转储

✨海量转储与增量转储

🎃登记日志文件

✨日志文件的格式和内容

✨日志文件的作用

✨登记日志文件

🎯恢复策略

🎃事务故障的恢复

🎃系统故障的恢复

🎃 介质故障的恢复


🎯事务的基本概念

🎃事务

        事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

        事务和程序是两个概念在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序一个程序通常包含多个事务

        事务是恢复和并发控制的基本单位

事务结束

COMMIT事务正常结束 提交事务的所有操作(读+更新)事务中所有对数据库的更新写回到磁盘上的物理数据库中

ROLLBACK事务异常终止事务运行的过程中发生了故障,不能继续执行系统将事务中对数据库的所有已完成的操作全部撤销事务滚回到开始时的状态

🎃事务的ACID特性

事务的ACID特性:原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持续性(Durability )

原子性事务是数据库的逻辑工作单位事务中包括的诸操作要么都做,要么都不做

一致性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态一致性状态数据库中只包含成功事务提交的结果不一致状态数据库系统运行中发生故障,有些事务尚未完成就被迫中断;这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态

隔离性一个事务的执行不能被其他事务干扰一个事务内部的操作及使用的数据对其他并发事务是隔离的并发执行的各个事务之间不能互相干扰

持久性持续性也称永久性(Permanence)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。

🎯数据库恢复概述

故障是不可避免的计算机硬件故障软件的错误操作员的失误恶意的破坏故障的影响运行事务非正常中断,影响数据库中数据的正确性破坏数据库,全部或部分丢失数据

数据库的恢复数据库管理系统必须具有把数据库从错误状态恢复到某一已知的正确状态(亦称为一致状态或完整状态)的功能,这就是数据库的恢复管理系统对故障的对策恢复子系统是数据库管理系统的一个重要组成部分恢复技术是衡量系统优劣的重要指标

🎯故障的种类

🎃事务内部的故障

有的是可以通过事务程序本身发现的有的是非预期的,不能由事务程序处理的。

事务内部更多的故障是非预期的,是不能由应用程序处理的。运算溢出并发事务发生死锁而被选中撤销该事务违反了某些完整性限制而被终止等  

  以后,事务故障仅指这类非预期的故障

事务故障意味着事务没有达到预期的终点(COMMIT或者显式的ROLLBACK)数据库可能处于不正确状态。

事务故障的恢复:事务撤消(UNDO)强行回滚(ROLLBACK)该事务撤销该事务已经作出的任何对数据库的修改,使得该事务象根本没有启动一样

🎃系统故障

称为软故障,是指造成系统停止运转的任何事件,使得 系统要重新启动。

系统故障的类型特定类型的硬件错误(如CPU故障)操作系统故障数据库管理系统代码错误系统断电

系统故障的影响整个系统的正常运行突然被破坏所有正在运行的事务都非正常终止不破坏数据库内存中数据库缓冲区的信息全部丢失

🎃介质故障

称为硬故障,指外存故障磁盘损坏磁头碰撞瞬时强磁场干扰

介质故障破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务

介质故障比前两类故障的可能性小得多,但破坏性大得多

🎃计算机病毒

 一种人为的故障或破坏,是一些恶作剧者研制的一种计算机程序可以繁殖和传播,造成对计算机系统包括数据库的危害

计算机病毒种类小的病毒只有20条指令,不到50B大的病毒像一个操作系统,由上万条指令组成

计算机病毒的危害有的病毒传播很快,一旦侵入系统就马上摧毁系统有的病毒有较长的潜伏期,计算机在感染后数天或数月才开始发病有的病毒感染系统所有的程序和数据有的只对某些特定的程序和数据感兴趣

🎯恢复的实现技术

恢复机制涉及的关键问题

1. 如何建立冗余数据数据转储(backup)登记日志文件(logging)

2. 如何利用这些冗余数据实施数据库恢复

🎃  数据转储

        转储是指数据库管理员定期地将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程

        备用的数据文本称为后备副本(backup)或后援副本

        数据库遭到破坏后可以将后备副本重新装入

        重装后备副本只能将数据库恢复到转储时的状态

        要想恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务

✨静态转储与动态转储

静态转储在系统中无运行事务时进行的转储操作转储开始时数据库处于一致性状态转储期间不允许对数据库的任何存取、修改活动得到的一定是一个数据一致性的副本

优点:实现简单

缺点:降低了数据库的可用性转储必须等待正运行的用户事务结束新的事务必须等转储结束

动态转储转储操作与用户事务并发进行转储期间允许对数据库进行存取或修改

优点不用等待正在运行的用户事务结束不会影响新事务的运行

动态转储的缺点不能保证副本中的数据正确有效

✨海量转储与增量转储

海量转储: 每次转储全部数据库

增量转储: 只转储上次转储后更新过的数据

海量转储与增量转储比较
从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效

🎃登记日志文件

✨日志文件的格式和内容

什么是日志文件日志文件(log file)是用来记录事务对数据库的更新操作的文件

日志文件的格式以记录为单位的日志文件以数据块为单位的日志文件

以记录为单位的日志文件内容各个事务的开始标记(BEGIN TRANSACTION)各个事务的结束标记(COMMIT或ROLLBACK)各个事务的所有更新操作

✨日志文件的作用

用途进行事务故障恢复进行系统故障恢复协助后备副本进行介质故障恢复

具体作用事务故障恢复和系统故障恢复必须用日志文件。在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库。

✨登记日志文件

为保证数据库是可恢复的,登记日志文件时必须遵循两条原则登记的次序严格按并发事务执行的时间次序必须先写日志文件,后写数据库写日志文件操作:把表示这个修改的日志记录写到日志文件中写数据库操作:把对数据的修改写到数据库中

🎯恢复策略

🎃事务故障的恢复

事务故障:事务在运行至正常终止点前被终止

恢复方法由恢复子系统利用日志文件撤消(UNDO)此事务已对数据库进行的修改

事务故障的恢复由系统自动完成,对用户是透明的,不需要用户干预

事务故障的恢复步骤

(1) 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。

(2) 对该事务的更新操作执行逆操作。即将日志记录中“更新前的值” 写入数据库。 插入操作, “更新前的值”为空,则相当于做删除操作 删除操作,“更新后的值”为空,则相当于做插入操作 若是修改操作,则相当于用修改前值代替修改后值

(3) 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。

(4) 如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。

🎃系统故障的恢复

系统故障造成数据库不一致状态的原因未完成事务对数据库的更新可能已写入数据库已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库

恢复方法

1. Undo 故障发生时未完成的事务

2. Redo 已完成的事务

系统故障的恢复由系统在重新启动时自动完成,不需要用户干预

系统故障的恢复步骤

(1)正向扫描日志文件(即从头扫描日志文件)重做(REDO) 队列: 在故障发生前已经提交的事务这些事务既有BEGIN TRANSACTION记录,也有COMMIT记录撤销 (UNDO)队列:故障发生时尚未完成的事务 这些事务只有BEGIN TRANSACTION记录,无相应的COMMIT记录

(2) 对撤销(UNDO)队列事务进行撤销(UNDO)处理反向扫描日志文件,对每个撤销事务的更新操作执行逆操作即将日志记录中“更新前的值”写入数据库  

(3)对重做(REDO)队列事务进行重做(REDO)处理正向扫描日志文件,对每个重做事务重新执行登记的操作即将日志记录中“更新后的值”写入数据库

🎃 介质故障的恢复

恢复步骤

(1) 装入最新的后备数据库副本(离故障发生时刻最近的转储副本) ,使数据库恢复到最近一次转储时的一致性状态。对于静态转储的数据库副本,装入后数据库即处于一致性状态对于动态转储的数据库副本,还须同时装入转储时刻的日志文件副本,利用恢复系统故障的方法(即REDO+UNDO),才能将数据库恢复到一致性状态。

(2) 装入有关的日志文件副本(转储结束时刻的日志文件副本) ,重做已完成的事务。首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中“更新后的值”写入数据库。

Read more

贪心算法篇——万千抉择中的唯一考量,最优解追寻的跬步累积(1)

贪心算法篇——万千抉择中的唯一考量,最优解追寻的跬步累积(1)

文章目录 * 引言:在选择的海洋中 * 贪心算法的哲学:局部最优,全球最优 * 贪心算法的经典应用 * 贪心算法的局限与挑战 * 结语:智者的选择,最优的未来 引言:在选择的海洋中 在人生的旅途上,每个人都要面临无数的选择。每一个选择,都是一次抉择;每一次抉择,都是命运的交汇点。数学与计算机科学的世界里,贪心算法正是对这种“选择”的一种深刻体现。在一系列的选择面前,贪心算法如同一位睿智的旅行者,始终秉持着最优的哲学:每一次决策都应基于局部最优,以期在最后抵达全局最优的境地。 贪心算法(Greedy Algorithm),正如其名所示,是一种每次都选择当前看起来最优解的算法。这种算法策略简单却充满智慧,常常能够解决很多看似复杂的问题。它通过一种局部的、贪婪的方式,一步步走向最终解。然而,正如智慧的旅行者需要对道路有所预见一样,贪心算法也有其适用的范围,只有在满足某些条件时,它才能发挥出最优解的魅力。 在这篇报告中,我们将深入探讨贪心算法的基本理念、适用范围、经典应用,并通过具体的代码示例,揭开这一算法的神秘面纱。 贪心算法的哲学:

By Ne0inhk
数据结构:手撕堆和哈希表,字符串哈希详解----小白也能懂

数据结构:手撕堆和哈希表,字符串哈希详解----小白也能懂

🎬 博主名称:个人主页 🔥 个人专栏: 《算法通关》,《Java讲解》 ⛺️心简单,世界就简单 序言 其实是想把这篇写到上一篇里面的,但是中途困了,趴桌子上睡着了,真是没招 这篇文章,来手撕 堆和哈希表,这一般面试可能会问到,我们来了解他的思想和思路也是比较舒服的 目录 序言 堆 堆的存储 堆有两个基本操作 1,down( x ) 2 , up( x ) 操作一:插入一个数 操作二:求集合中的最小值 操作三:删除最小值 操作四:删除任意一个元素 操作五:修改任意一个元素 题目模板练习1 题目模板练习二 总结: 哈希表 存储结构:拉链法 存储结构:开放寻址法 处理冲突思路: 查找 删除 总结

By Ne0inhk
【LeetCode经典题解】:从前序和中序遍历构建二叉树详解

【LeetCode经典题解】:从前序和中序遍历构建二叉树详解

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:Java.数据结构 【前言】 二叉树构造是算法中递归分治思想的经典应用,而通过前序与中序遍历序列还原二叉树,更是力扣考察二叉树特性的高频题。前序“根左右”、中序“左根右”的遍历特性,是逐层确定根节点、划分左右子树的关键。本文将从递归分治思想出发,拆解该问题的实现逻辑,分析代码设计的核心细节。 文章目录: * 一、从前序遍历和中序遍历构造二叉树 * 二、思路分析 * 三、代码详解 * 1.代码分析 * 2.代码展示 一、从前序遍历和中序遍历构造二叉树 链接直达:从前序遍历和中序遍历构造二叉树 二、思路分析 根据递归分治思想: 前序遍历:根节点—>左子树—>右子树;找到前序序列的第一个元素就是根节点;中序遍历:

By Ne0inhk
解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题 * 视频地址 * 🌟 引言 * 🔍 问题描述 * 🧠 解题思路回顾 * 快慢指针算法 * 数学原理 * 💻 C++代码实现 * 🛠 代码解析 * 数据结构定义 * 算法实现细节 * 🚀 性能分析 * 🐞 常见问题与调试 * 常见错误 * 调试技巧 * 📊 复杂度对比表 * 🌈 总结 视频地址 因为想更好的为大佬服务,制作了同步视频,这是Bilibili的视频地址 🌟 引言 链表环检测问题在C++中同样是一个经典面试题。本文将用C++实现LeetCode 142题"环形链表II"的解决方案,深入讲解快慢指针算法的原理和实现细节。 🔍 问题描述 给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回 nullptr。 🧠 解题思路回顾 快慢指针算法 1. 使用两个指针:slow每次走一步,fast每次走两步 2.

By Ne0inhk