天天看點

SQL基礎之資料庫快照 SQL基礎之資料庫快照

SQL基礎之資料庫快照

1.認識快照

  如名字一樣,資料庫快照就可以了解為資料庫某一時刻的照片,它記錄了此時資料庫的資料資訊。如果要認識快照的本質,那就要了解快照的工作原理。當我們執行t-sql建立快照後,此時就會建立一個或多個稀疏檔案。稀疏檔案的個數與資料庫資料檔案的個數相等且一定要相等,否則會報錯。此時,稀疏檔案隻是一個空檔案并沒有在磁盤上配置設定空間存儲使用者資料,如果資料庫沒有任何更新那快照也将一直是空檔案。快照唯一的一次寫資料,僅發生在第一次更新資料庫的資料頁,這時快照會将資料頁中的資料複制到快照中并在磁盤上真真的配置設定了空間。以後這個資料頁無論怎麼變化都與快照沒關系,就這樣其它頁都在第一次更新資料前将這一頁的資料複制到快照中,直到資料庫的所有頁都都被複制到快照中。當然這并不是很好的結果,因為這樣的快照占用了大量的空間。另外快照沒有備援存儲,是以為了保證資料庫不出錯還應該多方位考慮比如使用備份。

  建立快照後,當通路快照中的資料時如果資料頁未更新那麼将直接通路源資料庫,如果資料頁已更新那麼将通路快照。知道了快照的工作原理後下一個疑問就是快照的作用以及何時使用它。快照的作用主要有2點:由于快照可以儲存資料庫某一時刻的資料資訊,是以可利用快照做報表;由于快照儲存了資料庫的資料,可使資料庫還原為建立快照時的狀态,是以可利用快照作為一種安全和可靠性政策。使用快照恢複資料庫一般比備份快得多,但恢複後的資料庫将無法再進行前滾操作。不過有一種方式可以解決這個缺點,我們可以将源資料庫對比資料庫快照中的表,源資料庫裡誤删或資料錯誤的表可根據快照中的表來建立新的資料表,并将快照中的資料全部複制到源資料庫裡建立的新表中。當表不多資料量不是很大時這種方法還是挺不錯的。

2.稀疏檔案

  稀疏檔案是一種檔案存儲的方式,當它被建立時稀疏檔案占用的磁盤空間非常少,而使用者資料并不會占用磁盤空間。這種檔案雖然建立了但并未配置設定完整的存儲空間,随着使用者資料的寫入稀疏檔案才開始慢慢占用磁盤空間,當在windows中屬性檢視這個檔案時會發現它的大小就是建立快照是源資料庫的大小。稀疏檔案以64KB的增量增加,也就是說稀疏檔案的大小一定是64KB的整數倍。當增加一個64KB時,它可以存放8個資料頁,而這64KB空間最開始為空字元串或隻占用一點點使用者資料,是以很稀少。随着使用者資料的增加稀疏檔案最終将等于源資料庫的大小。我們可以使用t-sql來檢視稀疏檔案名: select physical_name from  sys.master_files,而在sys.database_files中則隻會顯示源資料庫名,就算是在資料庫快照中進行select。另外還可以使用sys.dm_io_virtual_file_stats函數傳回表中的size_on_disk_bytes列來檢視稀疏檔案的真實大小。

