MDF损坏或LDF损坏

MDF丢失或LDF丢失

注意,这些情况必须要相同版本的sql server才能操作成功

【1】当MDF损坏时

1.备份结尾日志

  http://www.cnblogs.com/gered/p/8964424.html

【2】当LDF损坏时

(参考:http://www.cnblogs.com/CareySon/archive/2013/06/16/3138742.html)

  (1)重做日志文件

  

--设置库为紧急状态
alter database [11test] set emergency --设置为单用户模式
alter database [11test] set single_user use master; GO
alter database [11test] set Emergency;
GO
exec sp_dboption [11test], single, true
GO
--重建数据库日志文件
alter database [11test] Rebuild Log on (name=FightWarPkDb,filename='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\11test_log.LDF')
GO
alter database [11test] set multi_user

【2.1】.数据库正常关闭,日志损坏

(推荐方法1)

(1)重建日志

当数据库正常关闭时,日志损坏就不是那么重要了,因为此时数据库中所有提交的事务对应的脏数据都已经CheckPoint到物理磁盘,因此不存在数据不一致的问题。因此,如果MDF和NDF文件完好,直接指定 FOR ATTACH_REBUILD_LOG参数后附加即可,如图所示。

  

但值得注意的是,使用该方式附加数据库会自动重建日志文件,日志文件大小为0.5MB,也就是2个VLF,自动增长为10%,因此您需要手动再来设置一下日志的大小,避免出现太多VLF的情况。

  

--如果数据库不存在了,只有MDF

    create database CQXX5000 on (
filename = 'D:\CQXX5000_Data.MDF')
for attach_rebuild_log --如果数据库存在(这个没有经过实践) alter database DataSource_Data set emergency
go
--置数据库为单用户模式
alter database DataSource_Data set single_user with rollback immediate
go
use master
go
--重建数据库日志文件
alter database DataSource_Data Rebuild Log on
(name=DataSource_Data_log,filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DataSource_Data.LDF')
go
--最后设置数据库为多用户模式。
alter database DataSource_Data set multi_user

【2.2】替换法

  【】新建一个同名数据库

  【】下线(或关掉引擎服务),然后删掉新建同名数据库的MDF,把出问题的数据库MDF文件替换

  【】上线/重启引擎服务

【3】数据库非正常关闭,导致脏数据丢失

(推荐使用方法2)

 方案 1:重建日志

  

只有一个mdf文件如何修复
1.首先新建一个同名数据库,注意数据库的版本一定要一直,2005的库文件在2008下无论如何也修不好
2.停止sql服务,拷贝mdf文件到新建数据库的目录替换原本的mdf文件,并且删掉ldf文件
3.启动sql服务,执行如下操作 alter database DataSource_Data set emergency
go
--置数据库为单用户模式
alter database DataSource_Data set single_user with rollback immediate
go
use master
go
--重建数据库日志文件
alter database DataSource_Data Rebuild Log on
(name=DataSource_Data_log,filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DataSource_Data.LDF')
go
--最后设置数据库为多用户模式。
alter database DataSource_Data set multi_user

 方案2:替换法


只有一个mdf文件如何修复
1.首先新建一个同名数据库,注意数据库的版本一定要一直,2005的库文件在2008下无论如何也修不好
2.停止sql服务,拷贝mdf文件到新建数据库的目录替换原本的mdf文件
3.启动sql服务,执行如下操作

create database CQXX5000 on (
name = 'CQXX5000_data' ,filename = 'D:\CQXX5000_Data.MDF'
)
LOG ON ( NAME = N'CQXX5000_log', FILENAME = N'D:\CQXX5000_log.lDF' , SIZE = 1024KB , FILEGROWTH = 10%) alter database CQXX5000 set emergency
alter database cqxx5000 set single_user with rollback immediate
dbcc checkdb('cqxx5000',REPAIR_ALLOW_DATA_LOSS) alter database CQXX5000 set multi_user
ALTER DATABASE CQXX5000 SET online

  

一下部分转自: http://blog.51cto.com/jimshu/1341289

 在备份与恢复数据库时,偶尔使用分离/附加的方法。如果在附加时丢失了或者删除了日志文件(LDF),可能会有哪些风险呢?下面通过实验来验证。

【4】实践参考

一、搭建环境

1. 创建数据库

CREATE DATABASE [db01] ON  PRIMARY

( NAME = N'db01', FILENAME = N'C:\SQLDATA\db01.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )

LOG ON

( NAME = N'db01_log', FILENAME = N'C:\SQLDATA\db01_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)

2. 创建表

USE db01

CREATE TABLE [dbo].[Table01](

[IntID] [int] NULL,

[CharFill] [varchar](50) NULL  )

二、使用nowait选项停止SQL Server实例(服务)造成数据丢失?

1. 添加2条记录

USE db01

insert Table01 values(1,'abcd')

CHECKPOINT

insert Table01 values(2,'hijk')

select * from Table01

  查询添加的结果,确认上述2条记录已经添加到数据库。区别是:第1条记录后面有一个检查点,此时这条记录已经被回写到MDF文件,而第2条记录还在data cache pool,等待下一个检查点才会写入MDF文件。

2. 使用nowait选项停止SQL Server实例(服务)

SHUTDOWN WITH NOWAIT

3. 转移文件后启动SQL Server服务

  删除LDF文件,再将MDF文件(这个文件我们称之为A文件”)移动到另一个文件夹

  再启动SQL Server服务,然后删除db01数据库。

4. 附加时删除LDF的链接信息

  附加时,由于找不到LDF文件,会显示“找不到”的信息。删除它,让系统重新创建一个LDF文件。

5. 附加数据库时报错

  继续附加数据库,出现报错信息。

6. 修复数据库

(1) 新建db01数据库

CREATE DATABASE [db01] ON  PRIMARY

( NAME = N'db01', FILENAME = N'C:\SQLDATA\db01.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )

LOG ON

( NAME = N'db01_log', FILENAME = N'C:\SQLDATA\db01_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)

(2) 替换MDF文件

  停止SQL Server服务,把上一步新建的MDF文件删除。再把最初的MDF文件(即前面所称的“A文件”)转移回来。(即用“A文件”替换上一步新建的MDF文件)。

(3)重启SQL Server服务

  重启之后,db01数据库为“可疑”状态,如果直接访问这个数据库则会报错“无法访问数据库db01。”

  执行以下命令,修复数据库。

alter database db01 set emergency

alter database db01 set single_user

dbcc checkdb('db01',REPAIR_ALLOW_DATA_LOSS)

dbcc checkdb('db01',REPAIR_REBUILD)

alter database db01 set multi_user

(4)检查数据

use db01

select * from Table01

  执行上述检查,发现只有第1条记录,丢失了第2条记录。假设这是一家银行的取款操作数据库,由于数据库shutdown with nowait并且LDF文件损坏,你的提款记录就不见了。多爽啊!

结论:

  SQL Server为了加快关机的速度,允许使用NOWAIT选项。此选项将跳过检查点操作,导致部分数据未回写到MDF文件(仅记录在LDF中)。在这种情况下,如果丢失了LDF文件,尽管可以修复数据库,却会有数据丢失。

三、未提交的事务导致不能回滚?

1. 创建事务

  使用上一步的数据库,添加一个事务。

BEGIN TRAN T1

insert Table01 values(3,'lmn')

2. 停止SQL Server

  使用“SQL Server配置管理器”停止SQL Server。

3. 转移MDF文件

  参考前面的实验,把MDF文件转转移到另一个文件夹,并删除LDF文件。

4. 修复数据库

  参考前面的实验,修复数据库

5. 检查数据

  参考前面的实验,查看修复后的数据。你将发现第3条记录已经提交(尽管它属于一个未提交的事务)!假如这是一家银行的存款操作数据库,重启数据库以后发现LDF坏了,即使你的存款操作最后撤销了,可是数据库里显示你的存款操作已经提交(存款成功)。多爽啊!

结论:

  本实验是正常shutdown,所以第3条记录遇到检查点操作而被回写到磁盘的MDF文件,然后事务日志中记录了这条insert操作需要回滚(因为这个事务未提交)。由于LDF文件已丢失,导致数据库启动时不能回滚所有未提交的事务。

四、结论

  丢失了数据库的事务日志文件,最多只能恢复到最后一个检查点。但是:

1. 在最后一个检查点之后,data cache pool中修改过的数据,将全部丢失。

2. 事务日志中未提交的事务,将无法撤销。

参考文档

  

DBCC修复不同情况下的损坏

MDF损坏或LDF文件损坏的更多相关文章

  1. MDF文件损坏,如何恢复?(未解决)

    MDF文件损坏,如何恢复?MDF附加失败,数据库附加失败 1.附加时 2.用替换法设置后重建日志 (其实已经删掉日志了,确保操作之前没有日志,但是运行 alter database [test] Re ...

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

    记录SQL Server2008日志文件损坏的恢复过程: 环境: 系 统:Windows Server2003 数据库:SQL Server2008 故障原因: 通过mstsc链接同一服务器时,用户界 ...

  3. 由于OCR文件损坏造成Oracle RAC不能启动的现象和处理方法

    v$cluster_interconnects 集群节点间通信使用的IP地址 错误信息 使用了公网进行连接 SQL> select * from v$cluster_interconnects; ...

  4. haoop 断电后导致block文件损坏

    hbase将dfs作为存储,公司测试环境断电后,hadoop集群会因此而损坏一些block文件,这个时候,客户端在读取文件时会报一些错: DataXceiver error processing RE ...

  5. 通过mdf ldf文件还原数据库

    新建查询,执行如下语句: EXEC sp_attach_db @dbname = 'xxx', /*数据库名称*/ @filename1 = 'D:\数据库备份\预发布\201611241045 测试 ...

  6. 如何转移数据库MDF和LDF文件

    我们可以很轻易地使用SQL Server来创建一个数据库,创建的数据库实例将存储在指定的默认位置(不一定是C盘,可以手动变更默认存储位置).假设此时数据库实例创建在了C盘中的默认位置,亦即是与数据库安 ...

  7. mdf与ldf文件如何还原到SQLserver数据库

    现在又如下两个文件 需要用这两个文件还原数据库 那么该怎么去还原呢? 首先在D盘目录下建立一个文件夹test,然后将上图中的文件粘贴到该文件夹中. 接着在数据库中执行如下代码: EXEC sp_att ...

  8. sqlserver mdf ldf文件导入

    EXEC  sp_attach_db  @dbname  =  '你的数据库名', @filename1  =  'mdf文件路径(包缀名)', @filename2  =  'Ldf文件路径(包缀名 ...

  9. sql server 2008如何导入mdf,ldf文件

    sql server 2008怎样导入mdf,ldf文件   网上找了非常多解决sql server导入其它电脑拷过来的mdf文件,多数是不全.遇到的解决方法不一样等问题,下边是找到的解决这个问题的最 ...

随机推荐

  1. linux 实时显示文件的内容

    1. watch -n 1 aa.txt  #每个1秒显示aa.txt的内容 2. tail -f ***.log Linux shell中有一个tail命令,常用来显示一个文件的最后n行文档内容 但 ...

  2. C# 操作超时正常还是错

    net(客户端)调用IIS(服务端)出现503后,就报操作超时错误 问题描述:服务端环境:IIS 客户端环境:windowsxp + iis + .net 调用时出现如下错误:System.Net.W ...

  3. C++语言基础(19)-模板的显式具体化

    应用背景: 例如有下面的函数模板,它用来获取两个变量中较大的一个: template<class T> const T& Max(const T& a, const T&a ...

  4. 运行cotroller后,查看vuser日志为空

    查看C:\Users\***\AppData\Local\Temp\res\log下,文件夹空,处理如下 run-time-setting中,选中always send message

  5. oracle如何将数据导入到另一个表空间

    某个用户的数据在USER表空间里,如果多个用户的数据都在USERS表空间内,将严重影响系统性能,一般在系统迁移的时候,在新的系统里希望导入 一个独立的用户表空间,但是经常无法导入用户指定的缺省表空间, ...

  6. IOS设计模式浅析之桥接模式(Bridge)

    引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...

  7. UIImagePickerController关于图片裁剪

    - (UIImage*)scaleImage:(UIImage*)anImage withEditingInfo:(NSDictionary*)editInfo{ UIImage *newImage; ...

  8. 第一百八十二节,jQuery-UI,知问前端--日历 UI

    jQuery-UI,知问前端--日历 UI 学习要点: 1.调用 datepicker()方法 2.修改 datepicker()样式 3.datepicker()方法的属性 4.datepicker ...

  9. Struts2 是什么?

    Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架. Struts2不只是Struts1下一个版本,它是一个完全重写的Struts架构. WebWork框架开始以Struts框架为基础 ...

  10. jQuery 库 - 特性

    jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 CSS 操作 HTML 事件函数 JavaScript 特效和动画 HTM ...