[教学] 如何使用Visual Studio 内建SQL工具修复资料库

大家好,我是一名菜鸟工程师,这篇文章用来记录我工作遇到的需求及解决方式,如果有更好的解决方式,也欢迎大家提出,话不多说,赶快开始今天的教学吧。

遇到的问题

这次遇到的问题主要是客户反映了某笔资料点入编辑页的时候会出现错误,实际去查询原因後,在进入编辑页的时候,会对某个table纪录更新时间,但奇怪的是只有这笔资料会出现错误,其他笔资料都正常运作。
实际用SQL Server下指令後,SQL 会报出这个错误
Imgur

求助Google大神後,发现造成这个问题的原因,可能是资料库发生毁损,所以先在SQL Server用了 DBCC CHECKDB
对资料库进行检查,不检查还好,一检查发现有很多table都有发生配置错误或是一致性错误,因此接下来就必须进行DB修复工作

解决心路历程

SQL Server 有提供修复DB的指令一共分成3种

  • DBCC CHECKDB ('资料库名',REPAIR_FAST)
  • DBCC CHECKDB ('资料库名',REPAIR_REBUILD)
  • DBCC CHECKDB ('资料库名',REPAIR_ALLOW_DATA_LOSS)

根据Microsoft Docs的解释,第一种的REPAIR_FAST不会进行任何修复动作,会进行修复只有REPAIR_REBUILD及REPAIR_ALLOW_DATA_LOSS,经过实际测试 REPAIR_ALLOW_DATA_LOSS可以修复大部分table出现的错误,至於资料部分就不一定了,因为平常该资料库会一个星期备份一次,我拿了两个时间备份的DB测试,一个资料没有因修复而被删除,一个资料则有,所以如果真的要用还是先备份一下资料库比较好。

在修复完成後,再跑一次DBCC CHECKDB确认一下资料库,结果还是有错误

Imgur

这下子就麻烦了,因为这个错误在修复过程中,是直接显示"无法修复此错误" 然後被跳过去
好吧既然无法完全修复,那就试试看别条路,所幸Visual Studio 内建提供一个SQL 比较工具,可以比较两个DB间的结构和资料,再加上查了备份档後,发现是从某个星期开始出现问题,因此在那个星期前的DB都是正常没有任何错误的状态
因此与公司的主管和MIS讨论後,决定利用这个工具,将目前的DB的结构与资料全部抄写进入完整无错误的旧DB,然後确认资料与原先DB皆相同後,就改用这个复制的DB,在这麽做後,目前运作还算是正常,不过主管还是提醒,因为比较是由软件比较的,到底有没有完整比较然後复制过去还是必须观察。
接下来我就稍微介绍一下Visual Studio 内建SQL工具。

Visual Studio 内建SQL工具

以下是我修复步骤

  1. 点选工具->SQL Server -> 新增资料比较
    Imgur

2.来源资料库请选择 有问题的DB
Imgur

3.目标资料库选择完整无误的DB,好了点选下一步
Imgur

4.两个都打勾
Imgur

5.比对完成後,点选更新目标
Imgur

比对完成後,中间的三栏分别代表新增、更新、删除,最後一栏则是两个DB相同纪录

6.确认是否更新完成後,点击重新整理,此时会再重新比对一次
Imgur

7.确认比对完成的两个DB无差异,中间三栏数字应为0,表示这两个DB资料已无差异
Imgur

8.最後执行sql : DBCC CHECKDB ('资料库名称'); 确认DB状态
Imgur

要注意的是这个比较只会比较结构相同和有设PK的table,所以在做资料比对之前务必先确定table的状态,避免没被比较到

後记

经过这次的事件,让我体会到备份的重要性,也希望这篇文章能帮助到遇到一样问题的人


<<:  JS 标签样板字面值 DAY76

>>:  菜鸡SCSS初体验

GitHub Action YAML - 语意解析与指令说明

GitHub Action 的 workflow 是以 YAML 档案进行设定 (副档名为 .yml...

LeetCode解题 Day15

978. Longest Turbulent Subarray https://leetcode.c...

资安认知-社交工程

到职的第一个月,接到了一个小小的任务 顾问们将要到客户端做资安认知教育训练 而客户在确认课程简报的过...

[Day15]汇总函数(分组函数)

汇总函数是以多笔资料列为基础,输入的资料列经过函数运算後,一组只会输出一个值,基本特性如下: 可将一...

Day 7-单元测试 NUnit 更多常用的特性-2 (基础-6)

如何撰写测试验证例外 — ExpectedExcetption 与 Assert.Throws(de...