丢失日志文件的风险与对策

实验背景:

  在备份与恢复数据库时,偶尔使用分离/附加的方法。如果在附加时丢失了或者删除了日志文件(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文件。

204641971.png


5. 附加数据库时报错

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

204052979.png


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A和G cup的差距究竟有多大?| 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅太阳其实一直在狂奔太阳带着地球等行星以250km/s的速度在绕着银河系公转每转一圈需要2.5亿年图源见水印A罩杯和G罩杯的差距有多大錶情包运动鞋后面的这个东西原来是用来晒鞋子的抖音然一往一捆蛏子上撒盐会发生什么?残酷的…

Javascript函数调用的四种模式

Javascript一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式以及apply调用模式。调用模式不同,对应的隐藏参数this值也会不同。 函数作为对象的属性时,称为方法。此时函数(即方法)中的this对应是该对象…

我背着女朋友,用 Python 偷偷抓取了她的行踪

全世界只有3.14 %的人关注了青少年数学之旅1目 标 场 景有时候女朋友一个人在外面玩耍,问她在哪个地方,就是不告诉我。但是,你又很想知道女朋友的「位置」,这该如何是好?其实你可以这样套路女朋友,假装自己…

ASP.NET Core 中的规约模式(Specification Pattern )——增强泛型仓储模式

原文链接:https://codewithmukesh.com/blog/specification-pattern-in-aspnet-core/在本文中,我们将讨论在 ASP.NET Core 应用程序中实现规约模式以及它如何增强现有的泛型仓储模式。我们将从头开始构建具有泛型仓储模式、Entity Framework Core的 ASP.N…

动画演示男性结扎手术 | 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅流鼻涕了怎么办?医学教育徐琦招聘程序员啦知识萌死大丧失;图熊本科技把下列句子补充完整图三好学生李宇幼年的大象喝水并不会使用鼻子而是趴在水里直接用嘴大喝一顿它们9个月之后才会懂得用鼻子喝水科普斯基请…

AspNetCoreMassTransit Courier实现分布式事务

在之前的一篇博文中,CAP框架可以方便我们实现非实时、异步场景下的最终一致性,而有些用例总是无法避免的需要在实时、同步场景下进行,可以借助Saga事务来解决这一困扰。在一些博文和仓库中也搜寻到了.Net下实现Saga模式的解决方案MassTransit…

设置列表字段为主键

转贴:Sample event handler to set a field as a pr imary key (enforce no duplicates) Got this as a request from a reader- how to prevent users from adding items with same titles as ones that already exist in the list. Codeusing System;using System.Collectio…

被学校辞退、拒绝FB后:语音识别大牛Povey确认兼职北京初创公司,称主业还选中国...

全世界只有3.14 % 的人关注了青少年数学之旅由于5月的学生抗议事件,语音识别领域著名学者、原约翰霍普金斯大学教授Daniel Povey被学校辞退。随后,Daniel Povey准备进入Facebook从事语音识别系统的开发,但是由于Facebook要对其进行长达6周的审…

dotnet中的counters说明(二)

上篇说了System.Runtime,它负责应用运行的环境资源的收集,这篇要继续说AspNetCore的Hosting,Http.Connections和Server.Kestrel三个计数器。同时,下面指标各项()里的项目是--counters 参数[]里的项,用逗号分隔多项指标。Microsoft…

有这些好习惯,可以让你悄悄变优秀

全世界只有3.14 %的人关注了青少年数学之旅这是一个普遍无趣的时代,很多人看似忙到起飞内在却空虚迷茫。今天我们为你诚意推荐几个公众号它们会成为你生活的一剂调味料,让你做一个学识丰富、灵魂有趣的人。快来关注,开启精彩的生活吧&#xf…

java设置access-allow_Java Web如何设置多个Access-Control-Allow-Origin

有没有办法让Access-Control-Allow-Origin header允许设置multiple cross-domains呢?如果设置response.addHeader("Access-Control-Allow-Origin","*");感觉这个接口太开放了,不太安全。 我想只设置自己指定的若干个域名或者端口可以…

微软 MS Learn 上线 Blazor 入门教程

微软官方学习网站 MS Learn 上线了 Blazor 入门教程模块,希望通过这个课程,让开发人员了解如何设置开发环境,以及如何使用 Blazor、Visual Studio Code 和 C# 生成你的首个 Web 应用。Build a web app with Blazor - Learndocs.microsoft.com…

Type Casting

Type Casting C : Documents : C Language Tutorial : Type Casting Search: userpass[register] javascript and cookies required C Language TutorialIntroduction?Instructions for useBasics of C?Structure of a program?Variables. Data Types.?Constants?Oper…

世界最牛实验室,堪称诺贝尔奖孵化器!到底是个怎样神奇的存在?!

▲ 点击查看随着诺贝尔各个奖项陆陆续续的公布,卡文迪许实验室,又开始重回大众视野。在这个世界最牛实验室之一的实验室里,仅仅过去了一百多年,就不断涌现出一批又一批世界一流的科学家:把电与磁进行有机统一的麦克斯…

开源的负载测试/压力测试工具 NBomber

负载测试和压力测试对于确保 web 应用的性能和可缩放性非常重要。尽管它们的某些测试是相同的,但目标不同。负载测试:测试应用是否可以在特定情况下处理指定的用户负载,同时仍满足响应目标。应用在正常状态下运行。压力测试:在极端…

男人都应该懂的一张图。。 | 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅美国人为了教民众如何辨别韩国人制作的韩国女性标准照左右军事成为一个有钱人的概率有多高?最新版男人都该懂的汽车品牌从属关系图twi:NOCO_1002肥胖和骨架没有必然联系800斤胖子的X射线照 科普君XueShu 雪树来猜一猜这是…

学做菜咯

以前在QQ空间发的贴,现在转到这边来,嘿嘿。青蛙达 - 07月28日- 14时28分今天中午做我个人最喜欢的菜之一《咖喱鸡饭》 早上到超市买了: 大蒜头、洋葱、南瓜、鸡翅膀、咖喱粉、胡椒粉、白糖、桂皮 回来发现原来把辣椒粉当成胡椒粉买回来了....…

Facebook 中国程序员之死

全世界只有3.14 % 的人关注了青少年数学之旅9 月 19 日,一位 Facebook 软件工程师从加州门洛帕克(Menlo Park)总部四楼纵身跳下,结束年轻的生命。Facebook 新闻发言人证实确有其事,并说公司将会联系员工家人。门洛帕克…

[导入]数据库物理模型设计的其他模式之继承模式

连载之7原创:胖子刘(转载请注明作者和出处,谢谢)数据库物理模型设计的其他模式除了上面提到的四种主要设计模式,还有一些其他模式,在某些项目中可能会用到,在这里先简单做个说明,暂不…

“我数学太烂,但高考136分!”刷完上万道题后,我找到2个月多考58分的捷径…...

全世界只有3.14 %的人关注了青少年数学之旅01难上天的高考试卷,我逆袭考到136分!我叫刘辉,来自湖北省的某个县城,今年我数学考到了136分的好成绩,成功被一所985高校录取。↓我的高考成绩↓但回想一年之前,我…