您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“sql server 2005數(shù)據(jù)庫(kù)怎么創(chuàng)建快照”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
使用create database命令來(lái)為數(shù)據(jù)庫(kù)創(chuàng)建快照,當(dāng)創(chuàng)建一個(gè)快照時(shí)必須在create database命令中包含源數(shù)據(jù)庫(kù)中的每一個(gè)數(shù)據(jù)文件。包括原來(lái)的邏輯名稱和一個(gè)新的物理名稱。不能夠指定其它的文件屬性,也沒有使用日志文件。
這是為Archive數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)快照的操作如下:
1.首先查看Archive數(shù)據(jù)庫(kù)中的數(shù)據(jù)文件的邏輯名稱
C:\Users\Administrator>sqlcmd -S WINS7-2014DITHH\JY 1> use Archive 2> GO 已將數(shù)據(jù)庫(kù)上下文更改為 'Archive'。 1> select name,physical_name from sys.database_files; 2> GO name physical_name ------------------------------------------------ ------------------------------------------------------------------------- Arch2 C:\Program Files\Microsoft SQLServer\MSSQL.1\MSSQL\Data\archdat1.mdf Archlog1 C:\Program Files\Microsoft SQLServer\MSSQL.1\MSSQL\Data\archlog1.ldf Arch3 C:\Program Files\Microsoft SQLServer\MSSQL.1\MSSQL\Data\archdat2.ndf (3 行受影響)
2.創(chuàng)建數(shù)據(jù)庫(kù)快照Archive_snapshot
1> create database Archive_snapshot on 2> ( 3> name='Arch2',--數(shù)據(jù)文件的邏輯名稱 4> filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Archive_snapshot_1.mdf' --快照文件 5> ), 6> ( 7> name='Arch3', 8> filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Archive_snapshot_2.mdf' 9> ) 10> as snapshot of Archive; 11> GO
下面在源數(shù)據(jù)庫(kù)中向表t1插入一行記錄
1.先查看表t1中的記錄
1>use Archive; 2>GO 已將數(shù)據(jù)庫(kù)上下文更改為 'Archive'。 1>select * from t1; 2>GO t_id t_date ----------- -------------------- 1 2019-04-25 (1 行受影響)
2.向表t1中插入一行記錄
1>insert into t1 values(2,'2019-04-26'); 2>GO; (1 行受影響)
3.再次查詢表t1中的記錄
1>select * from t1; 2>GO t_id t_date ----------- -------------------- 1 2019-04-25 2 2019-04-26 (2 行受影響)
在快照數(shù)據(jù)庫(kù)中查詢表t1的記錄
1>use Archive_snapshot; 2>GO 已將數(shù)據(jù)庫(kù)上下文更改為 'Archive_snapshot'。 1>select * from t1; 2>GO t_id t_date ----------- -------------------- 1 2019-04-25 (1 行受影響)
可以看到快照數(shù)據(jù)庫(kù)中的t1的記錄仍然只有一條,快照數(shù)據(jù)庫(kù)只包含快照創(chuàng)建時(shí)源數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)。
快照中的每一個(gè)文件都被創(chuàng)建為稀疏文件,這是NTFS文件系統(tǒng)的一個(gè)特性。開始時(shí),一個(gè)稀疏文件不包含用戶數(shù)據(jù),也沒有分配到用來(lái)存儲(chǔ)用戶數(shù)據(jù)的磁盤空間。當(dāng)數(shù)據(jù)被寫入稀疏文件時(shí),NTFS逐漸地為其分配磁盤空間。一個(gè)稀疏文件有可能增長(zhǎng)得很大。稀疏文件以64KB為單位增量增長(zhǎng),因此磁盤上的稀疏文件的大小總是64KB的倍數(shù)。
快照文件只包含源數(shù)據(jù)庫(kù)中發(fā)生了變化的數(shù)據(jù)。對(duì)每一個(gè)文件,SQL Server創(chuàng)建了一個(gè)保存在高速緩存中的比特圖,文件的每一個(gè)頁(yè)面對(duì)應(yīng)一個(gè)比特位,表示那個(gè)頁(yè)面是否已經(jīng)被復(fù)制到快照中。每次當(dāng)源數(shù)據(jù)庫(kù)中有一個(gè)頁(yè)面被更新時(shí),SQL Server會(huì)查看比特圖來(lái)檢查該頁(yè)面是否已經(jīng)被復(fù)制了,如果還沒有被復(fù)制,那么馬上將其復(fù)制到快照中。這種操作被稱為寫入時(shí)復(fù)制操作。
前面提到,比特圖保存在調(diào)整緩存里,而不是文件自身,所以它總是可供隨時(shí)使用。當(dāng)SQL Server關(guān)閉或數(shù)據(jù)庫(kù)關(guān)閉時(shí),比特圖會(huì)丟失并且需要在數(shù)據(jù)庫(kù)啟動(dòng)時(shí)進(jìn)行重建軍。當(dāng)SQL Server被訪問(wèn)時(shí)它會(huì)判斷讀每一個(gè)頁(yè)面是否存在稀疏文件中,然后將這些信息保存在比物圖中供將業(yè)使用。
快照反映了發(fā)出create database命令的時(shí)間點(diǎn)---也就是在創(chuàng)建操作開始的那一刻。SQL Server對(duì)源數(shù)據(jù)庫(kù)進(jìn)行檢查點(diǎn)操作并將一個(gè)同步日志序列號(hào)(Log Sequence Number,LSN)記錄在源數(shù)據(jù)庫(kù)的日志文件里。LSN是一種確定數(shù)據(jù)庫(kù)中某一特定時(shí)間點(diǎn)的方式。SQL Server然后在源數(shù)據(jù)庫(kù)上運(yùn)行恢復(fù),以便任何未提交事務(wù)能夠在快照中被回滾。所以雖然快照的稀疏文件開始時(shí)是空白的,但是那并不能維護(hù)很久。如果當(dāng)快照被創(chuàng)建時(shí)有事務(wù)正在進(jìn)行,恢復(fù)進(jìn)程將會(huì)在數(shù)據(jù)庫(kù)快照可用前撤消未提交的事務(wù),所以該快照將會(huì)包含修改后數(shù)據(jù)的源數(shù)據(jù)庫(kù)所有頁(yè)面的原始版本。
快照只能在NTFS格式的卷上創(chuàng)建,因?yàn)樵摳袷绞俏ㄒ恢С窒∈栉募夹g(shù)的文件格式。如果我們嘗試在FAT或FAT32卷上創(chuàng)建一個(gè)快照,那么會(huì)收到如下類似的錯(cuò)誤:
Msg 1823, Level 16, State 2, Line 1 A database snapshot cannot be created because it failed to start. Msg 5119, Level 16, State 1, Line 1 Cannot make the file "E:\AW_snapshot.MDF" a sparse file. Make sure the file system supports sparse files.
第一個(gè)錯(cuò)誤基本上是一個(gè)普通的錯(cuò)誤信息,第二個(gè)錯(cuò)誤信提供了關(guān)于該操作為什么失敗的更詳細(xì)信息。
可以通過(guò)查看動(dòng)態(tài)管理函數(shù)sys.dm_io_virtual_file_stats來(lái)發(fā)現(xiàn)數(shù)據(jù)庫(kù)快照的每個(gè)稀疏文件中正在使用的磁盤上的字節(jié)數(shù)據(jù)是多少,該函數(shù)通過(guò)size_on_disk_bytes列來(lái)返回一個(gè)文件中的當(dāng)前字節(jié)數(shù)據(jù)。該函數(shù)將database_id和file_id作為參數(shù)??煺諗?shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)id和每一個(gè)稀疏文件的文件ID被顯示在目錄視圖sys.master_files中。還可以通過(guò)Windows資源管理器來(lái)查看其大小。
1>select name,database_id from sys.databases; 2>GO name database_id ---------------------- ----------- master 1 tempdb 2 model 3 msdb 4 AdventureWorksDW 5 AdventureWorks 6 resource_COPY 7 Archive 8 Archive_snapshot 9 (9 行受影響) 1>select database_id,file_id,name,physical_name from sys.master_files; 2>GO database_id file_id name physical_name ----------- ----------- ------------------------- ----------------------------------------------------------------------------------------- 1 1 master C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\master.mdf 1 2 mastlog C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\mastlog.ldf 2 1 tempdev C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\tempdb.mdf 2 2 templog C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\templog.ldf 3 1 modeldev C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\model.mdf 3 2 modellog C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\modellog.ldf 4 1 MSDBData C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MSDBData.mdf 4 2 MSDBLog C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MSDBLog.ldf 5 1 AdventureWorksDW_Data C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorksDW_Data.mdf 5 2 AdventureWorksDW_Log C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorksDW_Log.ldf 6 1 AdventureWorks_Data C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf 6 2 AdventureWorks_Log C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Log.ldf 7 1 data C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\mssqlsystemresource_copy.mdf 7 2 log C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\mssqlsystemresource_copy.ldf 8 1 Arch2 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\archdat1.mdf 8 2 Archlog1 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\archlog1.ldf 8 3 Arch3 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\archdat2.ndf 9 1 Arch2 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Archive_snapshot_1.mdf 9 3 Arch3 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Archive_snapshot_2.mdf (19 行受影響) 1>select * from sys.dm_io_virtual_file_stats (9,NULL) AS vfs; 2>GO database_id file_id sample_ms num_of_reads num_of_bytes_read io_stall_read_ms num_of_writes num_of_bytes_written io_stall_write_ms io_stall size_on_disk_bytes file_handle ----------- ------- ----------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- ------------------ 9 1 1902593092 60 491520 133 5 40960 4 137 262144 0x000000000000080C 9 3 1902593092 4 32768 11 1 8192 0 11 65536 0x0000000000000840 (2 行受影響)
因?yàn)橥粋€(gè)數(shù)據(jù)庫(kù)有可能擁有多個(gè)快照,所以我們必須確保有足夠的可用磁盤空間。快照開始時(shí)會(huì)相對(duì)較小,當(dāng)隨著源數(shù)據(jù)庫(kù)的更新,每個(gè)快照都會(huì)增長(zhǎng)。稀疏文件的空間按照稱為區(qū)域的片斷進(jìn)行分配,單位為64KB。當(dāng)一個(gè)區(qū)域被分配時(shí),除了已經(jīng)更改過(guò)的一個(gè)頁(yè)面,所有的頁(yè)面都會(huì)被清零。這時(shí)該區(qū)域中還供7個(gè)更改過(guò)的頁(yè)面使用的空間,并且在這7個(gè)頁(yè)面空間被使用完之前,不會(huì)分配新的區(qū)域。
有可能會(huì)過(guò)度申請(qǐng)存儲(chǔ)空間。這意味著在通常情況下,我們能夠擁有的是實(shí)際物理存儲(chǔ)空間很多倍的多個(gè)快照,但一旦快照增長(zhǎng),物理卷就會(huì)被耗盡(當(dāng)運(yùn)行在線dbcc checkdb命令或相關(guān)命令時(shí)有可能會(huì)發(fā)生這種情況,因?yàn)槲覀儫o(wú)法控制這些命令所使用的內(nèi)部快照存放的物理位置---它會(huì)被存放在父數(shù)據(jù)庫(kù)文件所在的同一個(gè)鄭上。dbcc在這種情況下檢查將會(huì)失敗)。一旦物理卷空間耗盡,對(duì)源數(shù)據(jù)庫(kù)的寫操作就無(wú)法將寫之前的頁(yè)面圖像復(fù)制到稀疏文件。無(wú)法寫入頁(yè)面的快照會(huì)被記為置疑(suspect)并且無(wú)法使用,但是源數(shù)據(jù)庫(kù)仍然可以繼續(xù)運(yùn)行。不可能修復(fù)一個(gè)被置疑的快照,必須將這種快照數(shù)據(jù)庫(kù)刪除。
管理快照
如果一個(gè)源數(shù)據(jù)庫(kù)中存在快照,那么就無(wú)法刪除,分離或還原該源數(shù)據(jù)庫(kù)。如果把握一個(gè)數(shù)據(jù)庫(kù)切換到離線(offline)狀態(tài),那么快照將會(huì)被自動(dòng)刪除。另外,我們基本上可以通過(guò)將源數(shù)據(jù)回復(fù)(Revert)到快照創(chuàng)建時(shí)的狀態(tài),并把源數(shù)據(jù)庫(kù)替換為它的一個(gè)快照。命令如下:
1> use master; 2> GO 已將數(shù)據(jù)庫(kù)上下文更改為 'master'。 1> restore database Archive from database_snapshot='Archive_snapshot'; 2> GO 1> use Archive; 2> GO 已將數(shù)據(jù)庫(kù)上下文更改為 'Archive'。 1> select * from t1; 2> GO t_id t_date ----------- -------------------- 1 2019-04-25 (1 行受影響)
在將源數(shù)據(jù)庫(kù)Archive回復(fù)到快照創(chuàng)建時(shí)的狀態(tài)后,表t1中只有一條記錄。
在回復(fù)(Revert)操作期間,快照和源數(shù)據(jù)庫(kù)是可用的并會(huì)被標(biāo)記為“還原中”。如果在回復(fù)操作期間出現(xiàn)錯(cuò)誤,該操作將會(huì)在數(shù)據(jù)庫(kù)重新啟動(dòng)時(shí)嘗試完成回復(fù)操作。當(dāng)存在多個(gè)快照時(shí)是不能回復(fù)到其中任何一個(gè)快照的,所以首先我們應(yīng)該把除了希望回復(fù)的快照以外的所有快照刪除。刪除一個(gè)快照的操作與drop database操作非常相似。在刪除快照的同時(shí),所有的NTFS稀疏文件也都被刪除了。
需要注意下面的這些與數(shù)據(jù)庫(kù)快照有關(guān)的附加注意事項(xiàng):
.不能在model,master和tempdb數(shù)據(jù)庫(kù)上創(chuàng)建快照(SQL Server內(nèi)部可以為了對(duì)master數(shù)據(jù)庫(kù)運(yùn)行在線DBCC檢查而為其創(chuàng)建一些快照,但是這些快照是不能顯式創(chuàng)建的)。
1> drop database Archive_snapshot; 2> GO
.一個(gè)快照會(huì)從它的源數(shù)據(jù)庫(kù)中繼承安全約束,且由于快照是只讀的,所以我們無(wú)法改變其權(quán)限。
.如果從源數(shù)據(jù)庫(kù)中刪除一個(gè)用戶,該用戶會(huì)繼續(xù)留在快照中。
.不能備份或還原快照,但是能夠正常備份源數(shù)據(jù)庫(kù);它并不受數(shù)據(jù)庫(kù)快照的影響。
.不能附加或分離快照。
.數(shù)據(jù)庫(kù)快照并不支持全文索引,全文目錄不會(huì)從源數(shù)據(jù)庫(kù)傳播到快照中。
“sql server 2005數(shù)據(jù)庫(kù)怎么創(chuàng)建快照”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。