搜尋本站文章

2010-04-18

SQL Server 資料庫連線字串的「Network Library」屬性

在設定資料庫連線字串時,可以在「Network Library」區域,明確設定所使用的「網路程式庫」。

一般而言,使用ComputerName,會比較容易受到外部影響導致延遲,例如: DNS 查閱速度很慢、網域控制站/Kerberos 金鑰發佈中心 (KDC) 速度很慢、連絡 SQL Server Browser 所用的時間以及網路壅塞等。
若使用 IP 位址,加上指定通訊埠等方式,是可以減少上述的延遲。


若要調整「用戶端通訊協定」的順序,可以使用以下的方式:
1. 使用「SQL Server 組態管理員」這類的工具,在「用戶端通訊協定」內,將TCP/IP保持在清單的頂端。
2. 可以在連接字串指定了 Network 屬性,這就會覆寫清單順序。







但在 Microsoft Visual Studio 的設定視窗內,卻有點在圖型介面上的問題,請參考下圖所示:






在設定「TCP/IP 」與「VIA」卻都是顯示一樣的「DBMSGNET」。

但實際上使用的連線字串卻是:
-- TCP/IP
Network Library=dbmssocn

-- VIA (DBMSGNET)
Network Library=dbmsgnet


卻是不同的。



在台灣微軟聯繫後,猜測可能是產品的bug。
在此感謝 Terry Lin 的協助。

適用的環境:
Visual Studio 2008、Visual Studio 2010 中文、英文版本。






以下整理出各種通訊協定所產生的部分連線字串:
Named Pipes (DBNMPNTW):Network Library=dbnmpntw

Shared Memory (DBMSSOCN):Network Library=dbmslpcn

TCP/IP (DBMSGNET):Network Library=dbmssocn

VIA (DBMSGNET):Network Library=dbmsgnet



參考資料:
如何在 ADO 連接字串中設定 SQL Server 網路程式庫
http://support.microsoft.com/kb/238949

當用戶端電腦嘗試連線到 SQL Server 執行個體時,SQL Server 用戶端可能會變更通訊協定
http://support.microsoft.com/kb/328383/zh-tw

PRB: ODBC 連線失敗: SQLState: '08001' DBMSSOCN
http://support.microsoft.com/kb/195566/zh-tw

選擇網路通訊協定
http://msdn.microsoft.com/zh-tw/library/ms187892.aspx

搭配 SQL Server Native Client 使用連接字串關鍵字
http://msdn.microsoft.com/zh-tw/library/ms130822.aspx

2010-04-08

新手學SQL Server 2008「資源管理員(Resource Governor)」(2)


在前一篇文章中,我們討論了「資源管理員」的整體架構,包含有:「資源集區」、設定「資源集區」可用的系統資源、認識「工作負載群組」、認識「分類函數」、在「分類函數」內使用系統函數、「資源管理員」的組態設定、監控「資源管理員」與使用「資源管理員」的限制條件與注意事項等。

在本期文章中,我們將討論帶領各位按部就班的來建置「資源管理員」。

完整的文章,請參考:第98期之一《新手學SQL Server 2008「資源管理員(Resource Governor)」(2)》




更多相關的技術文章,請參考:DB World 資料庫專家電子雜誌
http://www.dbworld.com.tw/

2010-04-03

設定SQL Server「錯誤記錄檔(Error log file)」的保存份數

SQL Server 將特定系統事件和使用者自訂事件記錄到 SQL Server 錯誤記錄檔和 Microsoft Windows 應用程式記錄檔中。
這兩種記錄檔都會自動替所有記錄的事件加入時間戳記。


請使用 SQL Server 錯誤記錄檔中的資訊來解決 SQL Server 的相關問題。
請參考下圖所示:




檢視 SQL Server 錯誤記錄檔,以確定處理序順利完成 (例如,備份與還原作業、批次命令或其他指令碼和處理序)。
這有助於偵測任何目前的或潛在的問題區域,包括自動復原訊息 (尤其是 SQL Server 的執行個體已停止又重新啟動時)、核心訊息或其他伺服器層級的錯誤訊息。

