**以網域帳號~*執行服務
在Windows 2008R2自動啟動失敗!!* & *~*SQL 2008/ Windows 2008 之 MSDTC Notices*&**關機時---
---出現taskhost window~?!********
**SQL 2008 R2安裝於Windows 2008 R2上,當SQL服務設定使用網域--
--使用者帳號執行,啟動類型設為"自動",則在重開機時會出現以下錯誤,
導致無法自動啟動 :
SQL Server (MSSQLSERVER) 服務無法啟動,因為下列錯誤:
這個帳戶名稱不正確或不存在,或指定的帳戶名稱密碼不正確。
若將服務設定為"自動 (延遲開始)"[英文為Automatic (Delayed Start)],
或改用本機帳號,則可避開上述問題。但同樣的設定,
在Windows 2003 R2上則不會有錯。 由於近幾年OS、DB玩得不多,
初步了解狀況後,當下立即決定"閃開!**!!
**環境實測,設定網域帳號 + 自動啟動並不會導致SQL Server啟動失敗,
所以此問題應另有隱情。原本懷疑硬體規格、網路環境等因素導致系統中--
--某些服務就緒時機不同,而SQL Server啟動時所依賴的某個服務
(猜與網域身份認證有關)尚未準備好,因此無法完成網域帳號身份認證,
導致啟動失敗
****
**"自動 (延遲開始)"並不是【SQL組態管理員】---
---(Sql Server Configuration Manager)的選項,懷疑是直接由服務---
---管理介面設定的(犀利推論),並建議由組態管理員統一設定較好
**~!
***設定網域帳號時,習慣用的是user @domain.com 格式,而SQL組態管理員--
--則將其轉成domain\user格式,如此自動啟動便可順利完成。
而若用服務管理員將其改回user @domain.com格式,就會再度引發自動--
--啟動時帳號身份認證失敗,由此推論網域帳號的表示法是關鍵。
綜合以上的結果,我推測解析user @domain.com資料時需要額外服務,
而此服務在"自動 (延遲開始)"啟動階段才會備妥,因而導致前述問題;
而延遲開始是Vista/Win7/Win2008起加入的新特性,將一些啟動耗時--
--且非立即必要的服務晚一點再啟動,以加快Windows開機速度,
這或許解釋了Win2003與Win2008的測試結果不同 ***^^
***SQL 2008啟動分散式交易的時機改變***^^
***只要不是用同一個SqlConnection物件執行查詢,即便連線字串完全相同,
SQL 2005也會啟用分散式交易,所以在Mini C# Lab MSDTC測試中,
就用了這點特性故意引發分散式交易進行測試。但今天被騙很慘,
使用Mini C#測試看來MSDTC正常,但Web程式卻一直傳回分散式交易失敗!~!
追了一陣子才赫然發現,原來SQL 2008的LTM容忍度變大了,
即便使用不同的SqlConnection,只要連線字串相同,
還是適用LTM! 所以我一直用歪尺在量東西,難怪世界是歪的。
因此,我決定修正Mini C# Lab MSDTC的程式碼,加入---
cnStr += "Application Name=" + Guid.NewGuid().ToString(); 故意造成連線字串永遠不會相同來避開SQL 2008的LTM,並且在結果中顯示Transaction.Current.TransactionInformation.DistributedIdentifier以協助--
--確認有動用到MSDTC!
*~!!**
****
using System;
- using System.Data;
using System.Data.SqlClient;
- using System.Transactions;
//REFDLL System.Data;System.Xml;System.Transactions
-
public class CSharpLab
- {
private static void querySqlServer()
- {
string cnStr = "Data Source=MyServer;User
Id=MyUser;Password=MyPwd;";
- cnStr += "Application Name=" + Guid.NewGuid().ToString();
using (SqlConnection cn = new SqlConnection(cnStr))
- {
SqlCommand cmd = new SqlCommand
("SELECT getdate() as D", cn);
- cn.Open();
SqlDataReader dr = cmd.ExecuteReader();
- dr.Read();
Console.WriteLine(dr["D"]);
- cn.Close();
}
- }
public static void Test()
- {
using (TransactionScope tx=new TransactionScope())
- {
querySqlServer();
- querySqlServer();
Console.WriteLine(Transaction.Current.
TransactionInformation.
LocalIdentifier);
- Console.WriteLine(Transaction.Current.TransactionInformation.DistributedIdentifier);
tx.Complete();
- }
}
- }
- 新的執行結果如下,如果發現最後一組GUID是00000000-0000-0000-
- 0000-000000000000代表分散式交易根本沒有啟動,
- 千萬不要被結果給騙了!!
Built successfully in 323ms!
Prepare to run...
==================================================
11/8/2010 12:57:00 PM
11/8/2010 12:57:00 PM
c59168c5-dc86-4ca5-be5e-316af2da7521:32
00000000-0000-0000-0000-000000000000
==================================================
Execution time: 8 ms
- 啟用MSDTC的狀況下,兩組GUID應該都要有值才合理 !
Built successfully in 324ms!
Prepare to run...
==================================================
11/8/2010 12:59:35 PM
11/8/2010 12:58:36 PM
c59168c5-dc86-4ca5-be5e-316af2da7521:33
df4f40aa-9d43-4b86-b64d-4afbabfd22c3
==================================================
Execution time: 67 ms
- Windows 2008 防火牆Issue發現MSDTC不通後,又匆忙找原因。
- 最後發現問題出在防火牆設定,
- 預設MSDTC是被關閉的 !
- 啟用後,終於解除了Windows 2008 R2 MSDTC的封印,Wooh```~~~
&&&
**關機時出現taskhost window~?!**
***建議可以先做一次停用第三方軟體試試看。
步驟如下:
1.在傳統桌面模式,使用Windows 鍵+R鍵,
叫出「執行」,並輸入「msconfig」,點選確定。
2.在「系統設定」,選擇「服務」頁面,將下方--
--「隱藏所有Microsoft服務(H)」選項打勾。
3.將所有的第三方軟體前方的選項打勾,
點選「全部停用」,在選擇「確定」。
4.在系統設定中,將「不要再顯示這個訊息」--
--的選項打勾,點選「重新啟動」讓設定生效。
5.重新啟動後,確認電腦是否會發生相同問題。
如果還是一樣的話請開啟命令提示字元,
輸入 * net stop wuauserv及net start wuauserv *
將Windows Update重新啟動試試看***^^
&&&&
****
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&