记录SQL Server2008日志文件损坏的恢复过程:

环境:

 系   统:Windows Server2003

 数据库:SQL Server2008

故障原因:

通过mstsc链接同一服务器时,用户界面不一致。决定重启服务器,未正确关闭应用程序的情况下(程序在访问数据库),导致数据库日志文件损坏,自然也就无法访问mdf文件!(都是微软自家的产品,重启服务器为什么不能检查数据库的状态,将数据库设置在安全状态后在重启呢??(有一种解释是:SQL Server为了加快关机的速度,允许使用NOWAIT选项。此选项将跳过检查点操作,导致部分数据未回写到MDF文件(仅记录在LDF中)。在这种情况下,如果丢失了LDF文件,尽管可以修复数据库,却会有数据丢失)所以,要养成良好的习惯。关闭现有数据库链接,再重启服务器)

故障表现:无法访问数据文件,就像下面JD_2数据库一样。

解决方案:

1:将数据库JD_2删除、或者分离(这里可能会提示无法删除或分离数据库,可以重启对应的数据库实例后再次尝试)

2:新建数据库,日志文件和数据文件名称和要恢复对应文件一样命名。

3:将新建的数据库设置为脱机模式,找到新建数据库的物理路径,将要恢复的mdf文件拷贝覆盖现有的mdf文件。

4:设置数据库为联机模式,刷新数据库,可以看到并没有什么卵用。

5:执行alter database JD_2 set emergency  将数据库设置为紧急模式。

执行:
 use master 

 declare @databasename varchar(255) 

 set @databasename='JD_2' 

 ALTER DATABASE JD_2 SET SINGLE_USER   //将目标数据库置为单用户状态 

 dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS) 

 dbcc checkdb(@databasename,REPAIR_REBUILD) 

 ALTER DATABASE JD_2 SET MULTI_USER //将目标数据库置为多用户状态 
6:刷新后数据库处于紧急模式,数据基本恢复。当前数据局处于紧急模式,无法对数据库备份,无法增删改查,只能读取。所以我们要恢复紧急模式为正常模式

7:执行 select * from sys.master_files 查看数据库基本信息和状态信息

8:执行 select * from sysdatabases 查看所有数据库的信息如下:

   Status状态码含义:http://blog.csdn.net/nemo2011/article/details/9233777

执行:

方案1:
 sp_configure 'allow updates',1
reconfigure with override
update sysdatabases set status=0 where name='JD_New'
更改数据库状态码,提示不允许更改=>sql server2008不支持对系统表的修改

方案2:

对于正常未损坏的数据库可以使用
 ALTER DATABASE dbname SET EMERGENCY 

 ALTER DATABASE dbname SET ONLINE
在紧急模式和普通模式间切换。但是对于损坏过的数据,经验证此方法行不通。

参考了一些网上的办法,都没能解决问题!请朋友不吝赐教~~

如果只是关心数据库表中的基础数据,可以新建数据库,将待恢复的数据批量导入到新的数据库中执行以下语句(修改DatabaseFrom为损坏数据库名称、DatabaseTo为新数据库名称即可;2、10、11行)=>
 USE [DatabaseFrom]

 DECLARE @fromdb VARCHAR(100)