使用 SQL Server Management Studio 或任何文字編輯器來檢視 SQL Server 錯誤記錄檔。
根據預設,錯誤記錄檔是位於 C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log 資料夾內。

每次啟動 SQL Server 的執行個體時,就會建立新的錯誤記錄檔,不過,sp_cycle_errorlog 系統預存程序可用來循環錯誤記錄檔,而不必重新啟動 SQL Server 的執行個體。
通常,SQL Server 會保留前 6 個記錄檔的備份,並提供副檔名 .1 給最新的記錄檔備份,提供副檔名 .2 給第二新的備份...依此類推。目前的錯誤記錄檔並沒有副檔名。


請參考下圖所示:



Windows 應用程式記錄檔可針對 Windows 作業系統上所發生的事件,以及 SQL Server 與 SQL Server Agent 中的事件,提供整體描述。
使用「Windows 事件檢視器」可檢視 Windows 應用程式記錄檔,以及篩選資訊。
例如,您可以篩選事件,例如資訊、警告、錯誤、成功稽核與失敗稽核。

您可以同時使用 SQL Server 錯誤記錄檔和 Windows 應用程式記錄檔,來找出問題的原因。
例如,在監視 SQL Server 錯誤記錄檔時,您可能會收到不含原因資訊的錯誤訊息。

藉由比較這些記錄之間的事件日期和時間,可以縮小可能原因的範圍。
SQL Server Management Studio 記錄檔檢視器可讓您將 SQL Server、SQL Server Agent 與 Windows 記錄檔整合為一份清單,以便輕鬆地了解相關的伺服器事件與 SQL Server 事件。




-- 若要查詢SQL Server錯誤記錄檔,所存放的路徑
SELECT ServerProperty('ErrorLogFileName')


請參考下圖所示:


-- 查詢SQL Server錯誤記錄檔的檔案資料
exec master.dbo.sp_enumerrorlogs


請參考下圖所示:


-- 設定 SQL Server 錯誤記錄檔,調整為 10 份(至多為 99 份)。
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
N'Software\Microsoft\MSSQLServer\MSSQLServer',
N'NumErrorLogs', REG_DWORD, 10
GO


請參考下圖所示:


/* 使用 sp_cycle_errorlog

關閉目前的錯誤記錄檔,依照類似伺服器重新啟動的方式來循環處理錯誤記錄副檔名的號碼。
新的錯誤記錄包含版本和著作權資訊,還會有一行指出已建立新記錄。

每次啟動 SQL Server 時,都會將目前的錯誤記錄重新命名為 errorlog.1;errorlog.1  會成為 errorlog.2,errorlog.2 會成為 errorlog.3,依此類推。
您可以利用 sp_cycle_errorlog,在不停止和啟動伺服器的情況下,循環處理錯誤記錄檔。
*/
EXEC sp_cycle_errorlog ;
GO


請參考下圖所示:




-- 查詢 SQL Server Agent 錯誤記錄檔,至多 9 份 
exec master.dbo.sp_enumerrorlogs 2



請參考下圖所示:




/*
關閉目前的 SQL Server Agent 錯誤記錄檔,
依照類似伺服器重新啟動的方式來循環處理 SQL Server Agent 錯誤記錄副檔名的號碼。
新的 SQL Server Agent 錯誤記錄會有一行指出已建立新記錄。

*/
exec msdb.dbo.sp_cycle_agent_errorlog


請參考下圖所示:





參考資料:
監視錯誤記錄
http://msdn.microsoft.com/zh-tw/library/ms191202.aspx

檢視 SQL Server 錯誤記錄
http://msdn.microsoft.com/zh-tw/library/ms187885.aspx

檢視 Windows 應用程式記錄
http://msdn.microsoft.com/zh-tw/library/ms191446.aspx

