SQL基礎之資料庫快照

2021-08-15 12:07:10 字數 3257 閱讀 6080

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

SQL資料庫快照

只有sql server enterprise edition才有資料庫快照。附查詢sql server 版本的語法 select version 一 建立資料庫快照 建立例項 create database tablename snap 20170215 快照名稱 on 源資料庫的邏輯名稱 nam...

資料庫快照

簡介 資料庫快照,正如其名稱所示那樣,是資料庫在某一時間點的檢視。快照設計最開始的目的是為了報表服務。比如我需要出2011的資產負債表,這需要資料保持在2011年12月31日零點時的狀態,則利用快照可以實現這一點。快照還可以和映象結合來達到讀寫分離的目的。下面我們來看什麼是快照。什麼是快照 資料庫快...

資料庫快照

資料庫快照是什麼 資料庫快照提供源資料庫在建立快照時的唯讀 靜態檢視,不包含未提交的事務。由於 資料庫引擎 在建立快照後執行恢復,因此未提交的事務在新近建立的資料庫快照中回滾 資料庫中的事務不受影響 在建立時,每個資料庫快照在事務上都與源資料庫一致。在建立資料庫快照時,源資料庫通常會有開啟的事務。在...