DECLARE @todb VARCHAR(100)
DECLARE @tablename VARCHAR(100)
DECLARE @columnnames NVARCHAR(max)
DECLARE @isidentity NVARCHAR(30)
DECLARE @temsql NVARCHAR(max)
DECLARE @sql NVARCHAR(max)
SET @fromdb = 'DatabaseFrom'
SET @todb = 'DatabaseTo' IF (OBJECT_ID('#MyTempTable') IS NOT NULL)
drop table #MyTempTable CREATE TABLE #MyTempTable (names varchar(500))
insert into #MyTempTable
SELECT name from sys.tables WHERE type='U' AND name not in (select OBJECT_NAME(parent_object_id) 'name' from sys.objects where type='F') insert into #MyTempTable
select OBJECT_NAME(parent_object_id) 'name' from sys.objects where type='F' order by object_id --游标
DECLARE @itemCur CURSOR
SET @itemCur = CURSOR FOR
SELECT names from #MyTempTable OPEN @itemCur
FETCH NEXT FROM @itemCur INTO @tablename
WHILE @@FETCH_STATUS=0 BEGIN SET @sql = '' --获取表字段
SET @temsql = N'
BEGIN
SET @columnnamesOUT =''''
SELECT @columnnamesOUT = @columnnamesOUT + '','' + ''['' + name + '']''
From sys.columns where object_id=OBJECT_ID(''['+@fromdb+'].dbo.'+@tablename+''')
order by column_id
SELECT @columnnamesOUT=substring(@columnnamesOUT,2,len(@columnnamesOUT))
END
'
EXEC sp_executesql @temsql,N'@columnnamesOUT NVARCHAR(max) OUTPUT',@columnnamesOUT=@columnnames OUTPUT PRINT ('--'+@tablename)
PRINT ('--表名 '''+@tablename+'''') --INSERT
SET @sql = @sql+'SELECT * INTO ['+@todb+'].[dbo].['+@tablename+'] FROM ['+@fromdb+'].[dbo].['+@tablename+']' --返回SQL
PRINT(@sql)PRINT('GO')+CHAR(13) FETCH NEXT FROM @itemCur INTO @tablename
END CLOSE @itemCur
DEALLOCATE @itemCur drop table #MyTempTable
然后拷贝消息栏的语句执行即可:
 (749 行受影响)

 (0 行受影响)
--sm_idx_River_2
--表名 'sm_idx_River_2'
SELECT * INTO [JD_2_Back].[dbo].[sm_idx_River_2] FROM [JD_2].[dbo].[sm_idx_River_2]
GO --TyphoonGustForm_1
--表名 'TyphoonGustForm_1'
SELECT * INTO [JD_2_Back].[dbo].[TyphoonGustForm_1] FROM [JD_2].[dbo].[TyphoonGustForm_1]
GO --Interpolation_3Tier3
--表名 'Interpolation_3Tier3'
SELECT * INTO [JD_2_Back].[dbo].[Interpolation_3Tier3] FROM [JD_2].[dbo].[Interpolation_3Tier3]
GO --YGZZPonding3_CJ
--表名 'YGZZPonding3_CJ'
SELECT * INTO [JD_2_Back].[dbo].[YGZZPonding3_CJ] FROM [JD_2].[dbo].[YGZZPonding3_CJ]
GO --ForestDistribut_2
--表名 'ForestDistribut_2'
SELECT * INTO [JD_2_Back].[dbo].[ForestDistribut_2] FROM [JD_2].[dbo].[ForestDistribut_2]
GO
可能会有错误,如下所示:我们就找出了 出错的数据表了!然后在手动修改特定的错误表吧......

最后就是删除损坏的数据库,更改新数据库名字即可。

无奈损坏的数据库为超图映射过来的数据库(推测,超图对数据库设置了一些除表外其他的一些附加信息),通过新建数据库,然后简单的导出数据,还是无法解决(通过超图桌面版和object.net版本 无法修改数据集 )。最后只能,找出去年备份的数据库,然后看下哪些数据集更新,从损坏的数据库中慢慢更新了。。。。。。

 

记录SQL Server2008日志文件损坏的恢复过程的更多相关文章

  1. 网站添加数据出错,原来是MS SQL Server2008日志文件占据空间过大导致的

    最近发现公司上线的八爪鱼招标网有部分功能出现问题,主要表现为无法向数据库插入数据:远程登陆到数据库服务器时,发现原本的40G空间都被数据库吃完了,于是打开MS SQL Server 2008对数据库进 ...

  2. oracle redo日志文件损坏恢复

    参考:How to Recover from Loss Of Online Redo Log And ORA-312 And ORA-313 (Doc ID 117481.1) 在线重做日志文件丢失后 ...

  3. 【恢复】Redo日志文件丢失的恢复

    第一章 Redo文件丢失的恢复 1.1  online redolog file 丢失 联机Redo日志是Oracle数据库中比较核心的文件,当Redo日志文件异常之后,数据库就无法正常启动,而且有丢 ...

  4. SQL Server日志文件庞大收缩方法(实测好用)

    原文:SQL Server日志文件庞大收缩方法(实测好用) 这两个命令连续执行,间隔时间越少越明显(可多次运行),直到达到效果 --截断 BACKUP LOG CloudMonitor TO DISK ...

  5. SQL Server日志文件过大 大日志文件清理方法 不分离数据库

    SQL Server日志文件过大    大日志文件清理方法 ,网上提供了很多分离数据库——〉删除日志文件-〉附加数据库 的方法,此方法风险太大,过程也比较久,有时候也会出现分离不成功的现象.下面的方式 ...

  6. Oracle备份恢复之断电导致控制文件和日志文件损坏修复

    Oracle数据库遭遇断电遭遇ora-00214.ora-00314.ora-00312错误恢复案例一枚 1.数据库在17日21:19启动开始报错ora-214错误: Tue Jan 17 21:19 ...

  7. 误删SQL Server日志文件后怎样附加数据库

    SQL Server日志文件因为误操作被删除,当附加数据库的时候提示:附加数据库失败. 解决办法如下: 1.新建一个同名数据库. 2.停止数据库服务,覆盖新建的数据库主文件(小技巧:最好放在同一个磁盘 ...

  8. 收缩SQL数据库日志文件

    收缩SQL数据库日志文件 介绍具体的操作方法前,先说下我操作的实际环境和当时的状况.我的服务器是windows server 2008 R2 64位英文版,数据库是SQL server 2008英文版 ...

  9. 简单记录一次REDO文件损坏报错 ORA-00333重做日志读取块出错

    一.故障描写叙述 首先是实例恢复须要用到的REDO文件损坏 二.解决方法 1.对于非当前REDO或者当前REDO可是无活动事务使用下面CLEAR命令: 用CLEAR命令重建该日志文件SQL>al ...

随机推荐

  1. U8采购订单联查采购入库单

    1.表头rdrecord01,字段ipurorderid(采购订单ID), cOrderCode(采购订单号)要与采购订单表头主键和单号对应 表体rdrecords01,字段cPOID(采购订单号), ...

  2. mvn-打jar运行包(含环境变量配置)

    前沿条件 maven下载:http://maven.apache.org/download.cgi 配置环境变量 MAVEN_HOME= D:\Softwares\apache-maven-3.2.2 ...

  3. 编译CM14.1(sudmod71.1)过程记录

    编译CM14.1内存要求很高,至少8G以上,我的6G也可以搞定,交换空间分配大一点. 1.安装平台 建议安装Deepin 15.3桌面版系统,系统UI好看. 2.配置环境 (1)安装编译依赖库 sud ...

  4. 定制sqlmap tamper脚本

    前言 渗透测试过程中遇到注入点常常丢到sqlmap中进行测试,假如网站有waf,sqlmap便无法直接注入了. 测试 在测试某个项目的过程中,一个页面的aid参数,习惯性的提交 and 1=1发现直接 ...

  5. Markdown编辑器测试

    Markdown 我是二级标题 public void add(int a,int b){ } 我是引用 我是分割线 - - - 1.x小项目1 2.项目2 无标题 无标题 家畜 ''' 代码块 '' ...

  6. [C#] NPOI Excel解析

    通过NPOI解析Excel,将数据保存到DataTable中. #region excel解析 public DataTable ImportExcelFile(string filePath) { ...

  7. SQL链接服务器

    最近做项目,需要对两个数据库进行同步操作,所以采用在Server SQL中建立链接服务器方式实现. 链接服务器,可以直接访问/操作其他服务器上的数据库表. 1.连接SQL Server链接服务器 EX ...

  8. SQL Server 2008 允许远程连接的配置

    如果无法通过IP地址远程连接你的SQL Server 2008服务器,可以参考下面的内容进行设置.在进行下述设置之前,应该确保你的网络已经安装设置完毕,服务器已经正常连接到网络中. 1.单击Windo ...

  9. SpringMVC前后端数据交互总结

    控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...

  10. ios官方菜单项目重点剖析附项目源码

    原版教程:https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift ...