2009年2月18日 星期三

Sql Server 2005 安裝於 Windows 2003, RAM 8 Gb 時的問題

放假的時候,公司同事安裝 Sql Server 2005 時,發生了 Sql Agent 無法啟動的問題。

回到公司後,只好自己檢查了一下。

果然,在 Sql Server Configuration Manager 啟動 Sql Agent 時,發生了問題。

現象一:

SQL Server blocked access to 程序 'dbo.sp_sqlagent_get_startup_info' of component 'Agent XPs' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Agent XPs' by using sp_configure

但事件檢視器上,也發生這樣的錯誤訊息

現象二:

SQLServerAgent could not be started(reason: SQLServerAgent 必須能夠以系統管理員(SysAdmin) 的身皆連接到 SQLServer, 但'(未知)'不是系統管理員(SysAdmin)角色的成員)

image

此時還搞不清楚狀況。只知道服務起不來。

另外,改用 sql script 來啟動時,也會發生狀況。

exec sp_configure 'show advanced options', '1'
RECONFIGURE
exec sp_configure
exec sp_configure 'Agent XPs', '1'
RECONFIGURE

結果發生以下的錯誤。

現象三:

訊息 5845,層級16,狀態1,行2
處理序的存取 Token 中,目前沒有 Address Windowing Extensions (AWE) 需要的 'lock pages in memory' 權限。

此時開始警覺到是否與伺服器的環境相關,尤其是記憶體的大小與配置設定的問題。

然後,在C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\SQLAGENT.OUT 也找到了下列的錯誤訊息

現象四:

2009-02-17 15:35:14 - ! [298] SQLServer 錯誤: 5845,處理序的存取 Token 中,目前沒有 Address Windowing Extensions (AWE) 需要的 'lock pages in memory' 權限。 [SQLSTATE 42000] (DisableAgentXPs) 
  2009-02-17 15:35:14 - ! [298] SQLServer 錯誤: 15281,SQL Server 已封鎖元件 'Agent XPs' 的 程序 'dbo.sp_sqlagent_has_server_access' 之存取,因為此元件已經由此伺服器的安全性組態關閉。系統管理員可以使用 sp_configure 來啟用 'Agent XPs' 的使用。如需有關啟用 'Agent XPs' 的詳細資訊,請參閱《SQL Server 線上叢書》中的<介面區組態>(Surface Area Configuration)。 [SQLSTATE 42000] (ConnIsLoginSysAdmin) 
  2009-02-17 15:35:14 - ! [298] SQLServer 錯誤: 15281,SQL Server 已封鎖元件 'Agent XPs' 的 程序 'dbo.sp_sqlagent_get_startup_info' 之存取,因為此元件已經由此伺服器的安全性組態關閉。系統管理員可以使用 sp_configure 來啟用 'Agent XPs' 的使用。如需有關啟用 'Agent XPs' 的詳細資訊,請參閱《SQL Server 線上叢書》中的<介面區組態>(Surface Area Configuration)。 [SQLSTATE 42000] 
  2009-02-17 15:35:14 - ? [100] Microsoft SQLServerAgent 版本 9.00.4035.00 (x86 unicode 零售 組建) : 處理序識別碼 2620 
  2009-02-17 15:35:14 - ? [101] SQL Server  版本 9.00.4035 (0 連接限制) 
  2009-02-17 15:35:14 - ? [102] SQL Server ODBC 驅動程式版本 9.00.4035 
  2009-02-17 15:35:14 - ? [103] 驅動程式所使用的 NetLib 為 DBNETLIB.DLL; 本機主機伺服器為 
  2009-02-17 15:35:14 - ? [310] 偵測到 16 個處理器和 4096 MB RAM 
  2009-02-17 15:35:14 - ? [339] 本機電腦為 TW006VATDB001,正在執行 Windows NT 5.2 (3790) Service Pack 2 
  2009-02-17 15:35:14 - ! [000] SQLServerAgent 必須能夠以系統管理員 (SysAdmin) 的身分連接到 SQLServer,但 '(未知)' 不是系統管理員 (SysAdmin) 角色的成員 
  2009-02-17 15:35:15 - ? [098] SQLServerAgent 已結束 (正常)

現象五:

資料庫伺服器上,實體記憶體配有 8GB,但實際 Sql Server 只吃到1.6 GB 左右。
打開 c:\boot.ini ,發現是如下的配置

[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Standard" /PAE /noexecute=optout /fastdetect

現象六:

據同事描述,此電腦曾經改電腦名稱。即 ServerA 換成 ServerB

因此,根據之前的經驗,下了

select @@servername

結果是 ServerA,而非改名過後的 ServerB

解決

步驟一:

參考 交通部Microsoft SQL Server 效能再進階,知道了伺服器記憶體> 4 GB,<= 16 GB, Boot.ini 除了加上/3GB的參數,還必須要再加上/PAE的參數,因此改 c:\boot.ini 成如下配置
[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Standard" /3GB /PAE /noexecute=optout /fastdetect 

步驟二:

http://msdn.microsoft.com/en-us/library/ms190730.aspx 所述,將 SqlAgent 的服務Account 加入。

image

步驟三:

根據 http://msdn.microsoft.com/en-us/library/ms143799.aspx 所說的步驟,將 ServerA 改成 ServerB。

步驟四:

重新開機。 步驟一是鐵定需要重新開機的。而步驟二與三原則上只需重起 SqlServer 的服務即可。

結論

經過了一番努力,終於完成了。而記憶體在半小時之內也吃到了 2.7 GB。
那怎麼知道 Sql Server 是尚未需要超過 2.7 GB 的記憶體,還是再也吃不了更多的記憶體呢?
此時 Performon counter 就發揮作用了。效能物件 SQL Server:Memory Manager,計數器 Target Server Memory。此計數器描述伺服器曾經需要的伺服器記憶體大小。如果此值大於實體記憶體,就代表記憶體不足。

沒有留言:

Share with Facebook