SqlServer数据库恢复出错

问题描述
我们开发的程序在某单位已经运行了3、4年的时间。近日由于数据库服务器的硬盘出现问题,导致数据库无法使用。后来该单位的数据库管理员使用数据恢复软件将硬盘中的数据库文件恢复回来,然后将该文件重新附加到SqlServer中。结果数据库中的某些表始报验证不通过的错误。后来通过数据库软件的修复功能修复了大部分表的问题,只剩下一张表始终报验证不通过的错误。
由于该表中保存了程序中的关键内容,表如果不能访问,则应用程序也运转不正常。后来改数据库管理员将该表的索引删除(即表中没有任何主键),删除后再访问表中的内容就不会报错了。
然而,几天过后,应用程序的用户反映与该表相关的某些数据,保存之后再打开会发现数据变成了很多份一模一样的内容。例如原来的内容是AABB,保存之后再打开就变成了AABBAABB。
该问题反馈到我们程序开发方,让我们来找问题原因。
问题定位
首先检测是否是程序逻辑有问题。应用程序保存到该表中时,首先将历史数据清除,然后再将新的数据保存到表中。通过调试程序,发现保存到表中的数据为AABB,但从数据库中读出来时却变成了AABBAABB。
进一步分析程序逻辑以及数据库表中的数据发现,有问题的数据都有类似的特征,即表中的数据存在重复,也就是有多行数据的内容一模一样。出现该问题的原因可能是从出问题的硬盘中恢复数据库文件时恢复出的表数据中就已经存在重复数据。
因此现在的问题变成了如何清除数据库表中的重复数据,重复的数据仅保留一条,然后重新定义主键。
解决方法
通过与同事商量,找到了如下的解决方法,其中的SQL语句为同事所写。
假定该表名字为TestTable。之前的主键名称为TestID,Level1No,Level2No,Col。
问题解决步骤如下:
1)在TestTable表中建立一个类型为bigint的自增长列,列名为ID;
2)将ID列设置为主键;
3)执行下列SQL语句

BEGIN TRANSACTION

declare @TestID char(8),@Level1No smallint,@Level2No smallint,@Col smallint

declare @aaa Char(8)

declare cur_duplicatelines cursor for

select TestID,Level1No,Level2No,Col from TestTable

group by TestID,Level1No,Level2No,Col

having COUNT(*)>1


open cur_duplicatelines

fetch cur_duplicatelines into @TestID ,@Level1No ,@Level2No ,@Col

while @@FETCH_STATUS=0

declare @id bigint

select @id=Max(ID) from TestTable

where TestID=@TestID and

Level1No=@Level1No and

Level2No=@Level2No and

Col=@Col


delete TestTable

where TestID=@TestID and
Level1No=@Level1No and
Level2No=@Level2No and
Col=@Col and

ID<>@id

fetch cur_duplicatelines into @TestID ,@Level1No ,@Level2No ,@Col

end

close cur_duplicatelines

deallocate cur_duplicatelines

COMMIT

4)将ID列删除;
5)设置列TestID,Level1No,Level2No,Col 为主键;

至此问题解决。
如果想复现该问题,可以将某张表的主键清除,然后复制其中某几行的数据到表中。这样就可以复现该问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当SQL Server没有备份可用时,我们需要采取其他方法来尝试还原数据库。以下是一些可能的方法: 1. 使用第三方工具:不同的厂商提供了一些备份还原工具,这些工具可以帮助我们从数据库的日志文件中恢复数据。例如,利用Redgate SQL Log Rescue或ApexSQL Log工具可以从数据库的事务日志文件中读取并恢复删除的数据。 2. 手动恢复:通过分析事务日志文件,我们可以手动重建丢失的数据。这个过程可能相当复杂而且容易出错,因此需要有经验的数据库管理员来执行。 3. 使用事务日志备份:如果我们之前有设置事务日志备份,则可以使用这些备份来尝试恢复数据库。使用这些备份,我们可以重新播放事务日志中的事务,从而恢复数据。 4. 从最近的数据库副本还原:如果我们有一个最近的数据库副本,虽然不是最新的,但仍包含了大部分数据,我们可以使用该副本进行还原。然后,我们可以从事务日志备份或其他来源来重新应用丢失的事务。 无论采用哪种方法,我们应该尽快定位数据库无法备份的原因,并确保我们以后能够使用备份来恢复数据库。这包括检查备份计划,存储备份介质的可用性,确保备份任务正常运行,并监控备份过程以及备份文件的完整性。 ### 回答2: 当SQL Server没有备份可用时,可以尝试使用其他方法还原数据库。以下是一些可能的方法: 1. 使用事务日志 如果数据库启用了事务日志,但没有完整备份,可以尝试使用事务日志还原数据库。首先,将数据库设置为应急模式,然后使用恢复操作还原事务日志。 2. 使用第三方工具 有一些第三方工具可以帮助恢复无备份的数据库。这些工具通常能够分析数据库文件结构,并尝试还原损坏的数据库。 3. 从其他服务器复制数据库 如果在其他服务器上有相同或相似的数据库,可以尝试将该数据库复制到当前服务器。这可以通过备份和还原数据库、导出和导入数据等方式实现。 4. 修复数据库文件 如果数据库文件损坏或损坏,可以尝试使用SQL Server自带的工具修复文件。可以使用DBCC CHECKDB命令来检查和修复数据库文件错误。 5. 重建数据库 如果以上方法都无法使用,可能需要重建数据库。首先,创建一个新的数据库,并尝试从其他来源恢复数据,如文本文件、Excel文件等。 需要注意的是,这些方法仅适用于特定情况,并且并不保证完全恢复数据库。因此,在生产环境中,定期备份数据库是非常重要的,以确保数据的完整性和可恢复性。 ### 回答3: 若SQL Server没有备份文件可用来还原数据库,可能会遇到一些挑战,但不是完全没有解决办法。 首先,我们应该尝试找到任何可能的备份文件。可以检查操作系统上的备份文件存储位置,或者询问其他数据库管理员或开发人员是否有可用的备份文件。如果找到了备份文件,可以使用SQL Server的还原功能来将其还原为数据库。 如果没有找到备份文件,我们可能需要考虑其他解决方案。以下是一些可能的方法: 1. 使用第三方工具:有一些第三方工具可用来恢复SQL Server数据库,即使没有备份文件。这些工具可以通过扫描磁盘上的数据文件,尝试恢复数据库。但请注意,这些工具可能具有一定的风险,并且可能无法完全恢复数据库的所有内容。 2. 使用事务日志:如果数据库的事务日志文件仍然可用,可以尝试使用事务日志来还原数据库。可以使用SQL Server的事务日志还原功能,以及相关的事务日志备份文件(如果有)。在执行这种还原过程之前,建议先备份当前数据库文件,以防止数据丢失。 3. 重建数据库:如果没有备份文件,也无法使用事务日志来恢复数据库,那么我们可能需要考虑重新创建数据库。这将需要重新建立表结构,并将数据重新插入到数据库中。这是一个非常耗时和复杂的过程,需要确保有所有必要的表结构和数据。 无论采取哪种方法,还原数据库都应该谨慎操作,并在操作之前备份所有相关的数据文件,以防止意外情况。此外,备份和定期还原数据库数据库管理的最佳实践,以确保数据的安全性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值