server
SQL Server伺服器的配置選項屬於那種人們瞭解較少且經常誤用的選項。當一個技術支援人員要求你按照某種方式調整一個選項、而另一個技術支援人員卻要求你按照另一種完全對立的方式調整同一個選項時,你可能對這些選項的真正含義感到困惑。有關這些選項的資料很缺乏,至少可以說不夠詳細和清楚。在SQL Server 2000中,Microsoft減少了幾個配置選項,讓SQL Server動態配置它們,從而減少了幾個容易混淆的地方。同時,Microsoft又為SQL Server 2000新增了兩個伺服器配置選項,調整了一些資料庫選項,從而稍許簡化了資料庫管理員的工作。
新增的伺服器選項
就象訪問大多數企業版伺服器的屬性一樣,我們不能在SQL Server Enterprise Manager中通過伺服器屬性視窗訪問SQL Server 2000新增的兩個伺服器選項。作為防止使用者由於不小心而錯誤設定管理員的一個安全措施,Microsoft沒有把這些進階配置選項放入Enterprise Manager。相反,我們必須使用T-SQL/sp_configure系統預存程序去訪問這些進階選項。我們可以用不帶參數運行sp_configure的方法查看伺服器的當前配置。在執行結果中,config_value是SQL Server從Master資料庫syscurconfigs表提取出來的資料,它顯示了伺服器的當前配置;run_value列顯示了執行sp_configure時SQL Server正在使用的選項,SQL Server在sysconfigures表中儲存這些資料。修改某個選項之後,我們必須執行RECONFIGURE命令(在大多數情況下,還要重新啟動SQL Server)才能讓新的run_value顯示出來。本文所討論的所有選項都要求重新啟動SQL Server。
伺服器選項總共有36個,預設情況下,sp_configure預存程序只顯示其中的10個,顯示結果中不包含進階選項,而且所有新的SQL Server配置選項都不會出現在這個精簡的清單中。然而,我們可以使用show advanced options命令參數讓SQL Server顯示出所有選項。要啟用show advanced options,我們使用如下命令格式:
EXEC sp_configure 'show advanced options', '1' RECONFIGURE
要安裝一個選項,我們必須在使用sp_configure設定管理員之後運行RECONFIGURE命令。上面命令的輸出結果如下:
Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE command to install.
一旦能夠查看進階選項,我們就可以看到兩個新的伺服器選項。其中最重要的一個新選項是awe enabled選項,它能夠讓SQL Server企業版提高伺服器的記憶體訪問能力。預設情況下,SQL Server能夠使用的最大RAM是3GB。在Windows 2000上,應用程式可以 使用Address Windowing Extensions(AWE)API訪問更多的RAM。例如,在Windows 2000 Advanced Server中,我們能夠使用多達8GB的記憶體,只有Windows 2000 Datacenter Server支援64GB記憶體才超過它。顯然,當SQL Server擁有更多的可用記憶體,它將能夠緩衝更多的資料,改善查詢的回應時間。
不過,啟用awe enabled選項也有副作用。啟用awe enabled選項之後,SQL Server不再動態地分配記憶體。由於缺乏記憶體動態分配功能,管理負擔隨之增加,因為我們必須仔細地監視RAM使用方式。另外,設定awe enabled選項之後,我們還必須設定max server memory選項。如果我們不設定max server memory選項,伺服器RAM又等於最低要求3GB,SQL Server將在啟動的時候佔據機器上幾乎所有的RAM,只給Windows和其他應用留下128 MB的RAM。通過設定max server memory選項,我們可以限制SQL Server使用的記憶體總量。
awe enabled選項只能在SQL Server 2000 Enterprise Edition上使用,作業系統必須是Windows 2000 Advance Server或Datacenter。如果你在SQL Server的其他版本上使用這個選項(或者作業系統是WinNT),SQL Server將忽略這個選項。在某些伺服器配置組合下,不適當地配置這個選項將導致不可預知的結果。例如,如果我們在Windows 98作業系統、運行SQL Server Personal Edition的機器上設定這個選項,SQL Server可能報告它已經停止(甚至是在它正在啟動並執行時候),而且它將拒絕停止SQL Server執行個體。
在SQL Server Enterprise Edition伺服器上啟用AWE包括三個步驟。首先,我們必須確保啟動SQL Server執行個體的帳號具有在記憶體中鎖定頁的許可權。SQL Server安裝時自動把頁鎖定許可權授予我們指定用來啟動SQL Server服務的Windows帳號;但是,如果後來這個帳號已經改變,你應該檢查一下已經把哪些許可權授予了啟動SQL Server的使用者。檢查帳號的許可權可以使用Windows 2000的組策略工具。第二個步驟是運行sp_configure預存程序,把awe enabled選項設定為1。然後,我們必須執行RECONFIGURE,用手工方式重新啟動SQL Server。配置命令的文法為:
EXEC sp_configure 'awe enabled', '1' RECONFIGURE
注意,在Windows 2000或者NT上,如果要訪問高於4GB的實體記憶體,我們還必須採取其他一些措施,即修改boot.ini檔案,加入/pae選項。
第二個新的SQL Server 2000選項用來啟用C2級安全性稽核模式。C2是一個政府安全等級,它保證系統能夠保護資源並具有足夠的審核能力。C2模式允許我們監視對所有資料庫實體的所有訪問企圖。啟用SQL Server的C2審核功能的命令如下:
EXEC sp_configure 'c2 audit mode', '1' RECONFIGURE
(要實現完整的C2級安全保證,Windows作業系統也必須提供相應的支援)啟用C2稽核模式並重新啟動之後,SQL Server自動在\MSSQL\Data目錄下面建立追蹤檔案。我們可以使用SQL Server Profiler查看這些監視伺服器活動的追蹤檔案。
SQL Server以128KB大小的塊為單位把資料寫入追蹤檔案。因此,當SQL Server非正常停止時,我們最多可能丟失128 KB的日誌資料。可以想象,包含審核資訊的記錄檔將以很快的速度增大。例如,某次實驗只訪問了三個表,追蹤檔案已經超過了1MB。當追蹤檔案超過200MB時,C2審核將關閉舊檔案並建立新檔案。每次SQL Server啟動的時候,它會建立一個新的追蹤檔案。如果磁碟空間不足,SQL Server將停止運行,直至我們為稽核線索釋放出足夠的磁碟空間並重新啟動SQL Server執行個體。在SQL Server啟動的時候,我們可以使用-f參數禁用審核。
減少的伺服器選項
在SQL Server 2000中,Microsoft減少了原有的幾個選項,讓SQL Server 2000自動設定這些選項。減少的選項中最令人信服的是max async IO選項。這個選項允許資料庫管理員指定在單一的資料庫檔案上可以出現多少非同步磁碟讀取和寫入操作。SQL Server 7.0中的max async IO選項是人們瞭解最少的選項之一,它的預設值是32,但很少有管理員去調整這個值。在SQL Server 2000中,這個非同步IO選項隨著SQL Server接收的適配器反饋資訊動態地上升或者下降,SQL Server利用反饋演算法確定伺服器負載以及SQL Server系統能夠控制的數量。
資料庫選項
在SQL Server 2000中,如果你曾經查看過Enterprise Manager中資料庫的Options選項卡,你可能會對一些通用選項的消失感到困惑(要訪問Options選項卡,在Enterprise Manager中右擊資料庫然後選擇Properties)。Options選項卡中減少了trunc. log on chkpt.以及Select Into/Bulk Copy這兩個選項,如圖1所示。為了清楚和向後相容起見,這些通用選項現在稱為recovery model(恢複模型)選項。如果用SQL Server 2000的Enterprise Manager串連SQL Server 7.0資料庫,我們仍舊可以看到這些老選項。以前,我們使用下面的命令為Northwind資料庫開啟trunc. log on chkpt.選項:
SP_DBOPTION Northwind ,'trunc. log on chkpt.', true
設定好選項之後,我們可以通過Options選項卡或者下面的查詢檢查Northwind資料庫上這些選項設定是否成功:
SELECT DATABASEPROPERTY ('Northwind', 'IsTruncLog')
結果為1表示選項設定成了true;結果為0表示選項設定成了false。如果結果為NULL,它表示我們或者選擇了一個錯誤的選項,或者資料庫不存在。
為了便於使用,Microsoft把trunc. log on chkpt.和Select Into/Bulk Copy選項換成了恢複模型設定。這種選項改變的目的在於確保資料庫管理員能夠充分理解在災難恢複策略中恢複模型選項的意義。SQL Server 2000為我們提供了三種資料庫恢複模型:simple(簡單恢複),full(完全恢複),bulk_logged(大容量日誌記錄恢複)。
簡單恢複模型最容易操作,但它是最缺乏靈活性的災難恢複策略。選擇簡單恢複模型等同於把trunc. log on chkpt.設定成true。在這種恢複模型下,我們只能進行完全備份和差異備份(differential backup):這是因為交易記錄總是被截斷,交易記錄備份不可用。一般地,對於一個包含關鍵性資料的系統,我們不應該選擇簡單恢複模型,因為它不能夠協助我們把系統還原到故障點。使用這種恢複模型時,我們最多隻能把系統復原到最後一次成功進行完全備份和差異備份的狀態。進行恢複時,我們首先要恢複最後一次成功進行的完全備份,然後在此基礎上恢複差異備份(差異備份只能把自從資料庫最後一次完全備份之後對資料庫的改動施加到資料庫上)。
完全恢複模型把trunc. log on chkpt.選項和Select Into/Bulk Copy選項都設定成false。完全恢複具有把資料庫恢複到故障點或特定即時點的能力。對於保護那些包含關鍵性資料的環境來說,這種模型很理想,但它提高了裝置和管理的代價,因為如果資料庫訪問比較頻繁的話,系統將很快產生龐大的交易記錄記錄。由於在這種模型中Select Into/Bulk Copy設定成了false,SQL Server將記錄包括大容量資料裝入在內的所有事件。
最後一種恢複模型是大容量日誌記錄恢複,它把trunc. log on chkpt.設定成false,把Select Into/Bulk Copy設定成true。在大容量日誌記錄恢複模型中,大量複製操作的資料丟失程度要比完全恢複模型嚴重。完全恢複模型記錄大量複製操作的完整日誌,但在大容量日誌記錄恢複模型下,SQL Server只記錄這些操作的最小日誌,而且無法逐個控制這些操作。在大容量日誌記錄恢複模型中,資料檔案損壞可能導致要求手工重做工作。 下表比較了三種恢複模型的特點。
恢複模型 優點 工作損失表現 能否恢複到即時點?
簡單 允許高效能大量複製操作。
收回日誌空間,使得空間要求最小。 必須重做自最新的資料庫或差異備份後所發生的更改。 可以恢複到任何備份的結尾處。隨後必須重做更改。
完全 資料檔案丟失或損壞不會導致工作損失。
可以恢複到任意即時點(例如,應用程式或使用者錯誤之前)。 正常情況下沒有。
如果日誌損壞,則必須重做自最新的記錄備份後所發生的更改。 可以恢複到任何即時點。
大容量日誌記錄 允許高效能大量複製操作。
大容量操作使用最少的日誌空間。 如果日誌損壞,或者自最新的記錄備份後發生了大容量操作,則必須重做自上次備份後所做的更改。 否則不丟失任何工作。 可以恢複到任何備份的結尾處。隨後必須重做更改。
在資料庫的Options選項卡中,我們可以從Model下拉式清單方塊選擇Simple把恢複模型改成簡單模型。另外,Microsoft擴充了ALTER DATABASE命令,我們可以用它設定資料庫屬性。例如,用下面這個T-SQL命令可以把恢複模型設定為完全恢複模型:
ALTER DATABASE Northwind SET RECOVERY FULL
SQL Server 2000提供了把資料庫轉入單一使用者模式的許多選項,它們都屬於那種最令人感興趣的隱藏選項。為了修正訛誤或其他資料問題,資料庫管理員常常要把資料庫轉入單一使用者模式。當資料庫處於這種模式時,其它使用者將不能再訪問資料,從而使得管理員能夠在使用者訪問損壞的資料之前修正資料問題。在SQL Server 7.0中,在把資料庫轉入單一使用者模式之前,我們必須確保所有使用者都已經中斷連線。對於一個高速OLTP資料庫系統,比如電子商務系統,斷開所有使用者的串連非常困難,因為就在我們斷開某個使用者的串連時,其他使用者還會串連資料庫。SQL Server 2000極大地改進了這個操作過程,我們可以給使用者一個指定的時間去完成他們的事務,然後由SQL Server自動斷開他們的串連。另外,我們也可以在不提供任何延遲時間的情況下斷開所有的串連。
把資料庫轉入單一使用者模式的方法之一是在資料庫的Options選項卡選中Restrict Access檢查框,然後選擇Single user。另外,Microsoft擴充了ALTER DATABASE命令,使它能夠把資料庫轉入單一使用者模式,文法如下:
ALTER DATABASE Northwind SET SINGLE_USER
執行這個命令之後,SQL Server等待所有的資料庫連接,讓它們完成各自的事務。在這種狀態下,所有請求串連資料庫的使用者都將接收到圖2顯示的錯誤資訊,並被重新導向到他們各自的預設資料庫(通常是Master資料庫)。圖2的錯誤資訊意味著資料庫處於凍結狀態,直至所有使用者中斷連線。如果目標伺服器或者發出命令的使用者沒有設定query timeout參數,用戶端可能無限期地等待查詢完成,直至所有的串連被斷開。在Query Analyzer中,我們可以在Options螢幕(選擇菜單Tools,Options)的Connections選項卡裡面指定逾時秒數。在單一使用者模式下,只有發出ALTER DATABASE命令的使用者可以保持串連。
另外,我們還可以用ROLLBACK IMMEDIATE命令斷開所有開啟資料庫連接的使用者。但我們不能在Enterprise Manager中使用這個命令,而是應該用Query Analyzer執行,例如:
ALTER DATABASE Northwind SET SINGLE_USER WITH ROLLBACK IMMEDIATE
執行這個命令之後,SQL Server立即斷開所有的串連並回退它們的事務。所有正在執行事務的使用者都會接收到一個串連錯誤,而且他們不能再串連資料庫。
我們可以指定一個時間選項,讓SQL Server在斷開使用者的串連之前等待使用者完成他們的事務。這個選項是可選的,它用ROLLBACK AFTER關鍵詞指定,如下面的命令所示:
ALTER DATABASE Northwind SET SINGLE_USER WITH ROLLBACK AFTER 20 SECONDS
執行這個命令之後,SQL Server先等待20秒鐘,然後斷開所有的串連並回退它們的事務。在這個過程中,SQL Server不再接受新的串連請求,它是一個資料庫級的伺服器暫停。在這個20秒之內,所有企圖串連資料庫的新使用者都將接收到圖2顯示的錯誤資訊。如果執行這個命令的時候不存在已經串連的使用者,資料庫將立即轉入單一使用者模式。
Enterprise Manager的資料庫Options選項卡中,最後一個新的配置選項是Compatibility Level,如圖1所示。要設定這個選項,我們只需從Compatibility Level下拉框選擇一個合適的相容層級。在這個下拉框中,SQL Server 2000由80代表,7.0由70代表,6.5由65代表。相容層級選項決定了某些資料庫查詢操作的執行方法。由於SQL Server的關聯式引擎在發展變化,某些查詢的結果在不同的版本之間可能不同。例如,如果我們執行下面這個查詢:
SELECT DATALENGTH('')
依賴於我們為資料庫設定的相容層級是SQL Server 2000、7.0或者6.5,上述查詢可能得到兩個不同的結果。對於SQL Server 2000或7.0資料庫,返回結果是0,因為SQL Server 2000和7.0把Null 字元串視為真正的空;在SQL Server 6.5相容模式下,返回結果是1,因為SQL Server 6.5把Null 字元串視為一個空格。SQL Server 7.0也有這個相容層級選項,但它只能通過sp_dbcmptlevel預存程序訪問。
綜上所述,在SQL Server 2000中,Microsoft對伺服器和資料庫配置方法進行了幾個實質性的改動。不要輕視所有本文討論的選項和其他SQL Server配置選項——即使是一個小小的改動,它也可能對效能產生重大的正面或負面影響。在調整SQL Server的配置選項時,你最好使用Performance Monitor之類的伺服器監視工具,確保選項調整不會對伺服器效能產生負面影響。