系统架构师:数据库的故障与恢复

数据库的故障可用事务的故障来表示,主要分为四类:

  • 事务故障。事务在运行过程中由于种种原因,如输入数据的错误、运算溢出、违反了某些完整性限制、某些应用程序的错误,以及并发事务发生死锁等,使事务未运行至正常终止点就被撤销,这种情况称为“事务故障”。
  • 系统故障。系统故障是指系统在运行过程中,由于某种原因(如操作系统或数据库管理系统代码错误、操作员操作失误、特定类型的硬件错误(如 CPU 故障)、突然停电等造成系统停止运行),致使事务在执行过程中以非正常方式终止,这时内存中的信息丢失,但存储在外存储设备上的数据不会受影响。
  • 介质故障。系统在运行过程中,由于某种硬件故障,如磁盘损坏、磁头碰撞或由于操作系统的某种潜在的错误、瞬时强磁场干扰,使存储在外存上的数据部分损失或全部损失,称为“介质故障”。这类故障比前两类故障的可能性虽然小得多,但破坏性却最大。
  • 计算机病毒。计算机病毒是一种人为破坏计算机正常工作的特殊程序。通过读写染有病毒的计算机系统中的程序与数据,这些病毒可以迅速繁殖和传播,危害计算机系统和数据库。目前大多数病毒是在 PC 和其兼容机上传播的。有的病毒一侵入系统就马上摧毁系统,有的病毒有较长的潜伏期,有的病毒则只在特定的日期发生破坏作用,有的病毒感染系统所有的程序和数据,有的只影响特定的程序和数据。在数据库系统中,恢复的基本含义就是恢复数据库本身。也就是说,在发生某种故障使数据库当前的状态已经不再正确时,把数据库恢复到已知为正确的某一状态。目前数据库系统中最常用的恢复方法是转储和登记日志文件,可根据故障的不同类型,采用不同的恢复策略。

事务故障的恢复。事务故障是指事务未运行至正常终止点前被撤销,这时恢复的系统应对此事务做撤销处理。事务故障的恢复是由系统自动完成的,不需要用户干预,步骤如下:

  1. 反向扫描文件日志,查找该事务的更新操作。
  2. 对该事务的更新操作执行逆操作。
  3. 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。
  4. 如此处理下去,直至读到此事务的开始标记,事务故障恢复完成。

系统故障的恢复。系统故障发生时,造成数据库不一致状态的原因有两个:一是由于一些未完成事务对数据库的更新已写入数据库;二是由于一些已提交事务对数据库的更新还留在缓冲区没来得及写入数据库。系统故障的恢复是在重新启动时自动完成的,不需要用户干预,步骤如下:

  1. 正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做(Redo)队列。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销(Undo)队列。
  2. 对撤销队列中的各个事务进行撤销处理:反向扫描日志文件,对每个 Undo 事务的更新操作执行逆操作。对重做队列中的各个事务进行重做处理:正向扫描日志文件,对每个 Redo 事务重新执行日志文件登记的操作。
  3. 介质故障与病毒破坏的恢复。在发生介质故障和遭病毒破坏时,磁盘上的物理数据库被破坏,这时的恢复操作可分为三步:
    1. 装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态。
    2. 从故障点开始反向读日志文件,找出已提交事务标识将其记入重做队列。
    3. 从起始点开始正向阅读日志文件,根据重做队列中的记录,重做所有已完成事务,将数据库恢复至故障前某一时刻的一致状态。

具有检查点的恢复技术。检查点记录的内容可包括:

建立检查点时刻所有正在执行的事务清单。

这些事务最近一个日志记录的地址。采用检查点的恢复步骤如下:

  1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。
  2. 由该检查点记录得到检查点建立时所有正在执行的事务清单队列A。建立重做队列R和撤销队列U,把 A 队列放入 U 队列中,R 队列为空。
  3. 从检查点开始正向扫描日志文件,若有新开始的事务 T1,则把 T1 放入 U 队列,若有提交的事务 T2,则把T2从U队列移到R队列,直至日志文件结束。
  4. 对 U 队列的每个事务执行 Undo 操作,对 R 队列的每个事务执行 Redo 操作。

DBA 要做的基本操作是:

  1. 重装最近转储的后援副本。
  2. 运行日志文件,执行系统提供的恢复命令。

数据库安全和恢复是数据库系统正常运行的保证。大型数据库管理系统一般都提供了实现安全机制的保证,即由系统提供了相应的功能,但小型的数据库管理系统并非都具有相应功能,因此有时需要人工的辅助措施,用以保证数据库的安全和恢复。

SQL Server 各种安装失败,报错“等待数据库引擎恢复句柄失败”

