1. 数据库恢复技术
数据库的恢复技术主要目标是确保系统在遭遇故障时能够迅速恢复到一致性状态,并尽量避免数据丢失。其关键目标包括:
- 持久性:一旦事务提交,其结果必须持久化,即使发生系统崩溃也不会丢失。
- 可靠性:确保数据库在故障发生后能恢复到一致的状态。
- 一致性:恢复后的数据应该保持逻辑上的一致性,没有任何错误或不一致。
这意味着数据库恢复不仅需要恢复物理存储的内容(如数据块和文件),还要保证数据库的业务逻辑一致性,即恢复后的数据库不应违反任何完整性约束。
2. 事务的基本概念
事务是数据库中操作的一个基本单位,是数据库恢复技术和并发控制的基本单位,事务由一系列的数据库操作组成,这些操作要么全部执行(操作全部成功,事务成功提交),要么全部不执行(事务全部失败,全部回滚)。
3. 数据库恢复的基本原则
数据库恢复技术依赖于 ACID 特性,确保即使发生故障,数据库依然能够遵循事务的四个重要特性**(事务的ACID特性)**:
- 原子性(Atomicity):事务中的操作要么全部执行,要么全部不执行。恢复过程中,未完成的事务需要回滚,已提交的事务需要重做。
- 一致性(Consistency):恢复后,数据库应该处于一致状态,满足所有的约束条件,如主键、外键等。
- 隔离性(Isolation):每个事务应该相互独立,即使在恢复过程中也要保证事务之间的隔离。
- 持久性(Durability):一旦事务提交,其结果应该永久保存在数据库中,即使系统崩溃,数据也不会丢失。
4. 日志管理
日志是数据库恢复技术中的核心组件,记录了事务对数据库的所有操作。通过日志,数据库可以回滚未提交的事务,或者重做已提交事务的操作。
-
事务日志:是记录数据库所有变化(插入、更新、删除)的日志文件。数据库系统一般通过事务日志来执行恢复操作。日志文件中的每一条记录通常包括事务ID、操作类型(如插入、删除或更新)、数据对象(如表名、行号)及修改前后的数据。
-
顺序日志:是最常见的日志形式。所有日志记录按顺序写入日志文件。
-
双写日志:在某些系统中,为了避免数据写入磁盘时可能出现的损坏,采用双写日志,即将数据写入两次,不同的日志文件中,以确保数据的安全性。
-
日志持久化:为了保证日志的可靠性,日志通常会被持久化保存。即使数据库系统崩溃,未写入磁盘的日志数据依然能够恢复。许多系统使用特殊的日志存储设备来保障日志的持久性。
5. 故障的种类
故障通常分为以下几类:
- 系统故障:如硬件故障、操作系统崩溃等,导致数据库管理系统(DBMS)无法继续执行。
- 事务故障:指事务在执行过程中发生了错误,导致事务不能正常完成。这通常是由于程序错误、逻辑错误等原因。
- 介质故障:由于外在存放数据的部分发生故障而导致数据存放出现故障,如磁盘损坏,磁头碰撞,顺势强磁场干扰,破坏硬盘数据的计算机病毒等。
6. 恢复操作的类型
恢复操作主要包括 重做 和 回滚 两种类型的操作。
-
重做:针对已经提交的事务,数据库需要通过重做操作将这些事务所做的修改重新应用到数据库中,确保所有已提交事务的效果最终能够被反映到数据库。重做是根据日志记录进行的,每一条日志都会在恢复过程中重新执行,直到数据库状态恢复到崩溃前。
-
回滚(即撤销操作):对于尚未提交的事务,数据库需要执行回滚操作,通过撤销事务对数据库的修改,将数据库恢复到事务开始之前的状态。回滚操作通过查看日志中的"撤销"记录,撤回对数据的修改。
8. 恢复算法
数据库恢复通常采用一些算法来优化恢复过程,常见的恢复算法包括:
-
检查点技术:为了加快恢复速度,数据库系统会定期创建检查点。检查点将数据库的当前状态保存到磁盘上,标记当前所有已提交事务的数据为"安全"。恢复时,系统可以从最近的检查点开始恢复,避免从头开始回放所有日志,从而提高恢复效率。
-
回放日志算法:回放日志的基本思想是从数据库的最后一个检查点开始,按日志顺序逐条回放事务日志,首先重做已提交事务的操作,随后回滚未提交事务的操作。回放日志算法的关键点在于日志的顺序性,确保在恢复过程中操作的正确性。
-
前滚与后滚恢复策略:
- 前滚:主要用于恢复已提交事务的操作。对于每一条日志记录,都将其对应的数据库操作重新应用一次。
- 后滚:用于撤销未提交的事务的操作。对于每个未提交的事务,执行撤销操作,使得数据库恢复到事务开始之前的状态。
9. 具有检查点的恢复技术
检查点是数据库系统中的一个重要机制,用于减少故障恢复时的工作量。在数据库操作期间,定期生成检查点,记录下数据库的当前状态,并将所有更改写入磁盘。检查点的存在使得恢复过程变得更加高效。
- 工作原理 :
- 系统会在某些时刻触发检查点,记录当前内存中数据的状态,并将未写入磁盘的数据刷新到磁盘。
- 在故障发生时,系统只需从最近的检查点开始恢复,减少了从日志中重做或撤销的操作量。
10. 备份与恢复
-
全量备份:这是最简单的一种备份方式,即将数据库的整个内容定期备份,恢复时从备份文件开始。全量备份的优点是恢复方便,缺点是备份文件较大,且恢复时间较长。
-
增量备份:增量备份只备份自上次备份以来发生变化的数据。这种方式节省存储空间,但恢复时需要先恢复上次全量备份,再恢复所有增量备份文件,过程较为复杂。
-
差异备份:差异备份是从上次全量备份后,记录自上次备份以来所有的变化。恢复时,只需要恢复上次全量备份和差异备份,速度相对增量备份较快。
-
备份恢复的步骤:
- 恢复备份文件:首先恢复全量备份文件或增量/差异备份文件。
- 日志回放:在恢复了备份文件之后,系统将继续回放日志,以确保恢复后的数据库能够反映最新的事务修改。
11. 恢复的两种模式
数据库系统的恢复模式通常可以分为两种:
-
自动恢复:数据库系统在系统崩溃时,能够自动检测到故障并进行恢复。现代数据库系统通常都提供自动恢复功能,操作系统和数据库软件会自动识别未提交的事务并通过日志恢复。
-
手动恢复:当系统无法自动恢复时,管理员需要介入,手动执行恢复操作。这通常发生在硬件故障或无法访问日志的情况下,管理员需要根据备份文件和日志文件手动恢复数据库。
12. 故障类型与应对措施
数据库在运行过程中可能遭遇以下几种常见故障类型,恢复技术需要针对不同故障采取相应的措施:
- 事务失败:如果一个事务执行过程中失败(如程序崩溃),那么该事务对数据库的修改应该撤回(回滚),并恢复到事务开始之前的状态。
- 系统崩溃:如果数据库系统因故障或硬件问题崩溃,恢复过程将包括从最后一个检查点开始,回放日志,重做已提交事务并回滚未提交事务。
- 硬件故障:硬件故障(如磁盘损坏)可能会导致部分数据丢失。此时,数据库系统需要通过备份文件和日志来恢复丢失的数据。
13. RAID与数据库恢复
- RAID(冗余独立磁盘阵列):RAID技术通过将数据分布到多个硬盘上来实现容错,从而在某个硬盘出现故障时仍然能保证数据不丢失。数据库系统经常与RAID配合使用,以提高故障恢复的能力。RAID的不同级别(如RAID 1、RAID 5、RAID 6)提供不同程度的数据冗余和性能,能够在硬件故障时帮助数据库恢复。
14. 事务恢复的具体步骤
- 检查日志:首先检查事务日志,确认哪些事务是已提交的,哪些事务是未提交的。
- 回滚未提交事务:对于未提交的事务,根据日志执行回滚操作,撤销对数据库的修改。
- 重做已提交事务:对于已提交的事务,执行重做操作,确保其修改能够反映到恢复后的数据库中。
恢复过程中的关键是保证日志文件的完整性以及系统能够正确识别提交和未提交的事务。
15. 数据库镜像
数据库镜像是一种通过在多个物理位置复制数据库内容来保证数据库高可用性的技术。镜像数据库通常会实时复制主数据库的内容,以便在主数据库发生故障时,能够快速切换到镜像数据库。
- 工作原理 :
- 主数据库和镜像数据库通过网络连接同步数据。所有的写操作会同时更新到主数据库和镜像数据库。
- 如果主数据库发生故障,系统可以自动切换到镜像数据库,继续提供服务,从而避免数据丢失和停机时间。
16. SQL Server 示例代码
在 SQL Server 中,可以使用以下代码来实现一些恢复相关的操作:
16.1 创建事务日志
sql
BEGIN TRANSACTION;
-- 执行一些操作
UPDATE Employees SET Salary = Salary + 1000 WHERE Department = 'HR';
-- 提交事务
COMMIT TRANSACTION;
16.2 使用检查点
sql
-- 手动触发检查点
CHECKPOINT;
16.3 恢复操作(从日志恢复)
SQL Server 支持通过事务日志来恢复数据,如果数据库故障,可以通过以下语句进行日志恢复:
sql
RESTORE DATABASE YourDatabase
FROM DISK = 'backupfile.bak'
WITH NORECOVERY;
-- 恢复日志
RESTORE LOG YourDatabase
FROM DISK = 'logfile.trn'
WITH RECOVERY;
16.4 数据库镜像设置
数据库镜像可以通过 SQL Server Management Studio 或 Transact-SQL 进行配置。示例:
sql
-- 启动数据库镜像
ALTER DATABASE YourDatabase
SET PARTNER = 'TCP://partnerserver:5022';
这些代码示例展示了数据库恢复技术在实际操作中的一些应用。
17 有日志的题目如何写:
例题:
17.1 题目解析:T1,T2,T3,T4代表的是不同的事务,T1是第一个执行的事务,T2是第二个执行的事务,T3是第三个执行的事务,T4是第四个执行的事务
17.1 解析:
根据表格11.2 回答第一、二大题:已经提交过的需要重做,没有提交的需要回滚,已经回滚过的不需要操作,没有开始的事务无需操作;T1事件已经提交,则在提交之前T1做的所有操作,修改的所有值都会永远保存下来,如果后面没有事件对T1已经修改的值再进行修改并且提交之后的话,那这个值就一直都是T1提交之后对应的值。
17.2 第一题:
(1)如果系统故障发生在序号14之后,说明哪些事务需要重做,哪些事务需要回滚。
答:T1,T3需要重做,T4需要回滚,T2不需要做任何操作。
(2)如果系统故障发生在序号10之后,说明哪些事务需要重做,哪些本务需要回滚。
答:T1需要重做,T3需要回滚,T2不需要做任何操作。
(3)如果系统故障发生在序号9之后,说明哪些事务需要重做,哪些事务需要回滚。
答:T1需要重做,T2,T3需要回滚,T4不需要做任何操作。
(4)如果系统故障发生在序号7之后,说明哪些事务需要重做,哪些事务需要回滚。
答:T1,需要重做,T2需要回滚,T3,T4不需要做任何操作。
17.3 第二题:
(1)如果系统故障发生在序号14之后,写出系统恢复后A、B、C的值。
答:A=8;B=7;C=11
(2)如果系统故障发生在序号12之后,写出系统恢复后A、B、C的值。
答:A=10;B=0;C=11
(3)如果系统故障发生在序号10之后,写出系统恢复后A、B、C的值。
答:A=10;B=0;C=11
(4)如果系统故障发生在序号9之后,写出系统恢复后A、B、C的值。
答:A=10;B=0;C=11
(5)如果系统故障发生在序号7之后,写出系统恢复后A、B、C的值。
答:A=10;B=0;C=11