实验背景:

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

一、搭建环境

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. 事务日志中未提交的事务,将无法撤销。

丢失日志文件的风险与对策相关推荐

  1. SQL Server 2005 在只有MDF文件的情况下恢复(丢失日志文件)

    在sql server 2005 数据库中,一次误操作,分离数据库后,直接将日志文件删除掉了,后进行附加出错,无法附加上去,经过如下解决方案,数据库附加成功,操作如下:  第一步:先建立一个同名数据库 ...

  2. SQL2008R2 收缩数据库问题 - 日志文件不变小

    (转自此处:https://www.cnblogs.com/strayromeo/p/6961758.html,谢谢) 数据库的日志文件(*.ldf)越来越大,怎么办? 收缩吧.收缩日志文件的操作真不 ...

  3. ORACLE联机日志文件丢失或损坏的处理方法(转)

    经验总结: 联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题. 损坏非当前联机日志: 1.启动数据库,遇到ORA-00312 or OR ...

  4. mysql 归档日志恢复_Oracle丢失归档日志文件的数据库恢复方法

    使用案例描述:ORDTAB表空间的一个数据文件ordtab03.dbf毁坏,其包含很多ORDERS表的分区,数据文件热备于July 4, 2004,July 4 丢失归档日志文件的数据库恢复方法,从一 ...

  5. Sqlserver系统数据库和用户数据库日志文件全部丢失的恢复

    系统数据库和用户数据库日志都丢失的情况下,数据库无法启动,需要先重建系统数据库日志文件以便把sqlserver service拉起来,再重建用户数据库 试过但是行不通的办法 1.-mClient单用户 ...

  6. 在线日志文件丢失的恢复(笔记)

    在线日志文件丢失有二种情况,一是丢失非当前日志,这时可以通过 SQL>alter database clear logfile group 3;[已归档] 或 SQL>alter data ...

  7. oracle 日志丢失,Oracle联机日志文件丢失解决方法一例

    由于丢失的当前的联机日志文件,所以可能会丢失部分数据,破坏数据库的完整性,而且普通的重建日志文件的方式是不可行的,这个时候我们需要借助隐含参数_ALLOW_READ_ONLY_CORRUPTION或者 ...

  8. 如何处理日志文件丢失

    select group#,members from v$log; 查看日志文件的状态 select group#,status from v$log; 有状态来决定执行步骤 status:activ ...

  9. mysql 日志丢失_失而复得数据库日志文件丢失后的恢复

    前几天听英语用到虚拟光驱装resseta stone ,没想到各种不顺,把我的本本给整瘫痪了.后来重整旗鼓,装了云端,总算是把它搞定了,由于瘫痪来的很突然,所以我的一些数据不小心丢了一些.我新建的数据 ...

最新文章

  1. python查询缺失值所在位置使用scipy_python – 使用缺失值计算scipy中的成对距离
  2. 爬虫之selenium控制浏览器执行js代码
  3. Spring-基于注解的配置[02自动装载bean]
  4. jQuery编写插件
  5. 你留言,我送书!20本《玩转Python轻松过二级》等你拿!
  6. MPMoviePlayerViewController 改良版播放器
  7. Java课堂作业-------参数求和
  8. ModelSim仿真实例教程
  9. 通俗易懂物联网(11):物联网解决方案设计
  10. 后缀为.vep文件转换成.mp4文件
  11. [原]终于有新机器用了Intel E6500K+4G+23.6’液晶
  12. character在mysql什么类型_character是什么字段类型
  13. 解读机械图样——剖视图
  14. 《Python数据分析与挖掘实战》第7章-聚类+绘制雷达图
  15. [服务计算] 简单 web 服务与客户端开发实战
  16. AS3字符串正则表达式
  17. [wayfarer]PetShop数据访问层之消息处理
  18. 前端HTML5视频_Less-张晓飞-专题视频课程
  19. windows下快速安装nginx 并配置 开机自启动
  20. 基于OpenCV的人脸识别考勤系统(一)

热门文章

  1. elasticsearch 5.1 问题 ubuntu
  2. 采用Atlas+Keepalived实现MySQL读写分离、读负载均衡【转载】
  3. 检测python进程是否存活
  4. 19.Silverlight调用webservice上传多个文件
  5. 也谈子网划分和子网通信
  6. linux下telnet失败怎么处理,CentOS下telnet退出失败的解决办法
  7. 升级tomcat7.0之后的问题
  8. .net core MongoDB 初试
  9. [bzoj1050 HAOI2006] 旅行comf (kruskal)
  10. angularjs中使用swiper时不起作用,最后出现空白位