系統(tǒng)庫(kù)-關(guān)于SQL Server Model Database探究
概述
在前幾篇文章中我們先后介紹了SQL Server 的系統(tǒng)庫(kù)master、resource、msdb,今天我們探討一下另一個(gè)系統(tǒng)數(shù)據(jù)庫(kù)-Model 數(shù)據(jù)庫(kù)一些特征。顧名思義,model 數(shù)據(jù)庫(kù)用作在 SQL Server 實(shí)例中創(chuàng)建新數(shù)據(jù)庫(kù)的模型。這意味著當(dāng)我們創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)時(shí),這個(gè)新數(shù)據(jù)庫(kù)是通過復(fù)制模型數(shù)據(jù)庫(kù)形成的。
特征
1、新數(shù)據(jù)庫(kù)文件的初始大小繼承自模型數(shù)據(jù)庫(kù)
新數(shù)據(jù)庫(kù)的初始數(shù)據(jù)庫(kù)文件大小和自動(dòng)增長(zhǎng)選項(xiàng)與模型數(shù)據(jù)庫(kù)相同。讓我們用一個(gè)例子來探討一下。
在 SQL Server Management Studio (SSMS) 中,我們右鍵單擊模型數(shù)據(jù)庫(kù)并選擇 “屬性”。
在“文件”頁(yè)面,我們可以看到模型數(shù)據(jù)庫(kù)文件的相關(guān)信息。
現(xiàn)在,我們將更改數(shù)據(jù)和日志文件的大小以及自動(dòng)增長(zhǎng)選項(xiàng),然后單擊“確定”。
之后,如果打開新建數(shù)據(jù)庫(kù)創(chuàng)建窗口,我們可以看到文件的默認(rèn)大小和自動(dòng)增長(zhǎng)選項(xiàng)與為模型數(shù)據(jù)庫(kù)設(shè)置的相同。
因此,新的數(shù)據(jù)庫(kù)文件將默認(rèn)使用模型數(shù)據(jù)庫(kù)中的大小和自動(dòng)增長(zhǎng)選項(xiàng)。
2、新建數(shù)據(jù)庫(kù)的恢復(fù)模型與model數(shù)據(jù)庫(kù)的恢復(fù)模型相同
新數(shù)據(jù)庫(kù)的恢復(fù)模型也繼承自模型數(shù)據(jù)庫(kù)。在下面的示例中,我們可以看到模型數(shù)據(jù)庫(kù)處于完全 恢復(fù)模型中:
我們將恢復(fù)模式從Full更改為Bulk-logged。此外,我們將更改兼容性級(jí)別和自動(dòng)收縮選項(xiàng)。然后,我們單擊“確定” 以保存這些更改。
之后,如果我們打開 New Database 創(chuàng)建窗口,我們可以看到所有這些更改都應(yīng)用于新數(shù)據(jù)庫(kù)。
因此,正如我們所見,在創(chuàng)建新數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)恢復(fù)模型和其他數(shù)據(jù)庫(kù)選項(xiàng)都是從模型數(shù)據(jù)庫(kù)中復(fù)制而來的。
3、在model數(shù)據(jù)庫(kù)中創(chuàng)建的數(shù)據(jù)庫(kù)對(duì)象將存在于新創(chuàng)建的數(shù)據(jù)庫(kù)中
如果我們?cè)谀P蛿?shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象,這些對(duì)象將出現(xiàn)在該實(shí)例中的任何新數(shù)據(jù)庫(kù)中。
模型數(shù)據(jù)庫(kù)的這一特性可用于為新數(shù)據(jù)庫(kù)創(chuàng)建預(yù)定義模板。例如,如果需要在所有新數(shù)據(jù)庫(kù)中包含一些特殊對(duì)象,則可以將這些對(duì)象添加到模型數(shù)據(jù)庫(kù)中,而不是每次創(chuàng)建新數(shù)據(jù)庫(kù)后都創(chuàng)建它們。在這些情況下,建議對(duì)模型數(shù)據(jù)庫(kù)進(jìn)行備份,以便在數(shù)據(jù)庫(kù)出現(xiàn)問題時(shí)恢復(fù)模型數(shù)據(jù)庫(kù)的修改版本。
4、在模型數(shù)據(jù)庫(kù)中創(chuàng)建的對(duì)象也出現(xiàn)在tempDB中
新數(shù)據(jù)庫(kù)不僅繼承了在模型數(shù)據(jù)庫(kù)中創(chuàng)建的對(duì)象,而且這些對(duì)象在創(chuàng)建時(shí)也存在于 TempDB 中。
首先,我們可以看到,在我們的實(shí)例中,TempDB 中沒有用戶定義的表和存儲(chǔ)過程。
由于我們已經(jīng)在模型數(shù)據(jù)庫(kù)中添加了一個(gè)表和存儲(chǔ)過程,讓我們重新啟動(dòng)實(shí)例。重新啟動(dòng)后,我們可以在“表”和“存儲(chǔ)過程”下看到模型數(shù)據(jù)庫(kù)中定義的對(duì)象。
這是因?yàn)槊看螁?dòng) SQL Server 實(shí)例時(shí),都會(huì)重新創(chuàng)建 TempDB 數(shù)據(jù)庫(kù)。因此,作為一個(gè)新創(chuàng)建的數(shù)據(jù)庫(kù),它繼承了model數(shù)據(jù)庫(kù)中創(chuàng)建的對(duì)象。
5、模型數(shù)據(jù)庫(kù)必須始終存在于 SQL Server 上
如果模型數(shù)據(jù)庫(kù)不可用,則無法啟動(dòng) SQL Server 實(shí)例。這是因?yàn)楫?dāng)實(shí)例啟動(dòng)時(shí),它會(huì)重新創(chuàng)建 TempDB 數(shù)據(jù)庫(kù),而模型數(shù)據(jù)庫(kù)是該發(fā)生所必需的。
讓我們重現(xiàn)這種情況。我們停止 SQL Server 并將模型數(shù)據(jù)庫(kù)數(shù)據(jù)文件移動(dòng)到另一個(gè)位置。然后,如果我們嘗試啟動(dòng)實(shí)例,我們將收到以下錯(cuò)誤消息。
如果我們查看 ERRORLOG 文件,我們可以看到 SQL Server 無法啟動(dòng)的原因是模型數(shù)據(jù)庫(kù)不可用。
因此,模型數(shù)據(jù)庫(kù)在每個(gè) SQL Server 實(shí)例中都是必需的。
結(jié)論
綜上所述,模型數(shù)據(jù)庫(kù)被用作在實(shí)例中創(chuàng)建新數(shù)據(jù)庫(kù)的模板。這意味著實(shí)例中新創(chuàng)建的數(shù)據(jù)庫(kù)會(huì)繼承模型數(shù)據(jù)庫(kù)的選項(xiàng)、恢復(fù)模型、數(shù)據(jù)文件初始大小等。也可以在模型數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象,例如表,這些對(duì)象將出現(xiàn)在實(shí)例中創(chuàng)建的任何新數(shù)據(jù)庫(kù)中。TempDB 數(shù)據(jù)庫(kù)還繼承了模型數(shù)據(jù)庫(kù)的一些設(shè)置,因此模型數(shù)據(jù)庫(kù)必須存在才能啟動(dòng) SQL Server。