最近安装SQL 2019遇到这个问题,试过网上几乎所有办法,都安装不上。最后在微软社区提问解决了,由于这个问题不常见,并且网上几乎没有正确的解决方案,因此将我的解决过程及经验记录分享一下,也为后来者提供参考。

  1、如果是权限问题,现有的网上很多修改权限的方案是可以解决安装问题的,在此不做介绍。

  2、按网上修改了权限、或其他一系列正确操作后,还是安装不上的。这种情况的用户,有一个共同点,电脑是近几年内新购的(现在是2022.03)

  以下只是第2种情况的分析和解决

  首先,导致这个问题原因是硬盘扇区大小与SQL Server不兼容。

  目前SQL Server只支持512B和4KB大小的扇区,而现在一些新的硬件设备,扇区大小有时会大于4Kb,与SQL Server不兼容,所以会一直安装不上。

  可以查看自己硬盘分区的扇区大小是否与SQL Server兼容,用管理员身份运行PowerShell,输入fsutil fsinfo sectorinfo D:(如想查询其他分区,修改对应盘符即可)

  在返回的信息中,查看 PhysicalBytesPerSectorForAtomicity的值,如果值不是512或4096,则代表SQL Server无法安装到此硬盘上。

  这个是我的电脑扇区大小

  解决方案:

  方案1:格式化硬盘,重新分配扇区大小,让扇区大小与SQL Server匹配。

    此方法可以将整个硬盘格式化掉,当然这样做的结果就是丢失所有文件,并且还需要重装系统。也可以格式化一个硬盘分区,将SQL Server安装到对应的分区就行。

  方案2:强制模拟扇区大小为4Kb

    此方法不会影响硬盘分区,但可能会造成一点性能方面的损失。

    用管理员身份运行PowerShell,

    输入:New-ItemProperty -Path \”HKLM:\\SYSTEM\\CurrentControlSet\\Services\\stornvme\\Parameters\\Device\” -Name \”ForcedPhysicalSectorSizeInBytes\” -PropertyType MultiString -Force -Value \”* 4095\”

    验证:Get-ItemProperty -Path \”HKLM:\\SYSTEM\\CurrentControlSet\\Services\\stornvme\\Parameters\\Device\” -Name \”ForcedPhysicalSectorSizeInBytes\”(查看强制模拟结果)

    然后重启电脑,安装SQL Server。

    注意:通过强制模拟扇区大小为4Kb后,PhysicalBytesPerSectorForAtomicity值是不会改变的,比如我的电脑,在强制模拟后,PhysicalBytesPerSectorForAtomicity值还是32768

连续2周,各种安装方法,结果惊奇的一致,永远的“数据库引擎服务”-失败,永远地“等待数据库引擎恢复句柄失败”:

强制模拟后,安装结果,终于成功了:

数据库数据恢复—SQLserver数据库ndf文件损坏的数据恢复案例

数据库数据恢复环境&故障:

一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。

存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。

虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。

数据库数据恢复过程:

1、将存储上所有磁盘标记后取出,经过硬件工程师检测没有发现有硬盘存在硬件故障,都可以正常读取。以只读方式将所有磁盘进行扇区级全盘镜像。镜像完成后将所有磁盘按照原样还原到原存储中。后续的数据分析和数据恢复操作都基于镜像文件进行,避免对原始数据造成二次破坏。

2、北亚企安数据恢复工程师编写数据库碎片扫描程序扫描数据库碎片。根据NDF文件的页面特征,按照文件号和页号拼接碎片,重组生成那些大小变为0kb的NDF文件。

3、使用SQLServer文件检测工具检测所有数据文件,结果发现拼接出的数个NDF文件有少量的空页,其他文件正常。

4、进一步分析发现数据页在存储层面已经不存在了,这些数据页无法恢复,即这几个NDF文件无法完整恢复。

5、尝试附加数据库,报错 “处理数据库的日志时出错,如果可能请从备份还原。如果没有可用的备份,可能需要重新生成日志。”

6、修改系统表,从系统表剔除掉最后添加的LDF文件,计算并修改校验。尝试进行无日志附加数据库,报错:“数据库存在一致性错误。”

北亚企安数据恢复—SQLServer数据库数据恢复

7、修改系统表中记录这几个损坏的NDF文件的块数量的值,改为和拼接出来的NDF文件块的数量一致,更改这4个NDF文件首页,计算并修改校验值。

8、无日志附加数据库,仍然报错“数据库存在一致性错误。”

9、由于空页都出现在这几个NDF文件后面的十几个块中,截断文件对数据完整性影响不大。重新修改系统表和NDF文件,将数据库中记录NDF文件的块数量的值改为等于报错的块前一页,计算并修改校验。

10、重新进行无日志附加数据库,报错“由于数据库没有完全关闭,无法重新生成日志。”

北亚企安数据恢复—SQLServer数据库数据恢复

11、修改MDF文件中的数据库的状态值,让数据库认为是完全关闭的。

12、重新附加数据库,附加成功。

北亚企安数据恢复—SQLServer数据库数据恢复

数据库数据恢复结果:

数据库文件成功附加后,由用户方通过数据库中的对象进行查询&验证,经过查询验证,确定表中信息基本完整,数据恢复完整。用户方认可数据恢复结果。

北亚企安数据恢复—SQLServer数据库数据恢复

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。