3.限制條件

  對于源資料庫,在資料庫快照存在期間,不得對源資料庫進行删除、分離或還原,不得對源資料庫和快照進行檔案删除操作。但此時可以備份資料庫,從這裡可以看出資料庫備份不會受到快照的影響。由于源資料庫中的資料頁第一次更新時會将資料頁寫到快照中,是以這必将影響對源資料庫更新時的性能。源資料庫必須處于聯機狀态且不能将源資料庫配置為可縮放共享資料庫。如果在鏡像資料庫中建立資料庫快照,資料庫必須處于同步鏡像狀态。

  對于資料庫快照,快照必須與源資料庫在相同的伺服器執行個體上建立和保留,在快照拷貝源資料頁時如果快照用盡磁盤空間或者遇到其他錯誤,那麼就認為該快照為可疑快照并且必須删除快照。禁止對model資料庫、master資料庫和tempdb資料庫建立快照,快照為隻讀檔案不得更改資料庫快照的任何規範,當然也就不能删除資料庫快照中的檔案了。不能備份或還原資料庫快照,不能對資料庫快照進行附加和分離操作。由于資料庫快照使用的稀疏檔案是NTFS檔案系統提供的,是以隻能在NTFS檔案系統上建立快照。資料庫快照會繼承快照建立時源資料庫的安全限制,不過由于快照的隻讀性是以繼承的限制性不得修改。在日志傳送配置中隻能針對主資料庫檔案,而不能針對輔助資料庫建立資料庫快照。當從主伺服器執行個體切換為輔助伺服器執行個體時,必須先将資料庫快照删除。不能将資料庫快照配置為可縮放共享資料庫,資料庫快照不支援FILESTREAM檔案組,如果源資料庫中存在FILESTREAM檔案組,則在資料庫快照中将視這個檔案組為脫機狀态,并且資料庫快照不能用于恢複資料庫。

  快照始終反映建立該快照時的檔案組狀态,聯機檔案組将保持聯機狀态,脫機檔案組将保持脫機狀态,這是快照與檔案組狀态關系的本質。首先快照建立時,如果源資料庫存在脫機檔案組,因為稀疏檔案不能存儲脫機檔案組,故源資料庫中的脫機檔案組在快照中将是脫機狀态。建立快照後,源資料庫不能對脫機檔案組進行聯機,這樣的話脫機檔案組将一直保持脫機狀态。聯機失敗的原因在于使檔案聯機會對該檔案進行還原,而在資料庫快照存在期間不得對源資料庫進行删除、分離或還原。如果建立快照時源檔案組是聯機的,那麼此時若對資料檔案進行脫機操作,在資料庫快照中将仍然保持聯機狀态,也就是聯機檔案組将保持聯機狀态。接着如果通路快照中的資料,顯然如果源資料庫資料頁沒有更新那将通路源資料庫,然而資料頁所在的檔案組已脫機,最終會産生通路錯誤而導緻失敗。

4.操作快照

   在建立資料庫快照時,msdn建議我們應該對源資料庫建立多個資料庫快照,這些快照代表着不同時間資料庫的狀态。并且我們還應該定時的更新資料庫快照,以提高源資料庫的正确性。在恢複資料庫操作中,恢複前必須将其它資料庫快照删除,另外若源資料庫中含有隻讀或壓縮檔案、源資料庫建立快照後對聯機檔案進行脫機都将無法進行資料庫還原操作。任何對資料庫具有restore database權限的使用者都可以恢複資料庫快照,但要注意恢複過程中除了資料頁的恢複外還将覆寫舊的日志檔案并重建日志。這樣就無法對恢複後的源資料庫進行前滾操作,建立快照後的所有資料都将丢失。

--建立資料庫快照的唯一方式就是使用t-sql

--對應普通資料庫,可以建立資料庫的使用者就可以建立對應的資料庫快照
--對應鏡像資料庫,隻有sysadmin固定伺服器角色成員才能建立
create database testDB_SS on
(
    name=testDB_data,                     --快照使用的資料檔案名
    filename='E:\07_代碼存放\testDB_SS.ss' --快照存放的路徑
)
as snapshot of testDB
go

--通過資料庫快照恢複源資料庫,恢複完成的資料庫将保留資料庫快照的權限和配置
--在恢複過程中,快照和源資料庫都将不可用。如果恢複期間發生錯誤那資料庫在重新啟動後會再嘗試恢複操作。
restore database testDB from database_snapshot ='testDB_SS.ss'

--删除資料庫快照,操作完成後将關閉對快照的所有使用者連接配接,顯然稀疏檔案将不存在
drop database testDB_SS
           

轉自:https://www.cnblogs.com/fangyz/p/5782190.html

********************隻要思想不滑坡,辦法總比困難多*******************