系統(tǒng)庫-關(guān)于SQL Server Model Database探究

概述
在前幾篇文章中我們先后介紹了SQL Server 的系統(tǒng)庫master、resource、msdb,今天我們探討一下另一個系統(tǒng)數(shù)據(jù)庫-Model 數(shù)據(jù)庫一些特征。顧名思義,model 數(shù)據(jù)庫用作在 SQL Server 實(shí)例中創(chuàng)建新數(shù)據(jù)庫的模型。這意味著當(dāng)我們創(chuàng)建一個新數(shù)據(jù)庫時,這個新數(shù)據(jù)庫是通過復(fù)制模型數(shù)據(jù)庫形成的。
特征
1、新數(shù)據(jù)庫文件的初始大小繼承自模型數(shù)據(jù)庫
新數(shù)據(jù)庫的初始數(shù)據(jù)庫文件大小和自動增長選項與模型數(shù)據(jù)庫相同。讓我們用一個例子來探討一下。
在 SQL Server Management Studio (SSMS) 中,我們右鍵單擊模型數(shù)據(jù)庫并選擇 “屬性”。

在“文件”頁面,我們可以看到模型數(shù)據(jù)庫文件的相關(guān)信息。

現(xiàn)在,我們將更改數(shù)據(jù)和日志文件的大小以及自動增長選項,然后單擊“確定”。

之后,如果打開新建數(shù)據(jù)庫創(chuàng)建窗口,我們可以看到文件的默認(rèn)大小和自動增長選項與為模型數(shù)據(jù)庫設(shè)置的相同。

因此,新的數(shù)據(jù)庫文件將默認(rèn)使用模型數(shù)據(jù)庫中的大小和自動增長選項。
2、新建數(shù)據(jù)庫的恢復(fù)模型與model數(shù)據(jù)庫的恢復(fù)模型相同
新數(shù)據(jù)庫的恢復(fù)模型也繼承自模型數(shù)據(jù)庫。在下面的示例中,我們可以看到模型數(shù)據(jù)庫處于完全 恢復(fù)模型中:

我們將恢復(fù)模式從Full更改為Bulk-logged。此外,我們將更改兼容性級別和自動收縮選項。然后,我們單擊“確定” 以保存這些更改。

之后,如果我們打開 New Database 創(chuàng)建窗口,我們可以看到所有這些更改都應(yīng)用于新數(shù)據(jù)庫。

因此,正如我們所見,在創(chuàng)建新數(shù)據(jù)庫時,數(shù)據(jù)庫恢復(fù)模型和其他數(shù)據(jù)庫選項都是從模型數(shù)據(jù)庫中復(fù)制而來的。
3、在model數(shù)據(jù)庫中創(chuàng)建的數(shù)據(jù)庫對象將存在于新創(chuàng)建的數(shù)據(jù)庫中
如果我們在模型數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)庫對象,這些對象將出現(xiàn)在該實(shí)例中的任何新數(shù)據(jù)庫中。
模型數(shù)據(jù)庫的這一特性可用于為新數(shù)據(jù)庫創(chuàng)建預(yù)定義模板。例如,如果需要在所有新數(shù)據(jù)庫中包含一些特殊對象,則可以將這些對象添加到模型數(shù)據(jù)庫中,而不是每次創(chuàng)建新數(shù)據(jù)庫后都創(chuàng)建它們。在這些情況下,建議對模型數(shù)據(jù)庫進(jìn)行備份,以便在數(shù)據(jù)庫出現(xiàn)問題時恢復(fù)模型數(shù)據(jù)庫的修改版本。
4、在模型數(shù)據(jù)庫中創(chuàng)建的對象也出現(xiàn)在tempDB中
新數(shù)據(jù)庫不僅繼承了在模型數(shù)據(jù)庫中創(chuàng)建的對象,而且這些對象在創(chuàng)建時也存在于 TempDB 中。
首先,我們可以看到,在我們的實(shí)例中,TempDB 中沒有用戶定義的表和存儲過程。

由于我們已經(jīng)在模型數(shù)據(jù)庫中添加了一個表和存儲過程,讓我們重新啟動實(shí)例。重新啟動后,我們可以在“表”和“存儲過程”下看到模型數(shù)據(jù)庫中定義的對象。

這是因?yàn)槊看螁?SQL Server 實(shí)例時,都會重新創(chuàng)建 TempDB 數(shù)據(jù)庫。因此,作為一個新創(chuàng)建的數(shù)據(jù)庫,它繼承了model數(shù)據(jù)庫中創(chuàng)建的對象。
5、模型數(shù)據(jù)庫必須始終存在于 SQL Server 上
如果模型數(shù)據(jù)庫不可用,則無法啟動 SQL Server 實(shí)例。這是因?yàn)楫?dāng)實(shí)例啟動時,它會重新創(chuàng)建 TempDB 數(shù)據(jù)庫,而模型數(shù)據(jù)庫是該發(fā)生所必需的。
讓我們重現(xiàn)這種情況。我們停止 SQL Server 并將模型數(shù)據(jù)庫數(shù)據(jù)文件移動到另一個位置。然后,如果我們嘗試啟動實(shí)例,我們將收到以下錯誤消息。

如果我們查看 ERRORLOG 文件,我們可以看到 SQL Server 無法啟動的原因是模型數(shù)據(jù)庫不可用。

因此,模型數(shù)據(jù)庫在每個 SQL Server 實(shí)例中都是必需的。
結(jié)論
綜上所述,模型數(shù)據(jù)庫被用作在實(shí)例中創(chuàng)建新數(shù)據(jù)庫的模板。這意味著實(shí)例中新創(chuàng)建的數(shù)據(jù)庫會繼承模型數(shù)據(jù)庫的選項、恢復(fù)模型、數(shù)據(jù)文件初始大小等。也可以在模型數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)庫對象,例如表,這些對象將出現(xiàn)在實(shí)例中創(chuàng)建的任何新數(shù)據(jù)庫中。TempDB 數(shù)據(jù)庫還繼承了模型數(shù)據(jù)庫的一些設(shè)置,因此模型數(shù)據(jù)庫必須存在才能啟動 SQL Server。
























