上次我們提到的第一類后悔藥就是日常的備份了.可以通過定時(shí)執(zhí)行任務(wù)來降低工作的復(fù)雜度.但是仍然會在恢復(fù)的時(shí)候耗費(fèi)較多時(shí)間.
而對于平時(shí)的一些小的數(shù)據(jù)更新,比如在一個(gè)上百GB大小的庫中操作一條數(shù)據(jù),如果僅需要恢復(fù)這一條數(shù)據(jù)就要恢復(fù)整個(gè)表,那么花費(fèi)的代價(jià)就太大了.
那么有什么辦法能夠解決呢?
那就是本次要給大家介紹的第二類后悔藥-->快照
對于快照,可以認(rèn)為就類似于一張數(shù)據(jù)庫在指定時(shí)間點(diǎn)的一個(gè)相片,里面包含了數(shù)據(jù)庫在指定的那個(gè)時(shí)刻的所有信息和狀態(tài),后續(xù)的任何操作不影響快照中的信息狀態(tài).
下面我們上藥方:
USE [master]
GO
DECLARE @DBName NVARCHAR(50);
DECLARE @TodayDate NVARCHAR(10);
DECLARE @filePath NVARCHAR(200);
DECLARE @SQL NVARCHAR(800);
SET @DBName = 'DataBaseName' ----在此修改需要建快照的庫名即可
SET @TodayDate = REPLACE(CONVERT(NVARCHAR(10),GETDATE(),120),'-',''); --獲取當(dāng)前日期拼入快照名稱中
SELECT @filePath = REPLACE(filename,'templog.ldf','') FROM [tempdb].sys.[sysfiles] WHERE [groupid] = 0 --獲取tempdb的日志文件所在路徑作為快照文件存放路徑
SET @SQL = N'CREATE DATABASE ' + @DBName + '_' + @TodayDate + ' ON ( NAME = ' + @DBName + ', FILENAME = ''' + @filePath + @DBName + '_' + @TodayDate + '.ss'') AS SNAPSHOT OF ' + @DBName + ';'
--PRINT @SQL;
EXEC(@SQL);
GO
通過上面的SQL,修改對應(yīng)的庫名就可以在tempdb存放的目錄下生成對應(yīng)的快照文件,并且在數(shù)據(jù)庫中也能看到指定的快照庫名DataBaseName_20yymmdd
,可以把這個(gè)快照當(dāng)做一個(gè)數(shù)據(jù)庫進(jìn)行SQL語句的訪問操作,但是快照是只讀的,無法進(jìn)行數(shù)據(jù)的更新和結(jié)構(gòu)的變更,包括賬號權(quán)限也無法進(jìn)行調(diào)整.
如果需要恢復(fù)某一條數(shù)據(jù),那就可以直接讀出快照中的數(shù)據(jù),然后替換現(xiàn)有表中的對應(yīng)數(shù)據(jù)(刪除,標(biāo)識插入).
如果需要恢復(fù)整個(gè)庫,那就通過下面的SQL來進(jìn)行:
特別注意:這個(gè)恢復(fù)操作將丟失所有快照新建后對目標(biāo)數(shù)據(jù)庫的所有操作信息,請確認(rèn)你自己清楚的知道到底會發(fā)生什么再進(jìn)行操作!!!!!!!
USE master
GO
RESTORE DATABASE DataBaseName FROM DATABASE_SNAPSHOT = 'DataBaseName_20yymmdd';
GO
最后提醒:快照在新建的時(shí)候,快照文件的大小會和數(shù)據(jù)文件一樣大,但是由于是系數(shù)文具,實(shí)際占用的空間很小,當(dāng)數(shù)據(jù)庫繼續(xù)被使用的時(shí)候,快照文件會隨著數(shù)據(jù)量的差異而越來越大,因此定期清理不需要再使用的快照文件是很有必要的.
感謝各位認(rèn)真學(xué)習(xí),兩類藥劑已經(jīng)教給大家了,什么樣的場景下使用什么樣的方案就需要各位在實(shí)際的操作過程中根據(jù)情況來判斷了.
祝大家永遠(yuǎn)用不上后悔藥!~~