sp_cycle_errorlog (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms182512.aspx

設定 SQL Server 錯誤記錄檔 (一般頁面)
http://technet.microsoft.com/zh-tw/library/ms177285.aspx

設定「警示(Alerts)」來回應所發生的錯誤,以「錯誤嚴重性(Error Severities)」為例

當 SQL Server Database Engine 產生錯誤時,錯誤的嚴重性會指出 SQL Server 所發生的問題類型。

下表列出和描述 SQL Server Database Engine 所產生之錯誤的嚴重性層級。





以下的實作練習,將建立「警示」,來回應Database Engine 錯誤嚴重性(Error Severities)
回應的嚴重性層級,是在層級 17 以上,而且是已經寫入到 Windows 應用程式記錄中。


任務1:建立「警示」來回應嚴重性層級在17以上的錯誤事件
請執行以下的範例程式碼:

PRINT N'準備安裝「警示」...'
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 17 錯誤')
OR ((severity = 17) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 17 錯誤',
@message_id = 0,
@severity = 17,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 18 錯誤')
OR ((severity = 18) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 18 錯誤',
@message_id = 0,
@severity = 18,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 19 錯誤')
OR ((severity = 19) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 19 錯誤',
@message_id = 0,
@severity = 19,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 20 錯誤')
OR ((severity = 20) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 20 錯誤',
@message_id = 0,
@severity = 20,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 21 錯誤')
OR ((severity = 21) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 21 錯誤',
@message_id = 0,
@severity = 21,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 22 錯誤')
OR ((severity = 22) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 22 錯誤',
@message_id = 0,
@severity = 22,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE name = N'發生:嚴重層級. 23 錯誤'
OR ((severity = 23) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 23 錯誤',
@message_id = 0,
@severity = 23,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 24 錯誤')
OR ((severity = 24) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 24 錯誤',
@message_id = 0,
@severity = 24,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

IF (NOT EXISTS (SELECT *
FROM msdb.dbo.sysalerts
WHERE (name = N'發生:嚴重層級. 25 錯誤')
OR ((severity = 25) AND
(message_id = 0) AND
(database_name IS NULL) AND
(event_description_keyword IS NULL) AND
(performance_condition IS NULL))))
EXECUTE msdb.dbo.sp_add_alert
@name = N'發生:嚴重層級. 25 錯誤',
@message_id = 0,
@severity = 25,
@enabled = 1,
@delay_between_responses = 10,
@database_name = NULL,
@notification_message = NULL,
@job_name = NULL,
@event_description_keyword = NULL,
@include_event_description_in = 5; -- Email and NetSend
GO

PRINT ''
PRINT N'已經完成安裝.'
GO

-- 查詢已經安裝的「警示」
EXECUTE msdb.dbo.sp_help_alert;
GO


請參考下圖所示:





由上,已經完成建立「警示」的作業。

請再整合到「操作員(Operator)」上,設定發生這些「警示」時,要使用「操作員」進行通知作業。



若是要刪除先前所建立的「警示」,可以執行以下的範例程式碼:

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 17 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 17 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 18 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 18 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 19 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 19 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 20 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 20 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 21 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 21 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 22 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 22 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 23 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 23 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 24 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 24 錯誤'
GO

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'發生:嚴重層級. 25 錯誤')
EXEC msdb.dbo.sp_delete_alert @name=N'發生:嚴重層級. 25 錯誤'
GO




參考資料:
監視和回應事件
http://msdn.microsoft.com/zh-tw/library/ms191508.aspx

Database Engine 錯誤嚴重性
http://msdn.microsoft.com/zh-tw/library/ms164086%28SQL.90%29.aspx

讀我檔案_警示範例
http://technet.microsoft.com/zh-tw/library/ms161554.aspx

Microsoft SQL Server Community Projects & Samples
http://sqlserversamples.codeplex.com/Wikipage

Microsoft SQL Server Product Samples: Scripts
http://msftscrptprodsamples.codeplex.com/Wikipage