日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 丢失日志文件的风险与对策 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗背景:

  在備份與恢復數據庫時,偶爾使用分離/附加的方法。如果在附加時丟失了或者刪除了日志文件(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. 事務日志中未提交的事務,將無法撤銷。


創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的丢失日志文件的风险与对策的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。