 TechNet Magazine March 2007

TechNet Magazine March 2007

SQL Server: 診斷索引健全狀況的新工具

若要發揮 SQL Server 的最佳效能，就必須看管和維護索引健全狀況。新的動態管理檢視與函數可以讓您窺視 SQL Server 內部，以便進一步了解索引的運作方式，並且探究潛在的效能問題。

Randy Dyess SQL Server: 實現 SQL Server 的高可用性

SQL Server 2005 提供了複寫、叢集、記錄傳送等選項，以改進資料庫的可用性。我們會仔細檢視用來設定 SQL Server 的各種選項，並幫助您了解哪些選項適合您的環境。

Zach Nichter SQL Server: 使用資料表資料分割簡化資料庫維護

在過去，使用資料分割和大型資料表是麻煩而瑣碎的工作，但有了 SQL Server 2005，資料表分割就簡單多了。現在，您可以輕易建立多個資料分割、任意移動那些資料分割、卸除舊的資料分割、甚至變更資料分割的方式。以下是做法。

Noah Gomez SQL Server: SQL Server 叢集的最佳提示

伺服器叢集提供容錯移轉功能，確保您的關鍵作業可更穩定的執行。但是叢集必須正確地實作才有用。以下是一些重要的提示，可幫助您讓叢集更快就緒，並維持可靠的運作。

Tom Moreau, PhD Windows 系統管理: 深入探索 Windows Vista 核心：第二篇

這個月我們要繼續深入討論 Windows Vista 核心中的新增功能。我們要在本篇中檢閱 Windows Vista 如何管理記憶體的一些演進，並且探討系統啟動、關機及電源管理等領域。

Mark Russinovich 編輯的話: 獎盃櫃

Joshua Trupin 工具箱: 適合 IT 專家的新產品

Greg Steen 公用程式焦點: SyncToy

Jay Munro SQL 問題與解答: 日光節約時間、伺服器記憶體…等等

Edited by Nancy Michell The Cable Guy: DHCPv6 通訊協定

Joseph Davies Windows Powershell: 變數的效用

Don Jones 嗨，Scripting Guy！: 只要 5 分錢…就能為您回答 OU 相關問題

The Microsoft Scripting Guys Exchange 佇列問題與解答: 交易記錄檔、Cmdlet、遠端管理…等等

KC Lemson and Nino Bilic 安全性監控: 部署 EFS：第二篇

John Morello 桌面檔案: PsTools 入門

Wes Miller Inside Microsoft.com: 資料庫鏡像快速入門

Saleem Hakani 現場筆記: 門診開始

Matt Hester Windows 機密文件: 大智若愚

Raymond Chen


 SQL Server: 診斷索引健全狀況的新工具
SQL Server Randy Dyess

診斷索引健全狀況的新工具
摘要:
  • 索引片段
  • 索引使用方式
  • 索引作業活動
下載本文程式碼: DyessSQLIndex2007_03.exe (151KB)

所有可最佳化 SQL Server 效能的項目當中，最主要的項目之一是要在資料庫內微調索引。SQL Server 查詢最佳化工具在執行查詢期間是否可正確使用索引，除了端賴建立有效的索引之外，
還必須仰賴索引的健全狀況。SQL Server™ 2005 推出的一系列動態管理檢視 (DMV) 和動態管理函數 (DMF)，有助於資料庫管理員判斷索引的效能，並找出所有效能問題。
DMV 和 DMF 可供您深入探究伺服器，並利用伺服器狀態傳回的資訊，幫助您監視伺服器執行個體的健全狀況與效能，同時診斷問題。熟悉舊版 SQL Server 的資料庫管理員不難發現，這些 DMV 和 DMF 可用於取代 DBCC 命令、執行某些系統預存程序、查詢諸多系統資料表，以及使用 SQL Profiler 擷取事件。
三個主要的函數與檢視分別為 sys.dm_db_index_physical_stats、sys.dm_db_index_usage_stats 及 sys.dm_db_index_operational_stats，可用來協助您了解索引是否根據預期的方式運作。這些函數與檢視可供您檢閱索引的 I/O 與鎖定模式，同時可了解查詢最佳化工具運用索引的方式，是否會造成資料庫中不必要的問題。

索引片段
建立 sys.dm_db_index_physical_stats DMF 是為了取代 DBCC SHOWCONTIG，並且會顯示出索引的片段。然而不同的是，DBCC SHOWCONTIG 會將共用鎖定 (S) 置於包含索引的資料表中，而 sys.dm_db_index_physical_stats 只會放置目標共用鎖定 (IS)，大幅減少函數執行時的資料表封鎖情形。
若要使用 sys.dm_db_index_physical_stats 來判斷索引片段，您必須在函數的輸出中，檢查三個資料行的組合。索引邏輯片段 (堆積範圍片段) 可藉由檢查 avg_fragmentation_in_percent 資料行傳回值來判斷。邏輯片段是指索引分葉層級中頁面次序不對的百分比，而範圍片段則是指索引分葉層級中範圍次序不對的百分比。 邏輯和範圍片段可能會導致更頻繁的 I/O 和磁碟讀寫頭的移動，因而影響索引效能，因為磁碟讀寫頭必須跳來跳去，才能按照順序讀取頁面資料。您應該努力維持邏輯和範圍的片段都盡量趨近於零。
索引的內部片段是頁面飽和度的百分比。你當然希望索引頁面愈飽和愈好，但是又需要在飽和度與索引頁面插入數量之間取得平衡，才能維持最低的頁面分割數目。
sys.dm_db_index_physical_stats 的 avg_page_space_used_in_percent 引數，需要經過檢查以判斷索引頁面的飽和度。若要正確設定此數字與百分之百的差距，請調整索引的填滿因數，同時監看出現的頁面分割數目。到了臨界點，頁面分割的數目會急遽增加，這表示索引的填滿因數設定過高。調整索引的填滿因數很花時間，而且還需要測試，因此請不要在未經確實計劃之前就採取行動 (沒有隨機插入的索引可以將其填滿因數設定為 100，也不必擔心頁面分割數目會增加)。
若要判斷 AdventureWorks.HumanResources.Employee 資料表中所有索引的片段程度，您可以使用如下的陳述式：
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,OBJECT_ID('HumanResources.Employee')
,NULL
-- NULL to view all indexes;
-- otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') -- We want all information
利用此 DMF 即可自動判斷出哪些索引需要重新建立、哪些需要重新組織，以及哪些不需要維護。檢查此 DMF 中 avg_page_space_used_in_percent 和 avg_fragmentation_in_percent 資料行的值，即可找出落在可接受邏輯與密度臨界值以外的索引片段，這有助於您判斷需要在索引上執行哪一種作業。
視您的索引狀態而定，[圖 1] 中顯示的範例可能不會傳回 AdventureWorks 範例資料庫副本中的資料，但是這可以進行調整，以運用在其他資料庫上。
Figure 1 檢查頁面飽和度與片段程度 (Close Figure 1)
--Reorganize the following indexes in the AdventureWorks database
USE AdventureWorks
GO

SELECT OBJECT_NAME([object_id]) AS 'Table Name',
index_id AS 'Index ID'
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,NULL -- NULL to view all tables
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') --We want all information
WHERE ((avg_fragmentation_in_percent > 10
AND avg_fragmentation_in_percent < 15) -- Logical fragmentation
OR (avg_page_space_used_in_percent < 75
AND avg_page_space_used_in_percent > 60)) --Page density
AND page_count > 8 -- We do not want indexes less than 1 extent in size
AND index_id NOT IN (0) --Only clustered and nonclustered indexes

--Rebuild the following indexes in the AdventureWorks database
USE AdventureWorks
GO

SELECT OBJECT_NAME([object_id]) AS 'Table Name',
index_id AS 'Index ID'
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,NULL -- NULL to view all tables
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') --We want all information
WHERE ((avg_fragmentation_in_percent > 15) -- Logical fragmentation
OR (avg_page_space_used_in_percent < 60)) --Page density
AND page_count > 8 -- We do not want indexes less than 1 extent in size
AND index_id NOT IN (0) --Only clustered and nonclustered indexes
比較簡單的方法，是將查詢結果儲存到資料表變數中，接著在資料表變數中進行迴圈，以便為正確的 ALTER INDEX 陳述式建立動態字串 (請參閱 [圖 2])。
Figure 2 建立動態 ALTER INDEX 字串 (Close Figure 2)
--Rebuild the following indexes in the AdventureWorks database
USE AdventureWorks
GO

--Table to hold results
DECLARE @tablevar TABLE(lngid INT IDENTITY(1,1), objectid INT,
index_id INT)

INSERT INTO @tablevar (objectid, index_id)
SELECT [object_id],index_id
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,NULL -- NULL to view all tables
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') --We want all information
WHERE ((avg_fragmentation_in_percent > 15) -- Logical fragmentation
OR (avg_page_space_used_in_percent < 60)) --Page density
AND page_count > 8 -- We do not want indexes less than 1 extent in size
AND index_id NOT IN (0) --Only clustered and nonclustered indexes

SELECT 'ALTER INDEX ' + ind.[name] + ' ON ' + sc.[name] + '.'
+ OBJECT_NAME(objectid) + ' REBUILD'
FROM @tablevar tv
INNER JOIN sys.indexes ind
ON tv.objectid = ind.[object_id]
AND tv.index_id = ind.index_id
INNER JOIN sys.objects ob
ON tv.objectid = ob.[object_id]
INNER JOIN sys.schemas sc
ON sc.schema_id = ob.schema_id

索引使用方式
雖然 sys.dm_db_index_physical_stats 的功能強大且可以取代 DBCC SHOWCONTIG，同時有助於顯示出索引的健全狀況，但您仍然經常必須面對更複雜的問題，亦即需要判斷哪些索引適用於針對資料表所執行的查詢。通常資料庫開發人員或管理員會在資料表中，建立他們認為查詢最佳化工具會在執行查詢時使用的索引。要在舊版的 SQL Server 中得知是否實際使用這些索引，可說是難上加難。因為若不是得卸除索引，看看查詢效能是否受到影響，否則就是要擷取查詢的執行計劃，掃描索引的使用方式。
然而全新的動態管理檢視 sys.dm_db_index_usage_stats，可以讓您輕鬆了解在查詢最佳化工具以及針對資料表執行的查詢中，索引的實際使用情形。檢查此檢視即可判斷出索引的效益，讓您卸除任何查詢最佳化工具未使用的索引。您不再需要擔心索引是否只是在浪費儲存空間，也不必憂慮未使用的索引維護工作是否降低了資料庫效能。
只要以搜尋和掃描零的方式檢查此索引的 DMV 輸出，就能判斷出某索引在上次啟動 SQL Server 之後，是否曾經使用過。不過請記住，有許多 DMV 和 DMF 無法保存，每次重新啟動 SQL Server 就會歸零。在使用 DMV 或 DMF 來判斷索引使用方式的時候，請將這一點納入考量。有可能只是從上次重新啟動服務之後，還不需要使用該索引，但是到了週末、月底或每季報告查詢時，可能就需要用到該索引。
若要檢視自從上次重新啟動 SQL Server 服務之後，執行個體中尚未使用的所有索引，您可以利用下列陳述式：
SELECT DB_NAME(database_id),OBJECT_NAME([object_id])
FROM sys.dm_db_index_usage_stats
WHERE user_seeks = 0
AND user_scans = 0
AND user_lookups = 0
AND system_seeks = 0
AND system_scans = 0
AND system_lookups = 0

索引作業活動
如果您想了解索引的作業活動，sys.dm_db_index_operational_stats DMF 就能派上用場。您可利用它來檢視資料庫中每個索引的 I/O、鎖定、閂鎖和存取方法活動，以幫助您了解索引的使用方式，並診斷是否有大量 I/O 活動或「熱門」索引的存在，而造成索引鎖定的問題。
使用此 DMF 的閂鎖等候資料行，即可協助建立讀取和寫入作業在取得索引資源存取權時，所花費的時間量。這可幫助您判斷用來儲存索引的磁碟子系統，是否足以負荷該索引的 I/O 活動。此外，這還能指出索引的設計與使用，是否會造成索引過於「熱門」，使得索引中一頁或多頁的大量活動，造成這些頁面資料的存取產生瓶頸。這種問題通常會導致過度封鎖，而無法讀取或寫入此區域。
[圖 3] 顯示如何判斷 AdventureWorks.HumanResources.Employee 資料表中，所有索引的鎖定與 I/O 模式。
Figure 3 判斷鎖定與 I/O 模式 (Close Figure 3)
SELECT page_latch_wait_count --page latch counts
,page_latch_wait_in_ms --page latch wait times
,row_lock_wait_in_ms --row lock wait times
,page_lock_wait_in_ms --page lock wait times
,row_lock_count --row lock counts
,page_lock_count --page lock counts
,page_io_latch_wait_count --I/O wait counts
,page_io_latch_wait_in_ms --I/O wait times
FROM sys.dm_db_index_operational_stats (DB_ID('AdventureWorks')
,OBJECT_ID('HumanResources.Employee')
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
)

了解其他資訊
本文中提及的 DMV 和 DMF 除了上述功能之外，還有許多其他用途。請參考 [其他資源] 資訊看板中所提及的 SQL Server 線上叢書，包括說明這些函數和檢視的文章，以便了解各種可用來傳回和檢查的資訊。
若要學習本文中未探討的其他索引 DMF 和 DMV，請參閱 SQL Server 查詢最佳化小組的部落格文章，網址為 blogs.msdn.com/queryoptteam/570176.aspx。
其他資源
  • sys.dm_db_index_physical_stats
  • sys.dm_db_index_usage_stats
  • sys.dm_db_index_operational_stats

Randy Dyess 是 Solid Quality Learning 的顧問，專精於 SQL Server OLTP 系統。Randy 也是眾多 SQL Server 相關書籍和文章的作者。他是 www.TransactSQL.Com 和 www.Database-Security.Info 網站的發起人和主要作者。
© 2007 Microsoft Corporation and CMP Media, LLC. 保留所有權利；未經允許，嚴禁部分或全部複製.


 SQL Server: 實現 SQL Server 的高可用性
SQL Server Zach Nichter

實現 SQL Server 的高可用性
摘要:
  • 鏡像
  • 資料庫快照集
  • 記錄傳送
  • 叢集
  • 複寫
下載本文程式碼: NichterHA2007_03.exe (151KB)

高可用性是每一位資料庫管理員都應該了解的概念。它是指系統的回應性和存取性。高可用性有時候表示回應時間必須在數秒之內，有些情況的回應時間則需要

快到幾分之一秒。我曾經擔任過顧問的一家公司，其 Web 伺服器要求 SQL 查詢的來回時間要以毫秒為單位；如果回應時間超過該限制，會認為資料庫系統當機，而 Web 伺服器就會重新連接下一個可用的資料庫伺服器。
由於使用者不斷要求更快的應用程式，所以知道如何達成高可用性和快速回應時間，可幫助您更聰明地規劃相依於資料的應用程式。
還好 SQL Server™ 2005 有許多改進可用性的選項，包括複寫、叢集、資料庫鏡像、資料庫快照集和資料庫記錄傳送。我會探討這些功能，提供一些看法，讓您了解如何決定適合您環境的功能。讓我們先從 [圖 1] 開始，其中說明 SQL Server 2005 的可用性選項。
Figure 1 高可用性選項 (Close Figure 1)

技術屬性 | 複寫 | 資料庫鏡像 | 叢集 | 資料庫快照集 | 記錄傳送
高可用性選項 |  |  |  |  |
容許高交易需求 |  |  |  |  |
即時資料可用性 |  |  |  |  |
資料映像為唯讀 |  |  |  |  |
唯一硬體組態 |  |  |  |  |
低成本 |  |  |  |  |
提供資料復原 |  |  |  |  |
自動容錯移轉 |  |  |  |  |
實作/管理可能較為複雜 |  |  |  |  |
可能要注意的效能考量 |  |  |  |  |

定義高可用性
在規劃高可用性應用程式時，首要目標之一，就是要定義高可用性在您環境中代表的意義。對於某些組織而言，高可用性表示必須有相當於實際執行硬體的備援硬體，需要資料和硬體都達到 99.995% 以上的正常運作時間和可用性。有些組織只需要資料本身隨時可用，萬一需要容錯移轉時，對於實際執行層級效能較不在乎。在判斷適合您的解決方案時，高可用性的定義很重要。
您也需要識別可能遭遇到的運轉中斷類型，並指出它們對於服務等級協定 (SLA) 有何影響。會影響可用性的運轉中斷類型包括：計劃中的運轉中斷、非計劃中的運轉中斷，以及過低的執行效能。
計劃中的運轉中斷通常是排定的維護時間，系統使用者會事先接獲通知。非計劃中的運轉中斷通常是硬體或軟體失敗的結果，造成資料無法存取。過低的執行效能也會造成運轉中斷，通常是以一般使用者回應時間來衡量，標準則是由企業和 IT 組織以某種形式的 SLA 事先達成共識。
除了識別運轉中斷的可能原因之外，您還必須決定資料的活動層級，亦即是否一定要維持在線上、僅有時候需要在線上，或是可以離線。您也必須決定可用性選項 (備援系統) 要架設在相同地理位置或遠端位置。預算限制在您的決策中也可能扮演一定的角色。現在我們來看看每一個可用性選項。

資料庫鏡像
在探究資料庫鏡像之前，我應該先定義術語。
主體 (Principal) 是存放資料庫的主要實際執行伺服器，它會將其交易記錄檔連續傳送到鏡像伺服器和資料庫。
鏡像 (Mirror) 是存放資料庫備份副本的次要伺服器。鏡像副本與主要資料庫會持續同步處理。
角色 (Role) 指出特定伺服器的用途 -- 亦即做為主體或鏡像。
見證 (Witness) 是在主體伺服器和鏡像伺服器執行任務時，用於監督它們的執行個體，而且可起始自動容錯移轉。
夥伴 (Partner) 可以是主體伺服器或鏡像伺服器。
在一般環境中，主體資料庫會備份在主體執行個體上，備份則會在鏡像執行個體上還原 (請參閱 [圖 2])。還原資料庫之後，必須使用 SQL Server Management Studio (SMSS) 中的主體資料庫屬性視窗，或使用 T-SQL 指令碼，在主體伺服器上設定鏡像。
Figure 2 Database mirroring architecture
Figure 2 Database mirroring architecture
在設定鏡像及建立鏡像工作階段之後，主體資料庫和鏡像資料庫將同步處理。然後主體資料庫會將自從上一次在鏡像伺服器上套用備份之後，所發生的事件之交易記錄檔傳送給鏡像伺服器。鏡像伺服器將接收此記錄檔，並嘗試儘快套用它。如果您使用 SQL Server 2005 Enterprise Edition，則此處理序為多執行緒；否則，它是單一執行緒作業。當這些記錄檔套用至鏡像之後，即達到資料庫的同步處理，並且會保持同步處理，直到鏡像工作階段中斷為止。
當用戶端執行新交易時，主體伺服器會對主體資料庫執行交易，同時從主體資料庫傳送交易記錄檔記錄至鏡像資料庫的重做記錄檔或記錄檔佇列，以便由鏡像套用至鏡像資料庫。在鏡像資料庫上套用並認可交易之後，會傳送回覆至主體，宣告該交易已在鏡像上認可。主體從鏡像接收到認可之前，不會確認其他系統接收到的新交易。
萬一失敗，鏡像可起始自動失敗，並由見證伺服器判斷主體資料庫是否可用，以支援該程序。萬一發生失敗，在鏡像夥伴可重新變成主體的夥伴之前，必須先解決鏡像夥伴的問題。在解決鏡像夥伴的問題之後，系統就會恢復鏡像夥伴的角色，且資料庫會再度同步處理。同步處理之後，鏡像工作階段就可以重新開始。
此特定鏡像模式為高安全模式，其中會開啟交易安全性來提供同步交易作業，但它不需要見證伺服器，因為它不利用自動容錯移轉；所有容錯移轉都是以手動方式起始。另一種類型的鏡像模式則提供同步交易作業，即高可用性模式。其中不但要求開啟交易安全性，而且還要求使用見證伺服器，以便在失敗時進行自動容錯移轉。
第三種，也是最後一種鏡像模式為高效能模式。其中要求關閉交易安全性，以進行非同步作業支援，此支援讓主體夥伴的交易能夠進行認可，而不必等待交易記錄寫入鏡像。高效能模式不需要組態中有見證伺服器。
請注意，鏡像功能需要主體和鏡像都執行同一個 SQL Server 版本，但見證伺服器則不一定要使用同一個版本，亦即可以是 SQL Server Express Edition。此外，主體資料庫必須處於完整復原模式。
ADO.NET 2.0 與 SQL Server 2005 整合在一起，並包括支援資料庫鏡像的能力，以及為應用程式提供鏡像環境的透明容錯移轉。如此一來，萬一無法建立主體資料庫的連線時，ADO.NET 應用程式才能夠自動容錯移轉，而不需要編寫其他程式碼或組態。組態設定很簡單，只要在兩個環境之間指定共同使用者，並在連線字串中指定容錯移轉夥伴即可。以下是 ADO.NET 連線字串的範例，其中可識別鏡像資料庫環境的容錯移轉夥伴：
"Provider=SQLNCLI.1;Data Source=MirrorDB;Failover Partner=SQL03;
 Initial Catalog=AdventureWorks;
Persist Security Info=True;User ID=TestUser; Password=TestPswd; Pooling=True;
Connect Timeout=5;Application Name=ADOMirrorTest"
視您的應用程式和資料需求而定，資料庫鏡像可能是貴公司的理想選項，但要達到最佳效能，仍有許多因素需要考量。例如，系統的交易速率有多高，亦即資料的變更量有多大？在考量資料庫鏡像時，一定要先判斷是否有足夠的頻寬和網路速度，以處理資料量和交易處理速率。同時也要考量連結的飽和度。尤其如果鏡像是在不同的地理位置時，這點特別重要。您必須事先監視系統，以判斷是否有任何環境限制會防止鏡像的有效運作。
尤其當您希望降低成本時，資料庫鏡像更是一個理想的選項。事實上，資料庫鏡像架構不需要共用磁碟，也不需要進階或特殊技巧，就可以執行環境。和叢集不同，資料庫鏡像並不需要兩個夥伴都具備相同硬體。而且，使用 [資料庫屬性] 視窗的 [鏡像] 索引標籤上的 [安裝精靈]，即可輕易實作鏡像 (請參閱 [圖 3])。我也建議您閱讀 Database Mirroring Best Practices and Performance Considerations 白皮書 (go.microsoft.com/fwlink/?LinkId=80897)，以取得更多有用資訊。
Figure 3 Mirroring setup wizard
Figure 3 Mirroring setup wizard

資料庫快照集
資料庫快照集是 SQL Server 2005 Enterprise Edition 所提供的新技術，但不算是高可用性的選項。資料庫快照集與其他技術一起使用時，應該做為復原或可行性報告選項使用。快照集就是資料庫在特定時間點的唯讀檢視。
快照集是使用如下的 CREATE DATABASE 命令所建立：
CREATE DATABASE SnapDB_20061028_2030 ON
(NAME = SnapDB_Data, FILENAME =
    'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\SnapDB_20061028_2030.snp')
AS SNAPSHOT OF SnapDB;
GO
建立資料庫快照集時，它會使用一個或多個檔案，稱為疏鬆檔案，而非一般資料庫使用的資料檔案。這些疏鬆檔案基本上是虛擬保留位置，一開始並不佔用任何資料。唯有當來源資料庫中的資料變更或刪除時，才會使用它們來保留資料。資料會一次以一個資料頁地寫入至疏鬆檔案，而實際的資料庫快照集只會顯示自從產生快照集之後所變更的資料。其餘資料是來自來源資料庫的資料頁。
產生快照集時，資料庫快照集檔案會依資料庫大小進行配置。您無法從配置大小得知其中實際保留有多少資料。若要取得此資訊，請執行如下的 T-SQL 陳述式：
SELECT *
FROM fn_virtualfilestats(DB_ID(N'SnapDB_20061028_
    2030'), 1);
GO

由於資料儲存在疏鬆檔案和來源資料庫的方式，存取資料庫快照集時，會同時擷取原始資料庫資料檔案中的資料頁以及快照集的疏鬆檔案中的資料頁。因為有共用資料頁的需求，所以快照集只能存留在產生快照集的來源資料庫所在的伺服器上。此架構未能減輕來源資料庫上的 I/O，所以快照集不是值得使用的有效報告選項，因為它們並未代表資料庫的真正狀態。
讓我們探討同時使用資料庫鏡像與快照集的案例。這樣可讓報告資料、鏡像和快照集資料庫與主體資料庫實體分開。資料庫快照集是使用 SQL Server Agent 和自訂指令碼進行排程，在固定的時間間隔會重新整理快照集。[圖 4] 中的範例指令碼顯示用來完成此動作的預存程序。它是設計在工作內使用，用於環境內管理特定資料庫快照集之建立及卸除。這樣可產生可接受的報告解決方案，因為報告資料會與實際執行資料隔離。
Figure 4 快照集排程的預存程序 (Close Figure 4)
use msdb;
GO
set nocount on
GO

CREATE PROCEDURE usp_snaprefresh
     @database    sysname = NULL    --name of the database to snapshot
    ,@keepsnap    int        = 24   --# of hours to keep a snapshot
                                    --after it was created
                                    --use a value of '0' to keep all
                                    --existing snapshots
    ,@fileloc    sysname            --location for snapshot
        = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\'
AS

DECLARE
     @dt            datetime        ,@cnt          int
    ,@databaseid    int             ,@snap         sysname
    ,@sql           nvarchar(1000)  ,@yy           varchar(4)
    ,@mm            varchar(2)      ,@dd           varchar(2)
    ,@h             varchar(2)      ,@m            varchar(2)
    ,@lname         sysname         ,@pname        sysname
    ,@file          sysname         ,@pos1         int
    ,@pos2          int

-- initialize variables
SELECT
     @dt = getdate()
    ,@cnt = 0, @pos1 = 0, @pos2 = 0
    ,@databaseid = db_id(@database)

-- check if valid database was provided
IF @databaseid IS NULL
BEGIN
    RAISERROR ('Missing database name. Rerun the procedure specifying a
       valid database name.',16,1)
    RETURN (0)
END

--determine if snapshots should be kept
IF @keepsnap <> 0
BEGIN
    -- determine if other snapshots exist for this server older than @
    -- keepsnap value hrs
    SELECT ROW_NUMBER() OVER(ORDER BY name DESC) AS [RowNum],
        name INTO #t1
    FROM master.sys.databases
    WHERE source_database_id = @databaseid
        AND create_date < dateadd(hh,-(@keepsnap),getdate())

    IF (SELECT max(RowNum) FROM #t1 where name is not null) > 0
    BEGIN
        WHILE @cnt <= (SELECT max(RowNum) FROM #t1)
        BEGIN
            SELECT @snap = name FROM #t1 WHERE RowNum = @cnt

            PRINT 'Dropping snapshot ''' + @snap + ''''

            SET @sql = 'DROP DATABASE ' + @snap

            EXEC(@sql)
            SELECT @cnt = @cnt + 1
        END
    END
END

-- break apart point in time date time information for file name
SELECT @yy = convert(varchar(4),year(@dt)),@mm = convert(varchar(2),
   month(@dt))
    ,@dd = convert(varchar(2), day(@dt)),@h = convert(varchar(2),
         datepart(hh,@dt))
    ,@m = convert(varchar(2), datepart(mi,@dt))

-- piece together the database snapshot name and the file name
SELECT @file = @database + '_' + @yy + @mm + @dd + '_' + @h + @m

-- identify logical file name of primary data file
SET @sql = 'SELECT name INTO tempdb..t1
FROM ' + @database + '.sys.database_files
WHERE file_id = 1'

EXEC(@sql)

--setting logical filename for the snap
SELECT @lname = name FROM tempdb..t1

-- making sure the file location ends with '\'
IF substring(@fileloc, len(@fileloc), 1) <> '\'
BEGIN
    SET @fileloc = @fileloc + '\'
END

-- build sql statement to be run
SET @sql = N'CREATE DATABASE ' + @file + ' ON
(NAME = ' + @lname + ', FILENAME = ''' + @fileloc + @file + '.snp'')
AS SNAPSHOT OF ' + @database

EXEC(@sql)

-- cleanup
DROP TABLE tempdb..t1;
GO
不過請記住，資料庫快照集是暫時的，因為快照集無法備份，且若沒有來源資料庫就無法存在。如果疏鬆檔案的空間不夠，就會認為快照集毀損而必須加以卸除。
此外，使用資料庫快照集時系統效能會降低，是因為在來源資料庫上修改資料期間，資料頁會寫入來源資料庫資料檔之每一個快照集的疏鬆檔案中，而且寫入次數還要乘以資料庫含有的快照集數量。
讀取權是由來源資料庫在建立快照集時所定義，無法變更。快照集必須位於與來源資料庫相同的執行個體中，因為它們共用資料頁及相同的緩衝區快取。
唯有當您也使用鏡像時，才應該考慮使用快照集做為報告解決方案；否則，對於環境的效能沒有助益。在系統上執行可能有問題的作業之前，資料庫快照集或許是保留資料的最快方式。資料庫可還原為快照集的狀態，或從快照集內取出資料來取代來源資料庫中的資料。
您需要決定快照集資料庫的命名標準。我使用的標準是 originaldatabasename_date_time.snp。它先指定來源資料庫，然後指定產生快照集的日期和時間 (使用 24 小時制)。

記錄傳送
記錄傳送是有限的高可用性選項，它利用備份和復原來建立成本低廉的解決方案。記錄傳送會在排定的時間間隔利用交易記錄備份，使次要資料庫保持在最新狀態。
SQL Server 2005 中的記錄傳送會使用精靈來進行安裝、排程、初始化及監督的程序 (請參閱 [圖 5])。此程序很簡單，只要幾分鐘即可完成。
Figure 5 Log shipping setup wizard
Figure 5 Log shipping setup wizard

在識別主要資料庫之後，會建立排程以及判斷備份檔案的檔案存在時間。接下來，必須建立備份檔案的檔案共用。在安裝檔案共用之後，必須建立次要資料庫檔案位置，且必須完成主要資料庫的還原來初始化資料庫。最後，必須為備份檔案的副本以及交易記錄檔備份的還原設定排程，並為每一個步驟設定所需的警示或延遲。
完成安裝之後，記錄傳送會定期將資料庫的交易記錄檔備份到共用網路位置。當檔案傳送到共用之後，備份會依設定排程套用到次要資料庫。
記錄傳送因為很簡單，所以在許多情況中都可以順暢運作。它是高可用性的理想選項，因為成本低廉且適用於高交易量的系統。運用在記錄傳送中的次要資料庫可使用於唯讀模式，所以對報告資料庫很方便。記錄傳送的負荷低，但萬一處理失敗，則必須使用警示原則。
如果您想要在環境中使用記錄傳送，考量因素包括其安裝和管理的簡易性，以及這不需要特殊技能。不過，雖然記錄傳送可以與資料庫鏡像合併而成為高可用性解決方案，但它並不是一個即時高可用性解決方案。它會受限於排程以及備份、檔案複製及還原之類的作業。它也需要手動容錯移轉。基於這些原因，記錄傳送僅能為不那麼重視時間需求的環境提供簡單的解決方案。

SQL Server 叢集
伺服器叢集會在 OS 層級運作，其中涉及重複的硬體及共用磁碟資源，以供叢集存取。對一般使用者而言，叢集可能是最不影響正常作業的，但也可能是成本最高的。它需要的硬體數量至少是執行非叢集執行個體所需數量的兩倍以上。
叢集的主題牽涉很廣，因此，我不在這裡探究所有細節，只會提供一個概觀。叢集需要兩部以上的伺服器，它們全部都必須安裝同一版的 Windows® 2000 Advanced Edition 或 Datacenter Edition，或 Windows Server® 2003 Enterprise Edition 或 Datacenter Edition。其中也需要安裝 Microsoft® Cluster Services (MSCS)，來處理伺服器之間的共用資源擁有權，以及管理 IP 位址、共用磁碟和網路名稱。叢集也需要共用磁碟資源，通常是存放區域網路 (SAN) 或透過 SCSI 連接的儲存裝置。
SQL Server 執行個體也是資源，且 SQL Server 2005 的 Standard Edition 和 Enterprise Edition 都可以安裝在叢集組態中。如需 SQL Server 2005 支援的功能清單，請參閱 Feature Comparison Chart for SQL Server 2005 (microsoft.com/sql/prodinfo/features/compare-features.mspx)。
在叢集上建立資源之後，叢集的次要節點會透過在叢集中兩個節點之間的私人網路上建立的活動訊號，與叢集的主要節點定期保持通訊。活動訊號是間隔檢查點，用來判斷主要節點是否失敗。
萬一主要節點失敗，資源會移到次要節點，同時仍保持邏輯伺服器的原來狀態。這可讓用戶端只暫停一下互動就可以繼續運作。在某些情況下，整個容錯移轉程序所花費的時間從 5 秒以下到 30 秒以上不等，視叢集需要的硬體、軟體和網路元件而定。
叢集是昂貴而複雜的技術，需要特殊技巧才能解決系統的失敗問題；不過，相較於其他任何自動容錯移轉選項，這可以為一般使用者提供最順利的容錯移轉功能。每一個應用程式都有所不同，有些應用程式可能無法感知叢集或與叢集不相容，在最壞的情況下會需要應用程式重新連接。

複寫
SQL Server 2005 複寫也可以使用於高可用性架構。它提供四種複寫類型：快照集、交易、對等式及合併。對等式實際上就是一種交易式複寫，所以我在這裡不予討論。
有了複寫，您便擁有可達到高可用性的次要站台和資料庫的選項，與主要資料庫的功能完全相同。這可使用合併式複寫來達成，它會從主要資料庫和次要資料庫取得交易，並將兩者的變更合併到對方。可想而知，此組態需要衝突解決程序。
交易式複寫的邏輯設計與資料庫鏡像十分類似。套用至主要資料庫的交易會傳送到次要資料庫，以確保環境保持一致。當交易抵達時，會套用至次要資料庫，然後等待下一筆交易套用至系統上。
快照式複寫十分類似記錄傳送，因為它們都依排定的時間間隔執行，並以大量變更的方式更新次要資料庫，不會在進行認可時就將每一筆交易套用至兩個系統。這兩種技術的利用方式大同小異。
複寫需要特殊知識，這對於沒有專屬 DBA 的環境而言是一大考量。在疑難排解方面，複寫有點複雜，如果要將它做為高可用性選項，則需要更詳盡的設計。
複寫可適度滿足高可用性解決方案的需求。此技術使用交易式複寫，在記錄層級執行有如資料庫鏡像的動作，但沒有自動容錯移轉的選項。只要有足夠的資源和一點點創造力，編寫自動容錯移轉的解決方案指令碼並不難。
和資料庫鏡像不同的是，其來源和目標資料庫完全可供用戶端應用程式存取。若使用快照式複寫，則複寫可提供與記錄傳送相同的功能。
值得注意的是，複寫技術已通過考驗且有豐富的參考文件。對於高可用性解決方案使用複寫有一些缺點，效能也是個問題，但整體而言與資料庫鏡像不相上下。您利用複寫所設計的任何高可用性選項很可能會有更複雜的架構；它不一定更先進，但一定更複雜。此外，需要考慮的其中一個最大障礙，是萬一資料庫資料表結構有所變更，或您想要新增要複寫的資料表時，您必須中斷發行並重新定義，使所做的變更能夠呈現在兩個資料庫中。

結論
現在您可以了解，要為環境建立高可用性解決方案是需要創造力的。每一項 SQL Server 2005 高可用性技術都有它的優點和缺點，各自適合不同的情況。
當主要 Web 資料庫與次要資料庫環境的地理位置分開時，高效能模式的記錄傳送、快照式複寫、甚至資料庫鏡像都是很好的選擇 (尤其如果它們不需要即時取得次要資料的話)。
相反地，如果需要存取即時資料的次要資料庫，且主要伺服器上的交易率較低，還有兩個環境站台之間的連結快速不飽和，則交易式複寫或資料庫鏡像就可以擔當重任。
同時也要考慮您對這些技術的熟悉度。如果您對這些技術已經有一些使用經驗，會比較容易上手。如果您是一位主管但沒有專屬的 DBA，請盡量避開像複寫之類較複雜的技術，因為會有許多細節造成疑難排解較為複雜。您也可以考慮聘用有經驗的 SQL Server 顧問協助您設計、實作及訓練員工，以管理適合您環境的嶄新高可用性解決方案。
如果您的組織對於高可用性的定義是，資料要隨時可用、一旦無法存取資料就會有很嚴重的後果，則叢集會是較理想的選擇。
總而言之，SQL Server 2005 所提供的嶄新選項，可以為您量身訂做高可用性解決方案，以服務不同類型的環境。單一可用性選項或許就足以符合您的需求，但您也可以選擇多項技術的組合，誠如您所見，這裡有各種不同的選擇可供挑選。

Zach Nichter 是擁有 10 年以上經驗的 SQL Server 專家。他扮演過許多 SQL Server 支援角色，包括 DBA、小組組長、經理和顧問。目前 Zach 受雇於 Levi Strauss & Co.，擔任 DBA 設計師，專注於 SQL Server 效能、監督、架構和其他策略方針。


 SQL Server: 使用資料表資料分割簡化資料庫維護
SQL Server Noah Gomez

使用資料表資料分割簡化資料庫維護
摘要:
  • 建立分割資料表
  • 新增及合併資料分割
  • 建立及管理分割索引
下載本文程式碼: GomezPartitioning2007_03.exe (156KB)

在過去，管理包含數百萬列資料之資料表的資料庫管理員被迫要建立多重資料表。將那些資料表分割之後，資料庫管理員就必須在許多查詢執行期間將
資料表重新繫結在一起。將資料分割繫結在一起需要建立檢視或包裝函式預存程序，以了解資料存放處，然後再執行另一個預存程序，以叫用傳回資料集所需的資料分割。
雖然這些方法有效，但是很麻煩。多重資料表及其索引的管理，以及用來將資料表重新繫結在一起的方法通常會造成管理和維護問題。此外，建立多重資料表來分割資料會造成某種程度失去彈性，因為預存程序、維護作業、資料轉換服務 (DTS) 作業、應用程式碼和其他處理序必須了解資料分割的本質。為了讓您能夠新增或卸除這些準資料分割而不必變更程式碼，這些元素一般是以非動態方式建立，因此沒有效率。
SQL Server™ 2005 的 Enterprise Edition 和 Developer Edition 可讓您將單一資料表中所包含的大量資料分割成多個小型資料分割，以便更有效率地管理及維護。建立可透過單一進入點存取之資料區段的能力，可減少因為舊做法而帶來的許多管理問題。使用單一進入點 (資料表名稱或索引名稱) 可在應用程式碼中隱藏多個資料區段，並讓管理員或開發人員可以在必要時變更資料分割，而不必調整程式碼基底。
簡言之，您可以建立多個資料分割、任意移動那些資料分割、卸除舊的資料分割、甚至變更資料分割的方式，而不必調整應用程式中的程式碼。應用程式碼只需要繼續呼叫相同的基底資料表或索引名稱。同時，您可以減少個別索引包含的資料量，進而減少那些索引的維護時間，並可載入空白資料分割來增加資料載入速度。
就技術層面而言，每一個 SQL Server 2005 資料表都已分割，每一個資料表至少都有一個資料分割。SQL Server 2005 的作用是讓資料庫管理員在每一個資料表上建立其他資料分割。資料表和索引資料分割是硬式定義的資料列層級資料分割 (不允許依資料行分割)，其中允許單一進入點 (資料表名稱或索引名稱)，但應用程式碼不需要知道進入點背後的資料分割數目。資料分割可存在於基底資料表中以及與資料表相關聯的索引中。

建立分割資料表
您可以使用資料分割函數和資料分割配置來建立資料表，且可以擴充預設的單一資料分割。這些物件可讓您將資料分割成特定區段，並控制那些資料區段在儲存架構中的位置。例如，您可以根據資料保留時間或使用其他一般微分器，將資料向外擴散到多個磁碟機陣列。請注意，資料表可以根據資料表的一個資料行進行分割，且每個資料分割都必須包含無法放在其他資料分割中的資料。
資料分割函數 -- 分割資料表時，第一個決策是您要如何將資料分成不同區段。資料分割函數是用來將個別資料列對應到不同的資料分割。除了 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、別名資料類型或 Common Language Runtime (CLR) 使用者自訂資料類型之外，那些個別資料列都可以對應任何類型的資料行。不過，資料分割函數必須能夠將一列資料只放到一個資料表分割-它不允許一列資料同時屬於多個資料分割。
為了分割資料表，您必須在目標資料表中建立分割資料行。第一次建立資料表時，此分割資料行可存在於資料表結構描述中，以後您也可以改變資料表及新增資料行。資料行可以接受 NULL 值，但包含 NULL 值的所有資料列預設會放在資料表最左邊的資料分割。您可以在建立資料分割函數時指定將 NULL 值放在資料表最右邊的資料分割，來避免此情況發生。當您修改資料分割結構描述及新增更多的資料分割或刪除現有的資料分割時，使用左邊或右邊資料分割是一項重要的設計決策。
建立資料分割函數時，您可以選擇 LEFT 或 RIGHT 資料分割函數。LEFT 和 RIGHT 資料分割之間的差異就是界限值將放在資料分割配置中的位置。LEFT 資料分割 (這是預設值) 會將界限值包括在資料分割中，而 RIGHT 資料分割則會將界限值放在下一個資料分割中。
若要進一步了解此概念，請看看簡單的 LEFT 和 RIGHT 資料分割：
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

CREATE PARTITION FUNCTION Right_Partition (int) AS RANGE RIGHT
FOR VALUES (1,10,100)
在第一個函數 (Left_Partition) 中，1、10 和 100 的值會分別放在第一、第二和第三個資料分割中。在第二個函數 (Right_Partition) 中，值會放在第二、第三和第四個資料分割中。
建立分割資料表時，資料分割一定要盡量平均。這可幫助您了解資料分割所需要的空間。使用 LEFT 和 RIGHT 可決定資料放置之處，進而決定資料分割大小和建立在該資料分割上的索引大小。
您可以使用 $PARTITION 函數來決定要放置資料值的資料分割編號，如下所示：
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Right_Partition (10)
在第一個 SELECT 陳述式中，結果會是 2。第二個 SELECT 陳述式將傳回 3。
資料分割配置 -- 在建立函數及決定要如何分割資料之後，您必須決定個別資料分割要建立在磁碟子系統上的位置。您可以使用資料分割配置來建立此磁碟配置。資料分割配置會利用檔案群組，將每個資料分割放到磁碟子系統上的某個位置，來管理個別資料分割的磁碟空間。您可以設定資料分割配置，將所有資料分割放在單一檔案群組中、將所有資料分割放在不同的檔案群組中，或由多個資料分割共用檔案群組。後面這個方法可讓資料庫管理員在擴增磁碟 I/O 時有很大的彈性。
[圖 1] 告訴您一些方法，讓您可以指派一個檔案群組或多個檔案群組至資料分割配置中。請注意，在建立資料分割配置之前，資料分割配置所使用的檔案群組必須已存在於資料庫中。
Figure 1 將檔案群組指派至資料分割配置 (Close Figure 1)
--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

--Place all partitions into the different filegroups
CREATE PARTITION SCHEME Different_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      TO (Filegroup1, Filegroup2, Filegroup3, Filegroup4)
--Filegroups must currently exist in database

--Place multiple partitions into the different filegroups
CREATE PARTITION SCHEME Multiple_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      TO (Filegroup1, Filegroup2, Filegroup1, Filegroup2)
--Filegroups must currently exist in database
如果您如 [圖 1] 所顯示來建立範例資料分割函數，並利用資料分割配置來建立資料表，那麼，您就可以決定個別資料列要放在新分割資料表的什麼位置。然後，在那些資料列插入分割資料表之後，您可以檢視那些資料列的分佈情形。執行上述作業的程式碼將如 [圖 2] 所示。
Figure 2 放置資料列及檢視分佈情形 (Close Figure 2)
--Prepare database
IF OBJECT_ID('Partitioned_Table') IS NOT NULL
DROP TABLE Partitioned_Table
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
      ALL TO ([PRIMARY])

CREATE TABLE Partitioned_Table
(
col1 INT
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

--Determine where values will be placed (this is not required)
--You should try to do this before executing the code
SELECT $PARTITION.Left_Partition (1)
SELECT $PARTITION.Left_Partition (2)
SELECT $PARTITION.Left_Partition (3)
SELECT $PARTITION.Left_Partition (4)
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Left_Partition (11)
SELECT $PARTITION.Left_Partition (12)
SELECT $PARTITION.Left_Partition (13)
SELECT $PARTITION.Left_Partition (14)
SELECT $PARTITION.Left_Partition (100)
SELECT $PARTITION.Left_Partition (101)
SELECT $PARTITION.Left_Partition (102)
SELECT $PARTITION.Left_Partition (103)
SELECT $PARTITION.Left_Partition (104)

--Insert data into partitioned table
INSERT INTO Partitioned_Table VALUES (1,'Description')
INSERT INTO Partitioned_Table VALUES (2,'Description')
INSERT INTO Partitioned_Table VALUES (3,'Description')
INSERT INTO Partitioned_Table VALUES (4,'Description')
INSERT INTO Partitioned_Table VALUES (10,'Description')
INSERT INTO Partitioned_Table VALUES (11,'Description')
INSERT INTO Partitioned_Table VALUES (12,'Description')
INSERT INTO Partitioned_Table VALUES (13,'Description')
INSERT INTO Partitioned_Table VALUES (14,'Description')
INSERT INTO Partitioned_Table VALUES (100,'Description')
INSERT INTO Partitioned_Table VALUES (101,'Description')
INSERT INTO Partitioned_Table VALUES (102,'Description')
INSERT INTO Partitioned_Table VALUES (103,'Description')
INSERT INTO Partitioned_Table VALUES (104,'Description')

--View the distribution of data in the partitions
SELECT ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('Partitioned_Table')

修改分割資料表
除了審慎的事前規劃之外，有時候您需要在建立及擴展分割資料表之後調整它們。資料分割配置也許能夠依預定方式運作，但舉例而言，隨著新資料不斷地累積，您可能需要新增資料分割，或者需要一次卸除大量分割資料。還好，分割資料表和基礎分割結構允許資料表在正式上線及填入資料之後進行變更。
新增資料分割 -- 許多資料分割計劃都包括在未來新增資料分割的能力。此時間點可以是特定日期或是依據增量識別資料行中的值而定。不過，如果您未事前做此規劃，以後仍然可以在分割資料表中新增資料分割。看看在 [圖 2] 中建立的資料表。您可以在此資料表中新增資料分割來包含大於 500 的值，如下所示：
--Determine where values live before new partition
SELECT $PARTITION.Left_Partition (501)  --should return a value of 4

--Create new partition
ALTER PARTITION FUNCTION Left_Partition ()
SPLIT RANGE(500)

--Determine where values live after new partition
SELECT $PARTITION.Left_Partition (501)  --should return a value of 5
新增資料分割的能力提供很大的彈性。[圖 3] 告訴您如何將資料分割新增至函數的左邊。在此情況下，您需要告訴資料分割配置要在何處放置新的資料分割，因為您已經用完第一次建置資料分割配置時所建立的所有檔案群組。即使您對所有資料分割使用 PRIMARY 檔案群組，仍然必須告訴資料分割配置要對新的資料分割重複使用 PRIMARY 檔案群組。
Figure 3 將資料分割新增至函數的左邊 (Close Figure 3)
--Determine where values live after new partition
SELECT $PARTITION.Left_Partition (5)   --should return a value of 2
SELECT $PARTITION.Left_Partition (1)   --should return a value of 1
SELECT $PARTITION.Left_Partition (10)  --should return a value of 2

--Add new filegroups to the partitioning scheme
ALTER PARTITION SCHEME Primary_Left_Scheme
NEXT USED [PRIMARY]

--Create new partition
ALTER PARTITION FUNCTION Left_Partition ()
SPLIT RANGE(5)

--Determine where values live after new partition
SELECT $PARTITION.Left_Partition (5)   --should return a value of 2
SELECT $PARTITION.Left_Partition (1)   --should return a value of 1
SELECT $PARTITION.Left_Partition (10)  --should return a value of 3
合併兩個資料分割 -- SQL Server 可讓您在保留資料時，從資料表卸除單一資料分割。這可用來將較舊的使用中資料合併到保存的資料，或減少您擁有的資料分割數目，以簡化分割資料表的管理。您也可以利用此方式來合併資料分割，將一個檔案群組的資料移到另一個檔案群組，以釋放特定磁碟機陣列上的磁碟空間。[圖 4] 中的程式碼告訴您如何將一個資料分割中的資料移到相同檔案群組上的另一個資料分割。
Figure 4 將資料從一個資料分割移到另一個資料分割 (Close Figure 4)
--Prepare database
IF OBJECT_ID('multiple_partition') IS NOT NULL
DROP TABLE multiple_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

INSERT INTO multiple_partition VALUES (1,'Description')
INSERT INTO multiple_partition VALUES (2,'Description')
INSERT INTO multiple_partition VALUES (3,'Description')
INSERT INTO multiple_partition VALUES (4,'Description')
INSERT INTO multiple_partition VALUES (10,'Description')
INSERT INTO multiple_partition VALUES (11,'Description')
INSERT INTO multiple_partition VALUES (12,'Description')
INSERT INTO multiple_partition VALUES (13,'Description')
INSERT INTO multiple_partition VALUES (14,'Description')
INSERT INTO multiple_partition VALUES (100,'Description')
INSERT INTO multiple_partition VALUES (101,'Description')
INSERT INTO multiple_partition VALUES (102,'Description')
INSERT INTO multiple_partition VALUES (103,'Description')
INSERT INTO multiple_partition VALUES (104,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')

--Check where data would be placed
SELECT $PARTITION.Left_Partition (1)
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Left_Partition (100)
SELECT $PARTITION.Left_Partition (101)

--Merge two partitions
ALTER PARTITION FUNCTION Left_Partition()
MERGE RANGE (10)

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')

--Check where data would be placed
SELECT $PARTITION.Left_Partition (1)
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Left_Partition (100)
SELECT $PARTITION.Left_Partition (101)
將單一分割資料表移到分割資料表 -- 在例行載入工作期間，大量資料通常必須載入至資料庫，然後在移到實際資料表之前必須加以修改或彙總。SQL Server 2005 資料分割可讓您將單一分割資料表移到含有多個資料分割的資料表中。這表示您可以將資料載入單一載入資料表中、修改該資料，然後將整個資料表移到現有的資料表中，而不必一一移動個別資料列。這一層資料分割不包含改變基礎資料分割結構。它包含修改分割資料表。[圖 5] 中的程式碼告訴您如何達成此目的。
Figure 5 將整個資料表移到現有的資料表 (Close Figure 5)
--Prepare database
IF OBJECT_ID(‘multiple_partition’) IS NOT NULL
DROP TABLE multiple_partition
GO

IF OBJECT_ID(‘single_partition’) IS NOT NULL
DROP TABLE single_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = ‘Primary_Left_Scheme’)
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = ‘Left_Partition’)
DROP PARTITION FUNCTION Left_Partition
GO

--Create single partition table
CREATE TABLE single_partition
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
)

--Table must have a CHECK Constraint
ALTER TABLE single_partition
WITH CHECK
ADD CONSTRAINT CK_single_partition
    CHECK (col1 > 100)

INSERT INTO single_partition VALUES (101,’Description’)
INSERT INTO single_partition VALUES (102,’Description’)
INSERT INTO single_partition VALUES (103,’Description’)
INSERT INTO single_partition VALUES (104,’Description’)

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

INSERT INTO multiple_partition VALUES (1,’Description’)
INSERT INTO multiple_partition VALUES (2,’Description’)
INSERT INTO multiple_partition VALUES (3,’Description’)
INSERT INTO multiple_partition VALUES (4,’Description’)
INSERT INTO multiple_partition VALUES (10,’Description’)
INSERT INTO multiple_partition VALUES (11,’Description’)
INSERT INTO multiple_partition VALUES (12,’Description’)
INSERT INTO multiple_partition VALUES (13,’Description’)
INSERT INTO multiple_partition VALUES (14,’Description’)
INSERT INTO multiple_partition VALUES (100,’Description’)

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID(‘multiple_partition’), OBJECT_
      ID(‘single_partition’))

--Move the single table into the partitioned table
ALTER TABLE single_partition SWITCH TO multiple_partition PARTITION 4

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID(‘multiple_partition’), OBJECT_ID(‘single_partition’))
將一個資料表的資料分割移到另一個資料表 -- 一般管理工作是將較舊的資料移到個別的保存資料表。保存處理序通常包含一系列的陳述式，而這會在交易記錄檔中造成其他資源的負荷。不過，將資料分割的擁有權從一個資料表切換到另一個資料表，是保存大量資料而不造成交易記錄檔負擔的簡單方式。此功能可讓資料庫管理員將較舊資料的區段，從使用中資料表移到保存的資料表。但由於資料並未實際移動，它需要的時間量將遠少於移動個別資料列所花費的時間。[圖 6] 會告訴您如何進行。
Figure 6 將較舊的資料移到保存的資料表 (Close Figure 6)
--Prepare database
IF OBJECT_ID('active_data') IS NOT NULL
DROP TABLE active_data
GO

IF OBJECT_ID('archive_data') IS NOT NULL
DROP TABLE archive_data
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Active_Scheme')
DROP PARTITION SCHEME Active_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Active_Partition')
DROP PARTITION FUNCTION Active_Partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Archive_Scheme')
DROP PARTITION SCHEME Archive_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Archive_Partition')
DROP PARTITION FUNCTION Archive_Partition
GO

--Create active function
CREATE PARTITION FUNCTION Active_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Create archive function
CREATE PARTITION FUNCTION Archive_Partition (int) AS RANGE LEFT
FOR VALUES (100,200,300)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Active_Scheme
AS PARTITION Active_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Archive_Scheme
AS PARTITION Archive_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE active_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Active_Scheme (col1)

CREATE TABLE archive_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Archive_Scheme (col1)

INSERT INTO active_data VALUES (1,'Description')
INSERT INTO active_data VALUES (2,'Description')
INSERT INTO active_data VALUES (3,'Description')
INSERT INTO active_data VALUES (4,'Description')
INSERT INTO active_data VALUES (10,'Description')
INSERT INTO active_data VALUES (11,'Description')
INSERT INTO active_data VALUES (12,'Description')
INSERT INTO active_data VALUES (13,'Description')
INSERT INTO active_data VALUES (14,'Description')
INSERT INTO active_data VALUES (100,'Description')

INSERT INTO archive_data VALUES (200,'Description')
INSERT INTO archive_data VALUES (300,'Description')
INSERT INTO archive_data VALUES (400,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

--Switch ownership of partition to another table
ALTER TABLE active_data SWITCH PARTITION 3 TO archive_data PARTITION 1

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))
使用單一資料分割來建立新資料表 -- 您可以從現有的分割資料表中將單一資料分割移到空白非分割資料表中。這麼做，資料庫管理員就可以在單一資料分割執行索引維護，或輕易卸除大量資料，而不必記錄刪除處理序。[圖 7] 中的範例顯示如何將資料分割移到空白資料表中，然後使用新資料表來卸除資料。
Figure 7 移動及卸除資料 (Close Figure 7)
--Prepare database
IF OBJECT_ID('active_data') IS NOT NULL
DROP TABLE active_data
GO

IF OBJECT_ID('archive_data') IS NOT NULL
DROP TABLE archive_data
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Active_Scheme')
DROP PARTITION SCHEME Active_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Active_Partition')
DROP PARTITION FUNCTION Active_Partition
GO

--Create active function
CREATE PARTITION FUNCTION Active_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Active_Scheme
AS PARTITION Active_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE active_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Active_Scheme (col1)

CREATE TABLE archive_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
)

INSERT INTO active_data VALUES (1,'Description')
INSERT INTO active_data VALUES (2,'Description')
INSERT INTO active_data VALUES (3,'Description')
INSERT INTO active_data VALUES (4,'Description')
INSERT INTO active_data VALUES (10,'Description')
INSERT INTO active_data VALUES (11,'Description')
INSERT INTO active_data VALUES (12,'Description')
INSERT INTO active_data VALUES (13,'Description')
INSERT INTO active_data VALUES (14,'Description')
INSERT INTO active_data VALUES (100,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

--Switch ownership of partition to another table
ALTER TABLE active_data SWITCH PARTITION 3 TO archive_data

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

--Drop all archive data without logging
DROP TABLE archive_data
GO

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

分割索引
有分割資料表資料的能力就有建立分割索引的能力。這可讓資料庫管理員根據分割的資料而非整個資料表的資料來設計索引結構。建立分割索引會使分割索引上產生個別 B 型樹狀目錄。索引分割具有產生小型索引的效果，使儲存引擎在資料修改、新增和刪除期間更容易維護它們。這些小型索引也可以由資料庫管理員個別維護，使大型資料集有更佳的索引維護。
建立分割索引 -- 建立分割索引時，您可以建立對齊索引或非對齊索引。若是對齊索引，您可以建立與分割資料有直接關係的索引 (若是非對齊索引，您可以選擇不同的資料分割結構描述)。
對齊是慣用方法，如果您建立分割資料表，然後建立索引而未指定不同分割配置，就會自動執行對齊。使用對齊索引讓您有彈性在資料表上建立其他資料分割，並讓您有能力將資料分割的擁有權切換到另一個資料表。這些功能通常是資料庫管理員首先建立分割資料表的原因，而只要使用索引資料表的分割結構描述，就可能達成資料分割目標。
當索引中的資料與資料表中的資料不對齊時，您可以對資料表建立索引。如果資料是在分割資料表中，這樣做可讓您以不同方式加入資料 (查詢最佳化工具可以有效率地結合分割的資料與其他分割資料)。另外，您也可以對非分割資料表執行此動作，讓您建立分割索引 (針對單一分割資料表)，以便您簡化索引維護。
[圖 8] 中的程式碼將對分割資料表建立分割式非叢集索引。非叢集索引將與資料表對齊，並利用資料表的分割資料行做為非叢集索引鍵。
Figure 8 對分割資料表建立分割式非叢集索引 (Close Figure 8)
--Prepare database
IF OBJECT_ID('multiple_partition') IS NOT NULL
DROP TABLE multiple_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
    ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

--Create partitioned non-clustered index
CREATE NONCLUSTERED INDEX cl_multiple_partition ON multiple_
      partition(col1)

INSERT INTO multiple_partition VALUES (1,'Description')
INSERT INTO multiple_partition VALUES (2,'Description')
INSERT INTO multiple_partition VALUES (3,'Description')
INSERT INTO multiple_partition VALUES (4,'Description')
INSERT INTO multiple_partition VALUES (10,'Description')
INSERT INTO multiple_partition VALUES (11,'Description')
INSERT INTO multiple_partition VALUES (12,'Description')
INSERT INTO multiple_partition VALUES (13,'Description')
INSERT INTO multiple_partition VALUES (14,'Description')
INSERT INTO multiple_partition VALUES (100,'Description')
INSERT INTO multiple_partition VALUES (101,'Description')
INSERT INTO multiple_partition VALUES (102,'Description')
INSERT INTO multiple_partition VALUES (103,'Description')
INSERT INTO multiple_partition VALUES (104,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')

--Verify index partitions
SELECT partition_id, index_id FROM sys.partitions pt
WHERE pt.[object_id] = OBJECT_ID('multiple_partition')
[圖 9] 中的程式碼將對分割資料表建立非對齊的非叢集索引。這個非叢集索引將對其索引鍵使用不同資料行，這可用於其他分割資料表的自動分頁結合。
Figure 9 對分割資料表建立非對齊的非叢集索引 (Close Figure 9)
--Prepare database
IF OBJECT_ID('multiple_partition') IS NOT NULL
DROP TABLE multiple_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Index_primary_Left_Scheme')
DROP PARTITION SCHEME Index_primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Index_Left_Partition')
DROP PARTITION FUNCTION Index_Left_Partition
GO

--Create partitioned index function
CREATE PARTITION FUNCTION Index_Left_Partition (int) AS RANGE LEFT
FOR VALUES (10,50,100)

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all index partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Index_primary_Left_Scheme
AS PARTITION Index_Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT
,col2 INT
) ON Primary_Left_Scheme (col1)

--Create non-aligned partitioned nonclustered index
CREATE NONCLUSTERED INDEX cl_multiple_partition ON multiple_
     partition(col2)
ON Index_primary_Left_Scheme (col2)

INSERT INTO multiple_partition VALUES (1,10)
INSERT INTO multiple_partition VALUES (2,10)
INSERT INTO multiple_partition VALUES (3,10)
INSERT INTO multiple_partition VALUES (4,10)
INSERT INTO multiple_partition VALUES (10,50)
INSERT INTO multiple_partition VALUES (11,50)
INSERT INTO multiple_partition VALUES (12,50)
INSERT INTO multiple_partition VALUES (13,50)
INSERT INTO multiple_partition VALUES (14,50)
INSERT INTO multiple_partition VALUES (100,100)
INSERT INTO multiple_partition VALUES (101,100)
INSERT INTO multiple_partition VALUES (102,100)
INSERT INTO multiple_partition VALUES (103,100)
INSERT INTO multiple_partition VALUES (104,100)

--Verify row count on partitioned data
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')
AND p.index_id = 0

--Verify row count on partitioned index
--Row counts will not match those found in the data partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')
AND p.index_id <> 0
維護分割索引 -- 在過去，針對包含數百萬、甚至數十億資料列的大型資料表執行索引維護，通常會花費超過資料庫管理員擁有的時間。此維護工作常未執行，因為重新建置索引時會鎖定資料。有了 SQL Server 2005，資料庫管理員可以線上執行索引維護，而不必長期鎖定基礎資料表。但即使此種方式 (當使用者在存取資料時讓您能夠執行索引維護) 仍然會因為資源用量而使系統速度變慢。比較好的方式是將索引分割成較小的區段，然後對那些小型資料分割執行索引維護。例如，若要對一個索引資料分割執行索引維護，您只要將下列程式碼片段附加到 [圖 8] 所顯示的程式碼結尾下方即可。
ALTER INDEX cl_multiple_partition
ON multiple_partition
REBUILD Partition = 2
請注意，對單一索引資料分割的索引維護必須離線執行，並可能會在索引維護期間造成資料表鎖定。為避免發生此情形，您可以將單一資料分割移到個別資料分割，執行索引維護，然後將資料分割再移回到主資料表。此處理序會造成一些效能問題，因為資料分割會移回到資料表，且叢集索引會更新，但比起鎖定整個資料表，這樣做的問題較小，且需要的系統資源也較少。

結論
如您所見，SQL Server 2005 資料表分割對大型資料表中資料的儲存和維護提供更佳的彈性，而不必重做應用程式碼或 SQL Server 處理序。有了這些功能，SQL Server 證明自己是對企業級、重要資料庫的高效能平台。

Noah Gomez 是 Verizon 的資深 SQL Server Development DBA，專精 VLDB 和大型應用程式。他是 Professional Association for SQL Server (PASS) 的成員，曾經是規模大到數兆位元組 VLDB 之 Verizon DBA 小組的一員，並在 2003 年贏得 Winter Corp. Top Ten Grand Prize 大獎。


 SQL Server: SQL Server 叢集的最佳提示
SQL Server Tom Moreau，PhD

SQL Server 叢集的最佳提示
摘要:
  • 在叢集上執行 SQL Server
  • 硬體和軟體需求
  • 叢集一個節點
  • 合乎成本效益的選項

伺服器叢集可讓您連接互相做為容錯移轉夥伴的多部實體伺服器 (或節點)。叢集提供的重複性代表您的關鍵
作業可以更穩定的執行。我在使用 SQL Server™ 的 13 年當中實作過許多叢集，而每個叢集都有一些自身的問題。這方面的經驗讓我得以蒐集許多提示，可幫助您容易且順利地執行叢集工作。
伺服器叢集利用 Windows Server® 家族之 Enterprise Edition 的內建叢集功能。事實上，在叢集方面，Windows Server 2003 遠優於 Windows 2000 Advanced Server。為了能夠從叢集得到最大的好處，您需要有正確的硬體，而這又牽涉到一些費用。利用共用磁碟將幾部伺服器湊在一起是不夠的，而且光是個別硬體元件在 Windows® Catalog (以前稱為硬體相容性清單) 有列出也不足為憑。整個系統都必須在 Windows Catalog 中。但是不必擔心，還是有一些經過認可、成本較低的叢集解決方案可用。[圖 1] 顯示典型的叢集組態。
Figure 1 A typical cluster
Figure 1 A typical cluster
當然，要叢集的不只是硬體，您必須選擇正確的 SQL Server 2005 版本。Enterprise Edition 能實作叢集和其他實用的功能，例如可以運用更多的 CPU、分散式與可更新的資料分割檢視、內建記錄傳送、自動使用索引檢視。如果您已經有 Enterprise Edition 授權，不論您是否有二到八部伺服器必須形成傳統的叢集，都應該考慮使用叢集 (我們很快會討論單節點叢集)。如果您有 SQL Server 2005 Standard Edition，則可以安裝雙節點叢集。
Windows Server 2003 Enterprise 和 Datacenter Edition 都內建了叢集。您只需要執行 [叢集系統管理員] 來設定叢集即可。您可以一次加入所有的節點，或一次加入一個節點。同樣地，當您安裝 SQL Server 時，可以選擇安裝在個別的非叢集伺服器上，或者在叢集上安裝虛擬執行個體。如果您選擇安裝虛擬執行個體，則可以安裝在叢集的所有節點上、只安裝在某些節點上，或者甚至只安裝在一個節點上。
最後，為了達到叢集的真正目的 (高可用性)，您需要合格的人員和編排良好的程序，以便萬一發生問題時能適當地處理。雖然叢集是預防硬體失敗的良好措施，但是無法防止使用者錯誤，例如缺乏睡眠的 DBA 在半夜卸除重要的資料表。

單節點叢集
即使您目前只需要單一伺服器，也應考慮建立單節點叢集。這可以讓您以後選擇升級至叢集，以避免重建。只要確定您選擇的硬體有在 Windows Catalog 的叢集部分中即可。
您希望以後能夠選擇加入節點的著眼點，不只是高可用性而已。請設想一下，萬一您發現您的伺服器沒有足夠容量的話。這意味著您必須執行移轉，既耗時又費力。如果您有一個單節點叢集，停機時間將大為縮短，會比較容易移轉。您將新節點加入叢集，將 SQL Server 二進位編碼檔案與 Service Pack 加入新節點，再容錯移轉至新節點。然後您加入任何 Service Pack 後的更新，最後則收回舊節點。停機時間只有容錯移轉和加入更新 (如果有) 所花的時間。

加入節點
由於叢集中所有的節點都必須相同，因此您應盡早加入額外的節點。如果等得太久，節點可能無法實際執行。我曾經在某個專案中，必須重建 SQL Server 2000 叢集內的節點。基本的電腦建置是由作業系統/網路系統管理員處理，然後我再將其加入叢集，並準備好做為 SQL Server 節點提供服務。原本一切都很順利，直到我容錯移轉至新節點時，問題就出現了。它只是馬上容錯移轉回來，令我非常沮喪。長話短說，雖然我準備了建立新叢集的詳細文件，包括在兩個節點中加入叢集服務和 SQL Server 服務帳戶，但是相關人員並沒有明確地遵照文件執行。系統管理員並未將這些服務帳戶加入重建的節點，因此在重建前擁有權限已經不存在。
我花了很長的時間才找出這個問題。有一天我想到應檢查本機群組成員資格。等到我加入這兩個帳戶後，就能順利地容錯移轉。然後我開始思考。重建節點並不常發生，一旦發生，就是緊急情況。雖然我已準備好文件，但是並未使用到文件。我們只需要撰寫一段簡短的指令碼，以加入這兩個帳戶並執行其他任何必要的自訂，就能自動執行安全性的部分。不過情況在 SQL Server 2005 中已有改善。安裝程式會要求您必須為 SQL Server 服務帳戶設定網域層級群組。
當然，這令我想得更多。您可以建立指令碼，以叫用 CLUSTER.EXE 將節點加入您的 Microsoft® Cluster Server (MSCS) 叢集。您只需要提供節點名稱給指令碼，指令碼就能處理其餘的工作。在緊急情況下，自動化真的很好用。

N+1 叢集
有時候，並不是為了取代節點而將某個節點加入叢集。您可能是要將更多的 SQL Server 執行個體加入叢集，而每個執行個體需要個別的磁碟資源。雖然多個執行個體可以在單一節點上執行，不過這些執行個體將共用 CPU 和記憶體，而這意味著效能不彰。理想的情況是，單一節點上只應執行單一執行個體。您在容錯移轉時要如何確保此情況？簡單：答案就是要有一個節點不執行服務，而其他節點每個都執行一個 SQL Server 執行個體。事實上，這就是 N+1 叢集的定義：N 個執行個體在 N+1 個節點上執行。多出來的節點是備份節點。

升級 SQL Server
SQL Server 叢集執行個體的升級，絕對不能隨心所欲：當初建置叢集的理由，就是為了要穩定性。但是 SQL Server 2005 提供了許多您可以利用的增強功能，當您確定要升級時，可以讓您在過程中盡量縮減停機時間。
您的選擇是什麼？先來看看最昂貴的解決方案：建立全新的叢集，這表示需要新的伺服器，甚至是新的存放區域網路 (SAN)。您可能可以保留現有的網路交換器，不過也只能保留這部分了。這種方法顯然並不便宜，但是有其優點。新硬體的執行情況通常會比舊硬體好，因為磁碟容量和速度永遠不斷在提升。因此，純綷使用新硬體可以加強效能。您甚至可以租用設備，以保有更新的彈性。
準備好硬體後，您就可以建立新的虛擬 SQL Server、複製您的實際執行資料庫，然後完成新系統的測試，以便在截止日期之前完成所有除錯作業。只要記得從現有的伺服器編寫登入的指令碼 (請參閱 support.microsoft.com/kb/246133。如果發生重大失敗，更新您的登入組建指令碼也是很好的做法)。
為了減少停機時間，您可能必須使用記錄傳送，除非您的資料庫非常小，而且有一段時間不會有任何使用者連接到資料庫。您可以傳送記錄，直到移轉的前一刻為止。然後強迫使用者離線、複製並傳送最後的記錄，再將應用程式指向新執行個體 (請參考下面的資料庫鏡像區段，以了解記錄傳送的替代方案，滿有趣的)。如果您使用 DNS 別名，可能甚至不必將應用程式指向新執行個體。只需要更新 DNS 別名即可。這種方法的優點在於，如果您移轉到一半，卻必須還原至原始執行個體，至少您還有原始執行個體。
您可以使用較便宜的方法，不過這種方法需要較多的事先規劃。一個叢集可以支援多個 SQL Server 執行個體，但是每個執行個體都必須有其自己的磁碟資源。因此當您建立 SAN 時，請多設定一個 LUN，以便未來升級。若要執行升級，請在此磁碟資源上安裝 SQL Server 二進位編碼檔案。您可以讓系統運行，等您準備好之後，關閉目前的 SQL Server，從舊的 SQL Server 群組移動磁碟資源，更新相依性，再讓新的 SQL Server 執行個體上線。從舊執行個體附加資料庫，就可以啟動及執行 (您在事前已完成所有備份，對吧？)
這是較便宜的方法，但是會有一點風險。萬一出錯，您無法從新執行個體卸離資料庫，然後將該資料庫放回舊執行個體。您必須從備份還原，這表示需要很長的停機時間。
替代方法是在您的 SAN 上設定兩個 SQL Server 執行個體，前提是您要有足夠的空間。先將實際執行備份 (和記錄傳送) 還原至新執行個體，然後執行我前面所述的步驟。如此一來，就變成有了後援系統。一旦您完成移轉後，就可以從舊執行個體釋放 SAN 資源。這樣所花費的成本只有額外的磁碟空間。

負載平衡
我們先從破除常見的誤解開始。您使用 MSCS 叢集的目的是獲得高可用性，而非負載平衡。另外，SQL Server 並沒有任何內建的自動負載平衡功能。您必須透過應用程式的實體設計取得負載平衡。這是什麼意思呢？
隨著資料表成長，您一定會發現效能有所降低，尤其是牽涉到資料表掃描時。當您的資料列達到數百萬或數十億個時，傳統的解決方案是使用資料分割檢視，這種檢視是由具有相同結構描述，並利用 UNION ALL 連結在一起的一些資料表構成。此外，也利用 CHECK 條件約束區別成員資料表，而這可防止資料分割檢視中的資料重複。如果 CHECK 條件約束中使用的資料行也是主索引鍵的一部分，檢視就可以更新。
如果成員資料表是在自己的檔案群組中，而這些檔案群組是位於不同的實體磁碟機上，就會有較佳的磁碟效能。資料表甚至可以放在不同的資料庫中。不過在 SQL Server 2005 中，只要所有資料都在同一個資料庫中，您就可以使用資料表資料分割，這種資料分割的實作容易多了。
但是假設您已盡量使用資料表資料分割或 (本機) 資料分割檢視，而執行速度還是很慢。如果您是使用 SQL Server 2000 或 SQL Server 2005，就可以使用分散式資料分割檢視。主要差異在於成員資料表可以位於不同的 SQL Server 執行個體上，而這些執行個體可以安裝在 N+1 叢集上。這種做法好在哪裡？如果任一個成員資料表在資料分割檢視中離線，則整個檢視都會離線。將這些成員設定為叢集的一部分可提供您支援效能所需的可靠性，並且提供負載平衡。

您真的需要叢集嗎？
您或許有一些閒置的備用伺服器，但是這些伺服器並不在 Windows Catalog 的叢集清單中。放著現成的伺服器不用，只為了支援叢集而購買新伺服器是不符合經濟效益的做法。
資料庫鏡像可能是具有吸引力的叢集替代方法。鏡像牽涉到三個元素：裝載鏡像資料庫的執行個體稱為主體、備份伺服器稱為鏡像，而您若想要自動容錯移轉，則需要第三部伺服器 (稱為見證)。簡單地說，主體上資料庫中的交易會在鏡像中再執行一次。如果主體停機，而您有見證，資料庫就可以自動容錯移轉至鏡像。您必須為每個應用程式資料庫設定鏡像，但是不能鏡像系統資料庫。
鏡像系統完全是另一個 SQL Server 執行個體，與叢集不同，且可位於幾千英里以外。從主體複製交易會引發更新活動，而此活動會擴展鏡像的快取。當然，假設鏡像除了從主體接收鏡像交易之外，沒有其他任何活動。其容錯移轉速度通常會比叢集快，因為鏡像中已有 SQL Server 在執行中。由於快取至少已部分初始化，因此初始效能不會像叢集狀況中一樣差。而且要注意，當鏡像資料庫容錯移轉時，主體和鏡像的角色會對調。
資料庫鏡像的缺點，是所需要的總磁碟容量為叢集的兩倍。如果想使用無資料遺失的同步模式，您還需要更強的 CPU 運算動力。我說過，高可用性的代價並不便宜。

結合的方法
因為鏡像的位置可以離主體很遠，所以這是嚴重損壞修復 (DR) 計劃的理想選擇。您的叢集可做為第一道防線，但是如果您同時使用叢集和鏡像，會有什麼情況？在叢集容錯移轉中，如果您的鏡像組態中有見證，則在叢集 SQL Server 上線時，鏡像會成為主體。但是要注意，從新主體容錯移轉回 (叢集) 新鏡像並不會自動執行。因此，當您同時使用鏡像與叢集時，最好不要啟用鏡像資料庫的自動容錯移轉功能。
DR 不是您使用鏡像的唯一理由。如果您必須套用 Service Pack 或 Hotfix 至主體，這也很有用，如此便可以手動容錯移轉至鏡像。在套用 Service Pack 或 Hotfix 時，舊的主體伺服器會暫時離線，而在新主體發生的認可交易會佇列起來，等待傳回新的鏡像 (舊的主體)。一旦 Service Pack 或 Hotfix 安裝完成之後，就會進行同步處理，最終兩部伺服器將會完全同步。如此一來，您就可以交換主體和鏡像的角色。停機時間只有容錯移轉和轉回的幾秒鐘而已。您可以使用此方法將 SQL Server 移轉至另一部電腦。但請不要再移轉回來。

虛擬伺服器增加彈性
虛擬化可以讓您在單一實體伺服器上同時執行一個或多個作業系統。虛擬化軟體可為叢集概念增加另一層功能，因為您可以將軟體叢集化。因此，如果執行主機的伺服器失敗，則它和它的虛擬作業系統都會容錯移轉至備份節點。這是很容易移轉虛擬伺服器的方式。此外，虛擬作業系統不一定要具備叢集功能。因此，您可以在位於叢集上之 Microsoft Virtual Server 2005 中執行的虛擬 Windows Server 2003 內，執行 SQL Server Workgroup Edition。您實際上是間接擁有叢集 Workgroup Edition (請參閱 [圖 2])。
Figure 2 Using a virtual server
Figure 2 Using a virtual server

掌握控制
如果您負責 SQL Server 實作，就需要確保您的伺服器保持可用狀態。伺服器叢集有助於保證維持這種狀態。本文提供辛苦得來的教訓以幫助您有個順暢的開始，您可以在＜叢集資源＞資訊看板中找到更多有用的資訊。
叢集資源
如需本文使用的方法以及您設定 SQL Server 叢集所需之各種產品的詳細資訊，請參閱下列文章：
  • SQL Server 2005 Failover Clustering
  • SQL Server 2000 Failover Clustering
  • Windows Server 2003 R2 Enterprise Edition–Cluster Server
  • Microsoft Cluster Server Administrator’s Guide
  • Microsoft Virtual Server 2005 R2

Tom Moreau，PhD、BSc、PhD、MCSE、MCDBA，是專精於 SQL Server 資料庫管理、設計及實作的獨立顧問，且居住在多倫多地區。Tom 自 1993 年起就已使用 SQL Server，並且從 2001 年開始就一直是 MVP。他寫過 100 多篇文章，並且與人合著過 SQL Server 的書。感謝 SQL Server MVP Geoff Hiten 提供實用的資訊。


 Windows 系統管理: 深入探索 Windows Vista 核心：第二篇
Windows 系統管理 Mark Russinovich

深入探索 Windows Vista 核心：第二篇
摘要:
  • 記憶體管理
  • 啟動和關機
  • 電源管理

上個月，在此三篇一系列文章的第一篇內，我探討了處理程序和 I/O 方面的 Windows Vista 核心增強功能。
這次我要討論 Windows Vista 記憶體管理方式的加強，以及系統啟動、關機和電源管理的主要改進 (第一篇)。
每一版的 Windows® 都會改進延展性和效能，Windows Vista™ 也不例外。Windows Vista 記憶體管理員包括許多的增強功能，例如更廣泛地使用鎖定-釋放同步處理技巧、更細微的鎖定、更緊密的資料結構封裝、更大的分頁 I/O、支援最新 GPU 記憶體架構，以及更有效地使用硬體轉譯對應緩衝區。此外，Windows Vista 記憶體管理現在可針對不同工作量的需求，提供動態位址空間配置。
Windows Vista 作業系統中首次引進使用新技術的四種效能增強功能：SuperFetch、ReadyBoost、ReadyBoot 及 ReadyDrive。我會在本文後面詳細討論這些功能。

動態核心位址空間
Windows 和在 Windows 上執行的應用程式一直為 32 位元處理器的位址空間限制所苦。Windows 核心預設的限制是 2GB，或者 32 位元虛擬位址總空間的一半，另一半則保留給目前在 CPU 上執行執行緒的處理程序使用。在核心所能使用的一半空間中，核心必須對應自己本身、裝置驅動程式、檔案系統快取、核心堆疊、每一工作階段程式碼資料結構，以及裝置驅動程式所配置的非分頁 (鎖定實體記憶體) 和分頁緩衝區。在 Windows Vista 之前，記憶體管理員在開機時會決定指派多少位址空間給這些不同的用途，但是這種缺乏彈性的方法有時會造成某個區域已用盡，而其他區域仍有大量的可用空間。某個區域耗盡會造成應用程式失敗，並使得裝置驅動程式無法完成 I/O 操作。
在 32 位元 Windows Vista 中，記憶體管理員會動態地管理核心的位址空間，隨著工作量需求的需要配置及解除配置空間給各種用途。因此，當裝置驅動程式要求增加時，可以增加用於儲存分頁緩衝區的虛擬記憶體數量，而當驅動程式釋放記憶體時，則可以減少其數量。所以 Windows Vista 將可以處理更多的工作量，同樣地，即將推出的 Windows Server® (代號 "Longhorn") 也能夠擴充，以處理更多的同時執行終端機伺服器使用者。
當然，在 64 位元 Windows Vista 系統上，位址空間限制目前並未造成真正的限制，因為都已設定到其最大值，所以不需要特別處理。

記憶體優先順序
Windows Vista 不只增加了 I/O 優先順序 (我在第一篇已介紹過)，也實作了記憶體優先順序。要了解 Windows 如何使用記憶體優先順序，必須先了解記憶體管理員如何實作其記憶體快取 (稱為待命清單)。在 Windows Vista 之前的所有 Windows 版本中，當系統收回處理程序所擁有的實體分頁 (大小通常是 4KB) 時，記憶體管理員通常會將分頁放在待命清單的最後面。如果處理程序想要再次存取分頁，記憶體管理員就會從待命清單中取出分頁，然後重新指派給處理程序。如果處理程序想要使用新的實體記憶體分頁，但是沒有可用記憶體可使用時，記憶體管理員就會將待命清單前面的分頁指派給處理程序。這種配置實質上會將待命中的所有分頁同等處理，只使用分頁放入清單中的時間將分頁排序。
在 Windows Vista 中，每個記憶體分頁都有 0 到 7 範圍內的優先順序，而記憶體管理員也將待命清單分成八份清單，每份清單都儲存一個特定優先順序的分頁。當記憶體管理員想要從待命清單取出分頁時，會先從低優先順序清單取出分頁。分頁的優先順序通常反映最先引起分頁配置之執行緒的優先順序 (如果分頁是共用的，則反映共用執行緒中最高的記憶體優先順序)。執行緒會從它所屬的處理程序繼承分頁優先順序值。記憶體管理員在預期處理程序的記憶體存取需求時，會針對它從磁碟推測讀取之分頁，使用低優先順序。
根據預設，處理程序的分頁優先順序值為 5，但是應用程式和系統可以利用函數來變更處理程序與執行緒的分頁優先順序值。唯有全面了解分頁的相對優先順序 (這就是 SuperFetch 的角色)，才能發揮記憶體優先順序的真正威力。

SuperFetch
記憶體管理員的一項重大變更，就是其管理實體記憶體的方式。舊版 Windows 所使用的待命清單管理有兩個限制。第一，分頁的優先順序只依賴處理程序最近已發生的行為，並不會預期它們未來的記憶體需求。第二，優先順序使用的資料只限於處理程序在任一特定時間點所擁有的分頁清單。這些缺點可能會造成「啟動後症候群」之類的狀況，就是您離開電腦一段時間，同時電腦上有需要大量記憶體的系統應用程式在執行 (例如防毒軟體掃描或磁碟重組)。此應用程式會導致需要大量記憶體的活動，強制覆寫使用中應用程式原來存放在記憶體快取中的程式碼和資料。等到您回來時，會發現效能已變差，因為應用程式必須向磁碟要求其資料和程式碼。
Windows XP 引進了預先擷取支援，根據以前的開機和應用程式啟動，執行大量磁碟 I/O 以預先載入包含它所預期之程式碼和檔案系統資料的記憶體，改進了開機和應用程式啟動效能。Windows Vista 的 SuperFetch 則有更大的改進。SuperFetch 是一種記憶體管理配置，利用歷史資訊和主動的記憶體管理，加強近來最少存取的方法。
SuperFetch 會在 %SystemRoot%\System32\Sysmain.dll 中實作，在服務主機處理程序 (%SystemRoot%\System32\Svchost.exe) 中以 Windows 服務執行。此配置依賴記憶體管理員的支援，以便擷取分頁使用歷程，並指示記憶體管理員從磁碟上的檔案，或從分頁檔案預先將資料和程式碼載入待命清單，並為分頁指派優先順序。SuperFetch 服務實際上是將分頁追蹤延伸至資料和程式碼，這些資料和程式碼曾經放在記憶體中，但是記憶體管理員已重新使用記憶體以提供空間給新的資料和程式碼。它會將此資訊儲存在 %SystemRoot%\Prefetch 目錄下副檔名為 .db 的狀況檔案中，同時儲存的還有用於將應用程式啟動最佳化的標準預先擷取檔案。SuperFetch 會利用對記憶體使用模式的了解，在實體記憶體可用時預先載入資料和程式碼。
只要記憶體變成可用 (例如，當應用程式結束或釋放記憶體時)，SuperFetch 就會要求記憶體管理員擷取最近收回的資料和程式碼。這是以「非常低」優先順序 I/O 的速度執行，每秒只有幾個分頁，以免預先載入影響使用者或其他使用中應用程式。因此，您若是離開電腦去吃午餐，而需要大量記憶體的背景工作在您離開時造成您使用中應用程式的程式碼和資料被收回，SuperFetch 通常可在您回來之前將全部或大部分的程式碼和資料放回記憶體中。SuperFetch 也包含休眠、待命、快速切換使用者 (FUS) 及應用程式啟動等特定的狀況支援。例如，當系統休眠時，SuperFetch 會將它 (根據以往的休眠) 預期恢復執行時要存取的資料和程式碼，儲存在休眠檔案中。相對地，當您恢復執行 Windows XP 時，若參照到先前快取的資料，則需從磁碟重新讀取。
有關 SuperFetch 如何影響可用記憶體的簡介，請參閱資訊看板＜注意 SuperFetch＞。
注意 SuperFetch
您使用 Windows Vista 系統一段時間後，就會看到工作管理員之 [效能] 頁面上的可用實體記憶體計數器顯示低數量。這是因為 SuperFetch 和標準 Windows 快取會使用所有可用的實體記憶體來快取磁碟資料。例如，當您首次開機時，如果立即執行工作管理員，應該會注意到隨著快取記憶體數量增加，可用記憶體值就會跟著減少。或者，您若是執行記憶體需求極大的程式，然後結束程式 (任何會配置大量記憶體，然後再釋放記憶體的「RAM 最佳化程式」免費軟體都行)，或者剛剛複製很大的檔案，隨著系統收回已配置的記憶體，[可用] 的數量會增加，而 [實體記憶體使用量] 圖形會下降。但是，SuperFetch 會隨著時間將先前強制從記憶體移出的資料重新填入快取中，因此 [快取] 數量會增加，而 [可用] 數量會減少。
Watching memory

ReadyBoost
CPU 和記憶體的速度遠快於硬碟的速度，因此磁碟是常見的系統效能瓶頸。隨機磁碟 I/O 更是惡夢，因為磁碟頭搜尋時間大約是 10 毫秒，對現在 3GHz 的處理器而言是很漫長的時間。雖然 RAM 很適合快取磁碟資料，但是相對而言它很昂貴。不過，Flash 記憶體通常比較便宜，而且隨機讀取的速度最高可比一般硬碟快 10 倍。因此，Windows Vista 包含名為 ReadyBoost 的功能，這會在 Flash 記憶體存放裝置上，建立邏輯位置在記憶體和磁碟之間的中繼快取層，以利用 Flash 記憶體存放裝置的優勢。
ReadyBoost 包含一個在 %SystemRoot%\System32\Emdmgmt.dll 中實作的服務 (這會在服務主機處理程序中執行)，以及一個磁碟區篩選器驅動程式 %SystemRoot%\System32\Drivers\Ecache.sys. (Emd 是外部記憶體裝置 (External Memory Device) 的縮寫，此名稱是 ReadyBoost 在開發過程中使用的名稱)。您將 USB 金鑰之類的 Flash 裝置插入至系統時，ReadyBoost 服務會檢查裝置以判斷其效能特性，並將其測試結果儲存在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Emdmgmt 中，請參閱 [圖 1]。
Figure 1 ReadyBoost device test results in the registry
Figure 1 ReadyBoost device test results in the registry
如果您尚未使用快取的裝置，而且新裝置的大小介於 256MB 和 32GB 之間、隨機 4KB 讀取的傳送速率可達 2.5MB/s 或更快、隨機 512KB 寫入的傳送速率達到 1.75MB/s 或更快，ReadyBoost 就會詢問您是否要固定使用最多 4GB 的儲存體做為磁碟快取 (雖然 ReadyBoost 可以使用 NTFS，不過它將最大快取大小限制在 4GB，以配合 FAT32 限制)。您如果同意，服務就會在裝置的根目錄建立名為 ReadyBoost.sfcache 的快取檔案，並要求 SuperFetch 在背景填入快取。
在 ReadyBoost 服務初始化快取之後，Ecache.sys 裝置驅動程式會攔截對本機硬碟磁碟區 (例如 C:\) 的所有讀取和寫入，並將寫入的任何資料複製到服務所建立的快取檔案中。Ecache.sys 會壓縮資料，而且壓縮比率通常可達到 2:1，因此 4GB 的快取檔案通常會包含 8GB 的資料。驅動程式使用先進加密標準 (AES) 加密，配合隨機產生的每一開機工作階段金鑰將其寫入的每一個區塊加密，以保證裝置若是從系統移除時的資料隱私權。
ReadyBoost 看到可利用快取滿足的隨機讀取時，會從快取提供服務，但是因為硬碟的循序讀取存取優於 Flash 記憶體，所以即使快取中有資料，它也會讓屬於循序存取模式的讀取直接送往磁碟。

ReadyBoot
如果系統的記憶體小於 512MB，Windows Vista 就使用與 Windows XP 相同的開機預先擷取，但是如果系統有 700MB 或更多的 RAM，它則會使用 RAM 快取將開機程序最佳化。快取的大小會視可用的 RAM 總數量而定，不過已大到足夠建立合理的快取，同時還可讓系統擁有順暢開機所需的記憶體。
在每次開機之後，ReadyBoost 服務 (與實作 ReadyBoost 功能相同的服務，剛剛已介紹過) 會使用閒置 CPU 時間，來計算下次開機的開機快取計劃。它會分析前五次開機的檔案追蹤資訊，並確認先前存取過哪些檔案，以及這些檔案在磁碟上的位置。它會將處理過的追蹤儲存到 %SystemRoot%\Prefetch\Readyboot 底下的 .fx 檔案中，並將快取計劃儲存在 HKLM\System\CurrentControlSet\Services\Ecache\Parameters 底下，針對追蹤參考的內部磁碟區命名的 REG_BINARY 值中。
快取是由實作 ReadyBoost 快取的同一個裝置驅動程式 (Ecache.sys) 實作，但是快取的填入則是由 ReadyBoost 服務在系統開機時主導。雖然開機快取也像 ReadyBoost 快取一樣會壓縮，不過 ReadyBoost 和 ReadyBoot 快取之間的另一項差異是，當處於 ReadyBoot 模式時，除了 ReadyBoost 服務的更新之外，快取並不會變更以反映開機過程中讀取或寫入的資料。ReadyBoost 服務會在開機開始之後 90 秒刪除快取 (如果有其他記憶體需求則更快)，並將快取的統計資料記錄在 HKLM\System\CurrentControlSet\Services\Ecache\Parameters\ReadyBootStats 中，如 [圖 2] 所示。Microsoft 效能測試顯示，ReadyBoot 的效能比舊版 Windows XP 預先擷取程式改進了 20%。
Figure 2 ReadyBoot Performance statistics
Figure 2 ReadyBoot Performance statistics

ReadyDrive
ReadyDrive 是 Windows Vista 中利用新的交互式硬碟機 (稱為 H-HDD) 的功能。H-HDD 是具有內嵌靜態 Flash 記憶體 (也稱為 NVRAM) 的磁碟。標準的 H-HDD 包含介於 50MB 到 512MB 之間的快取，不過 Windows Vista 的快取限制是 2TB。
Windows Vista 會使用 ATA-8 命令，來定義要保存在 Flash 記憶體中的磁碟資料。例如，Windows Vista 會在系統關機時將開機資料儲存到快取中，以允許更快的重新啟動。它也會在系統休眠時將部分休眠檔案資料儲存在快取中，以加快後續的恢復執行。由於即使當磁碟處於關閉狀態時，快取依然啟用，因此 Windows 可以使用 Flash 記憶體做為磁碟寫入快取，這可避免磁碟在系統使用電池電力執行時啟動。保持磁碟的磁針關閉可以節省磁碟機在正常使用下所消耗的大部分電力。

開機設定資料庫
Windows Vista 增強了啟動和關機的許多層面。採用開機設定資料庫 (BCD) 儲存系統和作業系統啟動設定、新的系統啟動程序的流程和組織、新的登入架構，以及支援延遲自動啟動服務，這些都改進了開機。Windows Vista 的關機變更包括 Windows 服務的預先關閉通知、Windows 服務關閉順序，以及 OS 管理電源狀態轉換方式的重大變更。
啟動程序最明顯的變更就是系統磁碟區的根目錄中沒有 Boot.ini。這是因為在舊版 Windows 中儲存在 Boot.ini 文字檔案中的開機設定，現在都儲存在 BCD 中。Windows Vista 使用 BCD 的原因之一，是它合併了 Windows 所支援的兩個目前開機架構：主開機記錄 (MBR) 和可延伸韌體介面 (EFI)。MBR 通常是由 x86 和 x64 桌上型系統使用，而 EFI 則是由 Itanium 系統使用 (不過桌上型 PC 可能很快就會包含 EFI 支援)。BCD 會摘要韌體，也擁有比 Boot.ini 好的其他優點，例如支援 Unicode 字串和替代的預先開機可執行檔。
BCD 實際上是儲存在磁碟上的登錄 Hive 中，此 Hive 會載入 Windows 登錄以便透過登錄 API 存取。在 PC 上，Windows 會將它儲存在系統磁碟區的 \Boot\Bcd 中。在 EFI 系統上，則是儲存在 EFI 系統磁碟分割中。Hive 載入之後，會在 HKLM\Bcd00000000 底下顯示，但是並未記載其內部格式，因此若要編輯，就需要使用 %SystemRoot%\System32\Bcdedit.exe 之類的工具。也透過 Windows Management Instrumentation (WMI) 提供操作 BCD 之指令碼和自訂編輯器的介面，而且您可以使用 Windows 系統設定公用程式 (%SystemRoot%\System32\Msconfig.exe) 編輯或加入基本參數，例如核心偵錯選項。
BCD 會將全平台的開機設定 (例如預設 OS 選取和開機功能表逾時) 與 OS 特定的設定 (例如 OS 開機選項和開機載入器的路徑) 分開。例如，[圖 3] 顯示當您執行 Bcdedit，但是未加上命令列選項時，它會在輸出的最前面區段中，顯示 Windows 開機管理程式 (Windows Boot Manager) 的平台設定，隨後則包括 Windows 開機載入器 (Windows Boot Loader) 區段的 OS 特定設定。
Figure 3 Settings displayed in BCDEdit
Figure 3 Settings displayed in BCDEdit
當您將 Windows Vista 安裝開機時，此新配置會將以往舊版 Windows 系統上由作業系統載入器 (Ntldr) 所處理的工作分割到兩個不同的可執行檔中：\BootMgr 和 %SystemRoot%\System32\Winload.exe。Bootmgr 會讀取 BCD 並顯示 OS 開機功能表，而 Winload.exe 則會處理作業系統載入。如果您是執行正常開機，Winload.exe 就會載入開機啟動裝置驅動程式和核心作業系統檔案，包括 Ntoskrnl.exe，並會將控制權轉移給作業系統；如果系統是從休眠狀態恢復執行，則它會執行 %SystemRoot%\System32\Winresume.exe，將休眠資料載入記憶體中並恢復執行 OS。
Bootmgr 也包含其他預先開機可執行檔的支援。Windows Vista 預先設定了 Windows 記憶體診斷 (\Boot\Memtest.exe) 做為檢查 RAM 健康狀態的選項，但是協力廠商可能加入自己的預先開機可執行檔，做為將在 Bootmgr 開機功能表中顯示的選項。

啟動程序
在舊版的 Windows 中，各種系統處理程序之間的關係並不是很清楚。例如，在系統開機時，互動式登入管理程式 (%SystemRoot%\System32\Winlogon.exe) 會啟動本機安全性授權子系統服務 (Lsass.exe) 和服務控制管理員 (Services.exe)。此外，Windows 會使用稱為「工作階段」的名稱空間容器，來隔離在不同登入工作階段中執行的處理程序。但是在 Windows Vista 之前，使用者是登入主控台共用工作階段 0 (系統處理程序所使用的工作階段)，這造成潛在的安全性問題。例如，當時有一個編寫不良的 Windows 服務就是在工作階段 0 執行，且該服務會在互動式主控台上顯示使用者介面視窗，使惡意程式有機可乘 (可能透過毀壞攻擊等技巧攻擊視窗並取得系統管理員特殊權限)，而造成安全性的問題。
為了處理這些問題，許多系統處理程序都已針對 Windows Vista 重新設計。如同舊版的 Windows 一樣，工作階段管理員 (Smss.exe) 會是開機過程中所建立的第一個使用者模式處理程序，但是在 Windows Vista 中，工作階段管理員會啟動本身的第二個例項，以設定工作階段 0 (完全由系統處理程序專用)。工作階段 0 的工作階段管理員處理程序會啟動 Windows 啟動應用程式 (Wininit.exe)、工作階段 0 的 Windows 子系統處理程序 (Csrss.exe)，然後就會結束。Windows 啟動應用程式會繼續啟動服務控制管理員、本機安全性授權子系統，以及一個新的處理程序 (本機工作階段管理員 (Lsm.exe))，此處理程序負責管理電腦的終端機伺服器連線。
使用者登入系統時，初始的工作階段管理員會建立其本身的新例項，以設定新工作階段。新的 Smss.exe 處理程序會為新的工作階段啟動 Windows 子系統處理程序和 Winlogon 處理程序。讓主要的工作階段管理員使用本身的複本來初始化新工作階段並不會為用戶端系統提供任何好處，但是在做為終端機伺服器的 Windows Server "Longhorn" 系統上，多個複本可以同時執行，以允許多位使用者更快的登入。
有了此新的架構，系統處理程序 (包括 Windows 服務) 都隔離在工作階段 0 中。如果在工作階段 0 執行的 Windows 服務顯示使用者介面，互動式服務偵測服務 (%SystemRoot%\System32\UI0Detect.exe) 就會在使用者的安全性內容中啟動本身的一個例項，以通知任何已登入的系統管理員，並顯示 [圖 4] 所示的訊息。如果使用者選取 [顯示訊息] 按鈕，服務就會將桌面切換至 Windows 服務桌面，使用者可以在此和服務的使用者介面互動，然後切換回其自己的桌面。如需啟動時執行之作業的詳細資訊，請參閱資訊看板＜檢視啟動程序的關係＞。
Figure 4 Service has displayed a window
Figure 4 Service has displayed a window
檢視啟動程序的關係
您可以使用 Sysinternals (microsoft.com/technet/sysinternals) 的 Process Explorer，來檢視 Windows Vista 的處理程序啟動樹狀目錄。
擷取畫面包含 [Session] 資料行，您可以透過 Process Explorer 的資料行對話方塊加入此資料行。反白的處理程序是初始的 Smss.exe。其下面是工作階段 0 Csrss.exe 和 Wininit.exe，這兩者都會靠左對齊，因為其父系處理程序 (也就是設定工作階段 0 之 Smss.exe 的例項) 已經結束。Wininit 的三個子系為 Services.exe、Lsass.exe 和 Lsm.exe。
Process Explorer 會將一組處理程序識別為在工作階段 1 中執行，而這也是我透過遠端桌面連線登入的工作階段。Process Explorer 會以藍色反白顯示使用和其本身相同之帳戶執行的處理程序。最後，會初始化工作階段 2 以準備讓使用者登入主控台，並建立新的登入工作階段。Winlogon 就是在這個工作階段中執行，並使用 LogonUI 要求新的主控台使用者「按 Ctrl+Alt+DELETE 以登入」，而 Logonui.exe 也會在此要求使用者提供認證。
Startup process and session information
Startup process and session information

認證提供者
Windows Vista 連登入架構都變更了。舊版的 Windows 中，Winlogon 處理程序會載入登錄中指定的 Graphical Identification and Authentication (GINA) DLL，以顯示登入 UI，要求使用者提供認證。很可惜，GINA 模型有諸多的限制，包括只能設定一個 GINA、協力廠商很難撰寫完整的 GINA，以及使用非標準使用者介面的自訂 GINA 會變更 Windows 的使用者經驗。
Windows Vista 使用新的認證提供者架構來代替 GINA。Winlogon 啟動另一個處理程序，亦即登入使用者介面主機 (Logon User Interface Host (Logonui.exe))，它會載入在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Authentication\Credential Providers 中設定的認證提供者。Logonui 可以同時裝載多個認證提供者；事實上，Windows Vista 附有互動式 (Authui.dll) 和智慧卡 (Smart-cardcredentialprovider.dll) 提供者。為了保證一致的使用者經驗，LogonUI 會管理向使用者顯示的使用者介面，不過它也允許認證提供者指定文字、圖示和編輯控制項之類的自訂元素。

延遲自動啟動服務
如果您曾經在 Windows 系統啟動後立即登入系統，很可能遇到過必須經過一段延遲，您的桌面才會完全設定好，您也才能與 Shell 和您所啟動的任何應用程式互動。在您登入時，服務控制管理員會啟動許多設定為自動啟動 (因此會在開機時啟用) 的 Windows 服務。許多服務的初始化作業，都需要大量使用 CPU 和磁碟資源，這會和您的登入活動競爭資源。為了解決這個問題，Windows Vista 引進新的服務啟動類型，稱為延遲自動啟動，不需要在 Windows 開機後立即作用的服務可以使用此功能。
服務控制管理員會在自動啟動服務完成啟動之後，再啟動設定為延遲自動啟動的服務，並將其初始執行緒優先順序設定為 THREAD_PRIORITY_LOWEST。此優先順序層級會使執行緒執行的所有磁碟 I/O 成為「非常低」I/O 優先順序。服務完成初始化之後，服務控制管理員就會將其優先順序設定為標準。延遲啟動、低 CPU 和記憶體優先順序，以及背景磁碟優先順序的組合，可大為減少使用者登入時的負面影響。許多 Windows 服務，包括背景智慧型傳送、Windows Update 用戶端及 Windows Media® Center，都使用新的啟動類型，以協助改善開機後的登入效能。

關機
困擾 Windows 服務撰寫人員的一個問題，就是在 Windows 關機過程中，預設最多只有 20 秒的時間執行清除。Windows Vista 之前的 Windows 版本並未支援等待所有服務都結束的正常關機，因為設計不良的服務可能會無限期地阻礙關機。某些服務 (例如具有網路相關關機作業或必須將大量資料儲存至磁碟的服務) 可能需要較多的時間，因此 Windows Vista 允許服務要求預先關閉通知。
Windows Vista 關機時，服務控制管理員會先通知那些要求預先關閉通知的服務。它會無時間限制地等候這些服務結束，但是如果服務有錯誤，且並未回應查詢，服務控制管理員就會放棄，並在三分鐘後結束。等到所有服務都結束，或者等待時間已過期，服務控制管理員就會針對其餘服務繼續執行舊式服務關閉。群組原則和 Windows Update 服務會在新的 Windows Vista 安裝中登錄預先關閉通知。
群組原則和 Windows Update 服務也會使用另一項 Windows Vista 服務功能：關閉順序。服務一直都可以指定啟動依存性，服務控制管理員會尊重這些依存性，以能夠滿足服務的順序來啟動服務，但是在 Windows Vista 之前，服務並無法指定關閉依存性。現在，登錄預先關閉通知的服務也可以將自己插入至儲存在 HKLM\System\CurrentControlSet\Control\PreshutdownOrder 的清單中，而服務控制管理員將根據服務的順序來關閉。如需這些服務的詳細資訊，請參閱資訊看板＜識別延遲自動啟動和預先關閉服務＞。

電源管理
睡眠和休眠是其他形式的關機，自從 Windows 2000 將電源管理引進 Windows NT® 系列的 Windows 作業系統後，驅動程式和應用程式中設計不良的電源管理就一直是行動電腦使用者的困擾。許多使用者都希望當他們在旅途中登機前蓋上膝上型電腦的蓋子時，系統能夠進入暫停或休眠狀態，但是等他們到達目的地後，卻發現只是徒勞帶著一個發熱的箱子、電池已沒電，且資料已遺失。這是因為 Windows 一律會要求裝置驅動程式和應用程式同意變更電源狀態，而只要有一個驅動程式或應用程式沒有回應，都會妨礙轉換。
在 Windows Vista 中，核心的電源管理員一樣會通知驅動程式和應用程式電源狀態的變更，以便這些程式能準備好，但是它不會再要求同意。此外，電源管理員會等候 (最多 20 秒) 應用程式回應變更通知，而不是在舊版 Windows 中的等候兩分鐘。因此，Windows Vista 使用者可以更確定其系統會執行休眠和暫停。

接下來
前面已提過，這是三篇一系列文章的第二篇。第一篇討論的是 Windows Vista 核心在 I/O 與處理程序方面的改進。本篇則探討了 Windows Vista 在記憶體管理、啟動和關機方面的增強功能。下一篇我會介紹可靠性和安全性方面的核心變更，為整個系列劃下句點。
識別延遲自動啟動和預先關閉服務
Windows Vista 更新了內建 SC 命令，以顯示設定為延遲自動啟動服務的服務：
Using SC to display start type
Using SC to display start type
可惜的是，SC 命令並不會報告已要求預先關閉通知的服務，不過您可以使用 Sysinternals 的 PsService 公用程式，以檢視服務是否接受預先關閉通知：
Viewing pre-shutdown status
Viewing pre-shutdown status

Mark Russinovich 是 Microsoft 平台服務事業群 (Platform and Services Division) 的技術人員。他是 Microsoft Windows Internals (Microsoft Press，2004) 的共同執筆者，經常在 IT 和開發人員會議上發表演說。身為 Winternals Software 公司的共同創辦人，隨著 Microsoft 最近併購該公司，他也一同加入 Microsoft。他還創立了 Sysinternals，並在該公司發行 Process Explorer、Filemon 和 Regmon 等公用程式。


 編輯的話: 獎盃櫃
編輯的話
獎盃櫃
Joshua Trupin

在我的人生中，大概有三十年 從來沒有得過任何獎項。我的刮刮樂總是出現「銘謝惠顧」字樣。我所買的抽獎糖果包裝紙上，也老是寫著「再試一次」。我在美式足球的季後賽選的是紐約的隊伍 (也是槓龜)。
我的手氣一向不好，所以這次能夠「贏得」獎項當然是「快樂的不得了」。TechNet Magazine 剛剛榮獲技術通訊協會 (Society for Technical Communication，STC) 所頒發的四個獎項。我們在每個月的文章中都注入很多心血，所以能夠獲得認同深感欣慰。我在此要特別謝謝我們的工作同仁和作者，有了他們的努力才有今日的成就。
我們在 2006 年 3/4 月份的文章中，以拼圖海報的方式針對 Active Directory 進行清楚的說明與呈現。結果該海報非常受歡迎 -- 到現在都還有讀者向我們要呢！STC 頒給我們的海報一個優秀軟體參考指南 (Excellence for Software Guides) 獎項。
另外，我們有兩篇文章也都獲得很高的評分。2006 年 8 月份由 Greg Taylor 和 Simon Shepherd 所撰寫的 "Playing with Exchange in a Sandbox"，以及 2006 年 5/6 月份由 Jesper Johansson 和 Steve Riley 撰寫的 "Deconstructing Common Security Myths"，都獲得 STC 的傑出 (Merit) 獎項。
TechNet Magazine 本身更獲得優秀學術與專業期刊的獎項 (Award of Excellence for Scholarly & Professional Journals)。我對於我們獲得的獎項非常地高興，這是我們整個團隊的榮耀。
當然了，我們也不會因而鬆懈。在本月的文章中，Mark Russinovich 將進一步探索 Windows Vista 核心的變更 -- 這是任何涉及桌面部署或支援服務之 IT 專家不可或缺的關鍵資訊。此外，我們也將深入研討 SQL Server 的各種議題，從索引中繼資料至資料表資料分割，以及從高可用性選項至群集的提示，涵蓋範圍甚廣。
在 One TechNet Magazine Plaza 中心，我們幾乎是不眠不休 (趕交期就是這樣)。但是，偶爾我們也希望換一下環境。我們將參與 2007 年 6 月 4-8 日在奧蘭多 (位於美國佛羅里達州) 舉辦的 Microsoft TechoEd (請參閱 microsoft.com/teched)。歡迎共襄盛舉，來認識一下 TechNet Magazine 的得獎編輯和作者們。我們已經規劃好要提供多項贈品和舉辦一些好玩的活動，所以請勿錯過 -- 您可能就會是下一位得獎者/贏家喔！-JOSHUA TRUPIN
感謝下列 Microsoft 技術專家： Vijay Bharadwaj、Paul Bowden、Elden Christensen、Manish Karla、Michael Murgolo、Rajeev Nagar、John Peng、Mark Russinovich、Abraham Samuel、Mark Scurrell、Jim Truher、George Walters 及 Buck Woody。

Joshua Trupin


 工具箱: 適合 IT 專家的新產品
工具箱
適合 IT 專家的新產品
Greg Steen

管理網路同步處理
ViceVersa Pro
www.tgrmn.com

除非您的基礎結構只包含單一主機，否則您很可能常常需要在環境中移動檔案。從記錄檔到應用程式發行，乃至於資料庫備份，資料總是不斷在網路中移動。重要的是，您必須知道要複製哪些內容，好讓不同環境保持同步化。對於大部分的 IT 專業人員而言，根本不會考慮在多個環境中手動移動這些檔案，遑論這種做法本身就很不可取，因為它可能會導致同步處理問題。
TGRMN Software 推出的 ViceVersa Pro 可讓您輕鬆自動化及安排這些工作。這個應用程式可提供四種不同的複製模式。「基本同步處理 (Basic Synchronization)」可為您提供來源至目標的同步處理功能，而「進階同步處理 (Advanced Synchronization)」模式則提供雙向的檔案與目錄同步處理以及檔案追蹤功能。另外還有兩個模式：「備份 (Backup)」(此模式會鏡像處理來源) 和「彙總 (Consolidation)」。
「備份」模式會將來源鏡像處理至目標，並從該目標新增和刪除檔案，但您也可以選擇使用檔案複寫，只將檔案複製到目標。如果您的使用者意外刪除檔案，這個功能便很有用。雙向同步處理所執行的作業正如名稱所述，其中還有衝突和刪除追蹤功能。如果在下一次執行同步處理之前，來源與目標雙方的檔案都發生變更，此時會出現衝突情況，並讓您手動調解這個問題。「彙總」方法類似雙向同步處理，但不會追蹤衝突或刪除動作。
Protect against copy errors and data loss
Protect against copy errors and data loss
透過「備份」模式的檔案壓縮與檔案加密等整合功能，ViceVersa Pro 能夠輔助記錄傳送工作。此應用程式可將來源檔案壓縮成標準的 Gzip 格式，然後使用密碼加以保護。
應用程式中也隨附妥善整合的檔案比對功能，不過您也可以根據自己的喜好將 ViceVersa Pro 設為使用外部檔案比對程式。為了支援全域環境，ViceVersa 可處理 Unicode 字元以及超過 256 個字元的路徑。此應用程式也針對網際網路時間同步處理提供內建支援，您可以將它設為指向本機 NTP 電腦或任何外部 NTP 伺服器 (只要您允許應用程式環境的輸出要求)。
有時候頻寬的使用量是考量重點，尤其當您的流量會流經 VPN 或 WAN 時。在這種情況下，ViceVersa 可讓您調整應用程式用於各個同步處理工作的頻寬量。這樣也有助於確保正在進行複製作業的目標及來源伺服器，能夠維持實際操作環境等級的回應。或者，您也可以選擇設定最大的 CPU 使用閾值，這樣也能在執行應用程式的同時確保伺服器的可用性。
ViceVersa Pro 會利用安全複製演算法，來防範複製錯誤與資料遺失。應用程式還會執行循環重複性檢查，來確認資料的完整性。您可以根據任何執行間隔來安排同步處理工作，其中也包括即時模式 (這個模式會在同步處理資料夾中的檔案被新增或刪除時進行同步化)。
ViceVersa Pro 還有一項很棒的功能，就是它的 UI 可讓您在執行所有作業前先行預覽。這樣可確保您複製的是所需的內容；沒有人願意見到系統目錄中儲存了好幾 GB 的記錄檔。
總而言之，若您要尋找低價位但功能完備的同步處理工具，ViceVersa Pro 應該能滿足您的需求。
價格：單一使用者授權為 $59.95 美元。

管理您的系統磁碟
Partition Manager 8.0 Professional Edition
www.partition-manager.com/corporate/professional
如果您想尋找用來管理系統磁碟的應用程式，Paragon Software Group 推出的 Partition Manager 8.0 Professional Edition 絕對值得參考。
這款 Windows® 架構的應用程式提供直覺式的精靈引導介面，可讓您輕易地建立、刪除、變更可視性，以及格式化硬碟分割 (無論是 FAT16/32、NTFS、Ext2/3 或 HPFS 格式皆可)，這些都是應用程式的核心功能。您也可以調整現有磁碟分割的大小，或將磁碟分割從某個磁碟移至另一個磁碟。
您還可以更進一步轉換檔案系統類型，例如從 FAT16/32 轉換成 NTFS，或從 Ext3 轉換成 Ext2，反之亦然。跨磁碟複製磁碟分割的這個動作，會自動將磁碟分割的大小調整為該磁碟的大小，這個特性對於擴充系統上的資料磁碟很方便，因為無須手動複製所有檔案。8.0 版還有另一項實用的功能，就是能夠執行「即時重新調整大小 (Hot Resize)」，這可讓您不須重新啟動 Windows 就能增加使用中的 NTFS 磁碟分割大小。
Increase the size of an active NTFS partition — without rebooting
Increase the size of an active NTFS partition — without rebooting
Pro Edition 還有一項好用的功能，就是您可以在 Windows 2000、Windows XP 及 Windows Server® 2003 用戶端上，將動態磁碟轉換成基本磁碟。Partition Manager 至少支援高達 500GB 的磁碟 (這是 Paragon 的測試限制，並非實際的實體限制)，此外也支援 FireWire 和透過 USB 連接的磁碟機。Partition Manager 可以支援 PATA (IDE)、SATA 和 SCSI 硬碟。
Partition Manager 可讓您建立修復光碟 (或是 DVD，甚至是磁碟片)，以便在發生嚴重磁碟損毀時利用此修復光碟來還原系統。或者，若您不小心刪除磁碟分割，但是系統仍在運作中，此時您可以透過這個介面來復原磁碟分割。您還可以變更磁碟的叢集大小，藉此微調效能。應用程式也提供「虛擬前置執行」檢視，可讓您在實際對磁碟執行動作之前，先評估要針對磁碟進行的變更。
您也可以使用 Partition Manager 8.0 升級硬碟。此應用程式可讓您複製某個磁碟分割或整個硬碟影像到新磁碟，並根據目標磁碟分割的情況來調整其大小。
最後，Partition Manager 還包含內嵌磁碟重組工具，可用來重組使用空間已達 99% 的磁碟，不過您最好是在磁碟變成這種狀態之前先採取因應措施。
價格：Professional Edition 為 $99.95 美元。

新增自動完成功能至 SQL 編輯器
SQL Prompt：適用於 SQL 的 IntelliSense
www.red-gate.com/products/SQL_Prompt/index.htm

所有資料庫都應該根據標準化的格式並以合乎邏輯的命名慣例來建立和建構，這樣的想法很誘人，但可惜的是，我們都知道現實並非如此。我在擔任系統管理員或資料庫管理員的職務時，發現自己在建立或執行查詢時，常常必須回頭查看資料表結構，就連擔任開發人員的工作時更是如此。
雖然 SQL Server™ Management Studio for SQL Server 2005 已經將物件瀏覽器與介面的樹狀檢視部分相互整合，讓每日的工作更輕鬆，但我還是希望能使用慣用的 Visual Studio® IDE 功能：IntelliSense®。幸好，Red-Gate Software 提供的 SQL Prompt 可讓您在 Microsoft SQL Server 編輯器中啟用自動完成功能。
這個應用程式會在工作列中執行，並偵測您開始使用編輯器的動作。首先，SQL Prompt 會詢問有關資料庫的連線資訊，以便連出並快取所有物件資料。這樣可提高效能並減少負荷，但如果您不斷修改資料庫執行個體上的物件，您必須記得要清除快取 (這個動作很簡單，只需要按滑鼠兩次)，才會在提示清單上看到變更結果。
除了 Visual Studio IDE、Enterprise Manager、Query Analyzer 及 SQL Server Management Studio 以外，SQL Prompt 也可以直接與 UltraEdit 和 EditPlus 2 整合。在 [設定 (Settings)] UI 的 [選項 (Options)] 索引標籤上，您可以指定用來觸發候選清單的 SQL 關鍵字 (例如 FROM、JOIN、EXEC...等等)。在 SQL JOINS 上觸發 SQL Prompt 甚至還可提供 ON 陳述式 (前提是您已設定參考，或欄位的名稱相同)。您也可以在此設定文字捷徑以供程式碼片段插入之用。例如，應用程式會將 "ssf" 加上 Tab 鍵設為拼出 "SELECT * FROM"。您也可以讓 SQL Prompt 自動將您輸入的 SQL 關鍵字轉換成大寫。這項功能和程式碼片段絕對會為您省下許多時間。
在 [設定 (Settings)] UI 的 [候選 (Candidates)] 索引標籤上，您可以設定是否讓 SQL Prompt 使用以下格式：完整格式的資料行名稱，包含擁有者/結構描述資訊的前置詞、以方括弧括住您的名稱，您甚至還可以設定候選清單中要顯示哪些類型的 SQL 函數。若您使用 SQL，可以考慮將這項工具納入您的百寶袋中。
SQL Prompt 在 3.0 版發行前都是免費提供，此工具在本文撰寫的同時，已邁入最後測試版階段。3.0 版的售價尚未公佈
價格：免費。

計算頁面大小
Atomic Web Page Size Calculator
www.info-pack.com/pagesize
雖然使用者頻寬越來越大，而且透過新技術的開發，網頁內容的傳送速度也越來越快，不過頁面大小仍然是很重要的一環。這些零星的位元組一旦加總起來，可能對高流量的網站造成很大的頻寬負擔。
Info-pack.com 推出的 Atomic Page Size Calculator 公用程式，提供低成本、簡單的方法來檢查您的網站頁面大小。您只需要輸入想要查詢大小的網頁 URL，這個程式便會抓取網頁並計算所有項目的大小，包括任何外部參考的影像 (這些項目可能不會顯示在您的主要網域的網頁記錄中)。
Keep an eye on bandwidth cost
Keep an eye on bandwidth cost
此計算工具支援頁面、影像及 JavaScript 檔案，因此可讓您取得網頁上大部分資源的資料。這個應用程式也會通知您發生 404 錯誤訊息：資源連接中斷的情況。取得 URL 的大小資訊後，按一下 [報告 (Report)] 按鈕即可查看大小細項資料，以及在各種連線速度下，下載 URL 所需的預估時間。
要是應用程式能夠同時處理多個 URL 就更好，但這也許只能寄望於未來版本。如果您正在尋找一種可快速檢查開發小組所設計之頁面大小的方法，建議您選用這個應用程式。
價格：直接售價 $19.95 美元。

與工具箱連絡
如果您想要推薦喜愛的工具或公用程式，請將郵件寄到 tntools@microsoft.com 給作者。
Greg Steen 是一位技術專家和企業家，為人十分熱心。他總是四處探尋新的工具和方法，協助 IT 專業人員更輕鬆地進行作業及開發。


 公用程式焦點: SyncToy
公用程式焦點
SyncToy
Jay Munro
下載本文程式碼: SynctToy (971KB)

有一個令人頭痛的問題 ，讓每位 IT 專家、網路系統管理員和技術人員都深受其擾，那就是接到使用者來電，說他電腦出了問題但沒有備份。即使是最老練的 IT 人員，要讓他將工作內容儲存到網路上而非本機電腦上也很困難。此時 SyncToy 可派上用場。
SyncToy 最初的設計目的是為了同步處理相機、電腦和外接式磁碟機上的數位相片，它能提供有彈性且可靠的方式來備份幾乎所有類型的檔案。SyncToy 可在 Windows Vista™ 以及 Windows® XP 和 Windows Server® 2003 上執行，並可搭配使用本機、外接式或 USB 磁碟機，以及網路或工作群組共用磁碟機。
SyncToy 使用成對資料夾架構，可讓您指定左邊和右邊目錄。您可以視需要建立很多資料夾組合，而且只要按一下按鈕，即可同步處理其中一個或所有資料夾組合。若要建立資料夾組合，您可以遵循四步驟速成精靈的引導，在過程中輸入或貼上路徑，或是針對左邊和右邊資料夾瀏覽至特定位置。SyncToy 可以識別 UNC 檔案命名 (例如 \\MyServer\Joe_smith\backup\) 以及本機磁碟對應和路徑 (E:\doc_backup)。輸入路徑之後，您要選擇 SyncToy 在比較資料夾時所執行的五種動作之一：
同步化 (Sync) 複製雙方目錄中新的和更新的檔案。若您重新命名或刪除某個資料夾中的檔案，同樣的動作也會在另一個資料夾中執行。
回應 (Echo) 複製新的和更新的檔案，但只針對左邊資料夾中的刪除和重新命名動作，在右邊資料夾中執行同樣的動作。
訂閱 (Subscribe) 從右邊資料夾複製更新的檔案到左邊資料夾，但前提是左邊資料夾已經包含原本的檔案。左邊資料夾中所做的變更將不會複製到右邊資料夾。
貢獻 (Contribute) 將左邊資料夾中新的和更新的檔案複製到右邊資料夾，但忽略刪除動作。
結合 (Combine) 將某電腦中的檔案複製到不包含這些檔案的其他電腦上，藉此讓多部電腦保持一致性。在某電腦上被刪除或重新命名的檔案，將不會影響其他電腦上的檔案，也不會被複製。
選取上述動作之後，為資料夾組合取個易記的名稱，便完成設定了。SyncToy 目前還無法讓您在建立資料夾組合之後編輯路徑或變更名稱，因此如果設定錯誤，請選取該資料夾組合，按一下 [刪除 (Delete)]，然後重新建立。您可以設定的選項包括要包含的檔案及子目錄，還有是否將覆寫的檔案儲存到資源回收筒中 (預設會開啟此功能)。
Synchronizing files with SyncToy
Synchronizing files with SyncToy

主要的 SyncToy 對話方塊會在左方顯示資料夾組合，以及此選定組合的路徑、選項和動作。[所有資料夾組合 (All Folder Pairs)] 選項會列出您全部的資料夾組合，您可以針對核取的組合執行 [預覽 (Preview)] 或 [全部執行 (Run All)]。跟您想的一樣，[預覽 (Preview)] 會模擬一遍同步處理的動作，但不會真的進行變更。如果您要設定自動化同步處理排程，執行這個動作絕對有幫助。因為 [預覽 (Preview)] 會顯示報告，告訴您將會執行哪些作業。如果報告結果無誤，則按一下 [執行 (Run)]。
排程並非內建功能，不過說明檔有提供使用 Windows Vista 和 Windows XP 排程器的清楚逐步指引。沒有技術背景的使用者可能需要旁人協助以完成此設定，但您只需進行這項手續一次，因為排定之後，SyncToy 本身就會自動執行資料夾組合、動作及選項的所有變更。
正如所有 Power Toys 產品一樣，SyncToy 的撰寫方式雖然符合一般發行軟體的相同標準，但並不受 Microsoft 支援，您必須從社群論壇及說明文件中取得協助。所以您得要自立自強。說明檔是針對所有使用者程度而撰寫，並且詳盡地敘述各項功能。直覺式的 UI 設計可讓您第一次使用就能掌握基本功能。
快來下載 SyncToy，對您的使用者示範如何備份檔案吧！如此一來，您就可以高枕無憂。

Jay Munro 是 Windows 使用者輔助資源小組的作者成員，專長是 Internet Explorer。他之前曾擔任 PC Magazine 試驗室的專案領導人


 SQL 問題與解答: 日光節約時間、伺服器記憶體...等等
SQL 問題與解答
日光節約時間、伺服器記憶體...等等
由 Nancy Michell 編輯

日光節約時間
問：美國為配合 2005 年能源政策法案 (Energy Policy Act of 2005)，即將轉變日光節約時間 (DST)，請問我是否要更新 SQL Server™？
答：不用。目前並不需要特定的 SQL Server 更新來支援 DST 的變更。SQL Server 的時間相關資料仰賴基礎作業系統，也就是說，只要作業系統的日期和時間正確，SQL Server 就會使用相同的值。為了配合即將到來的 DST 變更，您需要更新 Windows®，如 support.microsoft.com/kb/928388 中所述。所有 Windows Vista™ (已包含變更內容) 以前的 Windows 作業系統都必須更新，以符合 DST 的改變，其中也包括執行 SQL Server 的系統 (澳大利亞也正在進行某些變更。請參閱 support.microsoft.com/kb/912475)。

使用 Windows Vista 進行連接
問：我已經安裝 Windows Vista，而現在卻無法在系統上連接到 SQL Server 2005。我是本機管理員，過去曾經執行相同的連接作業，當時完全沒有任何問題。怎麼會這樣呢？
答：這是 Windows Vista 和尚未安裝 Service Pack 2 (SP2) 之 SQL Server 2005 的預期行為。Windows Vista 具有新的安全性模型 (使用者帳戶控制項)，這會在本機管理員群組中設陷，鎖定您的成員資料，並要求您確認需要管理權限的作業。如果您按一下 [允許] 按鈕，您的認證以及管理員 Token 就會一起傳送給應用程式。SQL Server Management Studio (SSMS) 則不會顯示對話方塊，因為單純執行工具並不需要管理權限。問題在於 SQL Server 2005 系統管理員角色在預設的情況下，即包含作業系統的本機管理員群組，這也是過去您的帳戶用來存取 SQL Server 的群組。既然 Windows Vista 不傳送該權限，也就無法存取。
請注意，在未安裝 SP2 的情況下，Windows Vista 無法支援 SQL Server 2005，而且 SP2 具有一項工具可為您加入自己的帳戶。 若您仍在等待 SP2，這個修復方式非常簡單。您的個人 Windows 使用者帳戶必須加入 SQL Server 中，以您的情況而言是設定為系統管理員的角色。方法是以滑鼠右鍵按一下 [SQL Server Management Studio]，再以管理員身分選取 [執行]。連接到 SQL Server，並將您的 Windows 帳戶加入系統管理員角色。請參閱《SQL Server 線上叢書》以取得運作方法的相關資訊。

有檢視的交易式複寫
問：如果我有已發行的檢視，並進行更新，我知道交易將會進行複寫。但如果我更新此檢視的基底資料表，是否會複寫交易呢？另外，如果我有已發行的資料表並建立其檢視，而我更新了檢視而非基底資料表，這樣又是否會複寫交易？
答：假設基底資料表設定為發行集的某個發行項 (也就是同時也設定複寫基底資料表)，那麼該基底資料表的所有更新都會複寫。
在複寫檢視的時候，根據預設，複寫檢視時只會包含檢視的結構描述部分，或者檢視背後的程式碼，而不是其基礎資料 (除非是索引檢視)。如此一來，即使未經複寫，不論您在何時更新檢視 (在此例中指的是將檢視當作目標來執行 Data Manipulation Language (DML) 陳述式)，其實真正更新的是基礎資料表的資料，而不是檢視。檢視只不過是查詢陳述式的邏輯儲存體，並未附加實體儲存體 (再次說明，除非您使用的是索引檢視)。

最大伺服器記憶體
問：我的電腦目前執行 Windows Server® 2003 和 SQL Server 2000，共有 5GB 的 RAM。假設我使用 /3GB 參數來增加使用者模式虛擬位址空間、用 /PAE 參數載入 Windows 核心的實體位置延伸 (Physical Address Extension，PAE) 版本，以及啟用 Address Windowing Extensions (AWE) 並設定為 1 (且在記憶體中啟用鎖定頁面)。在 AWE 已啟用的情況下，最大伺服器記憶體選項是否僅會設定資料快取的大小，或是會設定所有緩衝區快取的大小 (資料、處理序、工作階段...等等)？既然只有資料快取可以利用 AWE 對應記憶體，如果我將最大伺服器記憶體設定為 4GB，那麼資料快取是否僅會使用 1GB (由 AWE 對應的部分)，或者可以運用這多出來的 1GB，並持續使用或在標準定址空間內與其他所有記憶體取用者競爭？
答：最大伺服器記憶體一律會限制整體緩衝集區大小；不過唯一可運用 AWE 對應記憶體的取用者，只有資料快取而已。
因此針對第一個問題，即使 AWE 已啟用，最大伺服器記憶體仍會限制整體緩衝集區，但是非資料快取的取用者則永遠不可使用任何 AWE 對應記憶體。
針對第二個問題，資料快取會使用 AWE 對應記憶體，加上在其他緩衝集區內、由 SQL Server 判斷為適用的記憶體；資料快取不受限於 AWE 記憶體，只是它正好是唯一可運用 AWE 記憶體的取用者而已。如果您不確定 /3GB 參數的功能，請參閱 Raymond Chen 的部落格。

設定檔與效能
問：我有在實際的 SQL Server 2005 中執行鏡像作業。當我在資料庫電腦上啟動 SQL Server Profiler，並將追蹤資料寫入檔案時，我發現效能會急遽降低。為什麼會這樣？
答：效能是否降低，端視執行 Profiler 的位置。如果您在伺服器電腦上以互動方式執行，那麼 Profiler UI 會同時在伺服器上耗用記憶體和 CPU，因而影響效能。
若您是在工作站上以互動方式執行 Profiler，就需要在網路上傳遞事件資訊。這會影響輸送量。如果這個網路就是您用來進行鏡像的網路，則也會造成鏡像效能的影響。此外，如果您在網路共用上儲存 Profiler 的輸出，亦等於在網路上傳遞資料，並且會對效能產生負面影響。
減緩這些問題的最佳方式，或許是在執行要建立設定檔之執行個體的伺服器上，以非互動方式執行 Profiler，然後將輸出導向本機檔案。這仍會取用伺服器資源，但這種方法造成的影響通常最小。而且這也比 (記憶體內部) Profiler 追蹤的效果要好上許多。檔案追蹤可以更有效率的使用系統記憶體；它具有更大的緩衝區，且可以更有效的排清至磁碟中，此外，這不需要依賴外部處理序 (例如 SQL Server Profiler)。
最後，追蹤資料會在 Profiler 仍在進行設定檔作業時寫入磁碟檔案。透過共用追蹤檔案，其他人就能從遠端看到即時的設定檔資料。如果您以互動方式呼叫追蹤檔案，就表示您已手動叫用 Profiler，並於螢幕上檢視輸出。追蹤可以利用程式設計的方式建立，而看不到實際的結果，這就是為什麼我們應該以非互動方式執行。
您可以在本機目錄上建立共用，讓其他人存取該處的檔案，這通常不會有問題。如上所述，您不應該將追蹤輸出傳送到遠端共用的檔案，尤其當該檔案需要透過鏡像用的相同網路管道存取。
您也應該僅選取調查所需的必要事件組，盡量減少涉及的數量。至於追蹤檔案的位置，應選擇系統上最快速的磁碟機 (最好不要和 SQL Server 資料庫及交易記錄磁碟機相同)。若您仍然覺得效能嚴重降低，請將事件分割為兩個以上的追蹤，並分別以不同的硬碟為目標。即使追蹤的目標硬碟相同，仍可藉由分割，讓每個追蹤分別使用個別的緩衝區。詳細資訊請參閱 sp_trace_create 及《SQL Server 線上叢書》的其他相關主題。

叢集問題
問：我嘗試在執行 Windows Server 2003 的叢集上安裝 SQL Server，但每次嘗試都會出現錯誤訊息：「安裝程式在一或多個叢集節點上無法執行必要的作業」。而 sqlstp.log 中只出現：
Script file copied to '\\SERVER01\ADMIN$\SERVER01_MSSQLSERVER.iss' successfully.
Installing remote service (SERVER01)...
An error occured in the service create (SERVER01): 1069...
究竟發生什麼問題？
答：此處出現錯誤有幾項可能因素。安裝程式會在所有選取的節點上安裝 Windows NT® Service，以便透過遠端模式個別電腦上管理安裝程序。因此，您必須注意幾項可能遇到的阻礙。
第一，您的網域帳戶使用者可能有拒絕「以服務登入」權限的群組原則 (請記得網域原則會覆寫您的本機原則)。請確定您使用的帳戶沒有上述限制。
第二，您執行安裝程式的電腦登入帳戶，必須具備所有節點的管理員存取權，原因如下：主要安裝程序中需要所有電腦的遠端登錄存取權；安裝程式會將 cnvsvc.exe 複製到遠端電腦的 Windows 目錄；或者安裝程式會使用僅以登入帳戶權限來存取遠端電腦的標準 Windows API。基於上述原因，您都應該根據預設在所有模式中以管理員身分登入。

損毀修復計劃
問：我正在考慮是要使用資料庫鏡像 (非同步模式) 或是記錄傳送，為我的 SAP 資料庫實作損毀修復 (DR) 策略。我的實際執行與 DR 站台，將擁有 100Mb 寬頻連線，這並非鏡像工作階段專屬使用。連線將由不同鏡像工作階段共同使用，甚至還要與其他 DR 伺服器共用。
如果產生網路問題，導致登入記錄無法傳送到鏡像資料庫，是否會自動重試？
鏡像工作階段暫停時，是否會有任何保留期限？此外，除了系統檢視，是否有其他記錄資訊可以用來監視鏡像流量以及記錄檔記錄的傳輸？
答：首先讓我們來回答這個問題：為什麼會需要重試資料庫鏡像作業？您可以從兩方面來看：第一，若發生暫時性的網路問題，鏡像工作階段的狀態就會變成中斷連接。預設網路逾時值為 10 秒鐘，也就是說，記錄將無法從主體資料庫傳送到鏡像資料庫。在這樣的情況下，主體會繼續以「公開」模式執行，而交易則會在用戶端認可。一旦解決網路問題，鏡像工作階段就會自動重試，不需要使用者介入。該工作階段會試圖使用記錄檔記錄來趕上進度；夥伴電腦則會先同步處理，一旦跟上就會將狀態改變為已同步。
第二，如果有重做問題，鏡像工作階段狀態則為暫停。重做問題表示鏡像資料庫無法在自己的資料庫中認可記錄檔記錄。重做問題主要是由於找不到實體檔案，或者磁碟空間不足而導致。在這樣的情況下，主體會繼續以公開的模式執行，因此交易會在用戶端認可。手動修復鏡像伺服器的重做問題之後，鏡像工作階段會需要使用者介入：
ALTER DATABASE <db> SET PARTNER RESUME;
至於保留期限，答案是不論鏡像工作階段是否已中斷連接或已暫停，都會保留記錄，直到工作階段還原，且從工作階段暫停到恢復之間的所有記錄都寫入鏡像伺服器為止。基本上，鏡像工作階段中斷連接或暫停時，將無法截斷主體的記錄，因為這樣有可能打斷記錄的重做鏈結。這表示主體的記錄會在未繫結的情況下成長，直到工作階段還原為止。因此，事實上鏡像工作階段並沒有保留期限的限制；唯一真正的條件約束是主體伺服器用來儲存記錄的磁碟空間，因為記錄無法截斷。
最後，並沒有特定記錄檔可用來監視鏡像。SQL Server 2005 專為此目的，提供名為 Database Mirroring Monitor 的 GUI 工具，讓系統管理員可以檢視與更新狀態，以及為多個主要效能指標上設定警告臨界值。藉此即可在鏡像執行不當時收到警示。與資料庫鏡像相關的主要效能疑慮，是記錄檔記錄能否即時處理。如需監視資料庫鏡像的詳細資訊，請參閱 Monitoring Mirroring Status 文章，網址為 msdn2.microsoft.com/fr-fr/library/ms365781.aspx。

感謝下列 Microsoft IT 專家的技術協助： Chad Boyd、Sandu Chirica、Alan Doby、Kaloian Manassiev、Luciano Moreira、Ivan Penkov、Sivagaminathan Rajarethinam、Deborah To、Patrick Woodward、Buck Woody、Stanley Yau 以及 Warren Young。


 The Cable Guy: DHCPv6 通訊協定
The Cable Guy
DHCPv6 通訊協定
Joseph Davies

動態主機設定通訊協定 (DHCP) 是設計來負責將 IP 位址和其他網路資訊指派給電腦，以便在網路上自動進行通訊。有了 IPv6 網路，您並不需要 DHCP 來設定位址，但它還是有許多不錯的用途。DHCP for IPv6 (DHCPv6) 可以
提供可設定狀態的位址組態或無狀態的組態設定給 IPv6 主機。IPv6 主機可以使用幾種方法來設定位址：
無狀態位址自動設定 是用來設定連結本機位址和其他非連結本機位址，其做法是與鄰近路由器交換路由器請求和路由器通告訊息。
可設定狀態的位址自動設定 是透過使用 DHCP 之類的設定通訊協定，來設定非連結本機位址。
IPv6 主機會自動執行無狀態位址自動設定，並根據鄰近路由器所傳送之路由器通告訊息中的下列旗標來使用 DHCPv6 之類的設定通訊協定：
管理的位址設定旗標，亦稱為 M 旗標。此旗標設定為 1 時，會指示主機使用設定通訊協定以取得可設定狀態的位址。
其他可設定狀態設定旗標 ，亦稱為 O 旗標。此旗標設定為 1 時，會指示主機使用設定通訊協定以取得其他組態設定。
結合 M 和 O 旗標的值會產生下列結果：
M 和 O 旗標都設為 0。 此組合會對應到沒有 DHCPv6 基礎結構的網路。主機會針對非連結本機位址使用路由器通告，並使用其他方法 (例如手動設定) 來進行其他設定。
M 和 O 旗標都設為 1。 DHCPv6 是用於位址和其他組態設定。此組合即所謂的 DHCPv6 可設定狀態，其中 DHCPv6 會指派可設定狀態的位址給 IPv6 主機。
M 旗標設為 0，而 O 旗標設為 1。 DHCPv6 不是用來指派位址，只是指派其他組態設定。鄰居路由器是設定為通告非連結本機位址首碼，IPv6 主機會從中衍生無狀態位址。此組合即所謂的 DHCPv6 無狀態：DHCPv6 不是指派可設定狀態的位址給 IPv6 主機，而是無狀態組態設定。
M 旗標設為 1，而 O 旗標設為 0。 在此組合中，DHCPv6 是用於位址設定，而不是其他設定。因為 IPv6 主機通常需要進行其他設定，例如網域名稱系統 (DNS) 伺服器的 IPv6 位址，所以這是不太可能的組合。
就像 DHCP for IPv4 一樣，DHCPv6 基礎結構的元件包含要求設定的 DHCPv6 用戶端、提供設定的 DHCPv6 伺服器和 DHCPv6 轉接代理，當用戶端位於沒有 DHCPv6 伺服器的子網路時，DHCPv6 轉接代理會在用戶端與伺服器之間傳達訊息。

DHCPv6 訊息
就像 DHCP for IPv4 一樣，DHCPv6 會使用「使用者資料包通訊協定 (UDP)」訊息。DHCPv6 用戶端是在 UDP 連接埠 546 接聽 DHCP 訊息。DHCPv6 伺服器和轉接代理則是在 UDP 連接埠 547 接聽 DHCPv6 訊息。DHCPv6 訊息的結構比 DHCP for IPv4 簡單多了，後者的來源是在 BOOTP 通訊協定中，以支援無磁碟工作站。[圖 1] 顯示用戶端與伺服器之間傳送的 DHCPv6 訊息的結構。
Figure 1 DHCPv6 messages between client and server
Figure 1 DHCPv6 messages between client and server
[1 位元組訊息類型] 欄位表示 DHCPv6 訊息的類型。[3 位元組交易識別碼] 欄位是由用戶端決定，並用來將 DHCPv6 訊息交換的訊息加以分組。在 [交易識別碼] 欄位後面的 DHCPv6 選項，是用來表示用戶端和伺服器識別、位址以及其他組態設定。如需定義之 DHCPv6 選項的清單，請參閱「DHCPv6 RFC 資源」資訊看板中所參照的 RFC 3315。
DHCPv6 選項是以類型長度值 (TLV) 格式進行格式化。[圖 2] 顯示 DHCPv6 選項的結構。
[2 位元組選項程式碼] 欄位表示特定的選項。[2 位元組選項長度] 欄位表示 [選項資料] 欄位的長度 (以位元組為單位)。[選項資料] 欄位包含選項的資料。
在轉接代理和伺服器之間交換的訊息有個別的訊息結構來記錄其他資訊。[圖 3] 顯示這幾種訊息的結構。
Figure 2 Structure of DHCPv6 options
Figure 2 Structure of DHCPv6 options
[1 位元組躍點計數] 欄位表示已接收訊息的轉接代理數目。接收的轉接代理若發現訊息超出已設定的最大躍點計數，就會捨棄該訊息。[16 位元組連結位址] 欄位包含一個非連結本機位址，該位址會指派給連接到用戶端所在之子網路的介面。從 [連結位址] 欄位，伺服器可以決定指派位址的正確位址範圍。[16 位元組對等位址] 欄位包含原始傳送訊息之用戶端或轉接訊息之先前轉接代理的 IPv6 位址。除了 [對等位址] 欄位之外，還有包含 [轉接訊息] 選項的 DHCPv6 選項，[轉接訊息] 選項會包含轉接的訊息及其他選項。[轉接訊息] 選項提供在用戶端與伺服器之間交換的訊息的封裝。
並未定義 IPv6 的廣播位址。因此，原本 DHCPv4 訊息使用的有限廣播位址，在 DHCPv6 已改成使用 All_DHCP_Relay_Agents_and_Servers 位址 FF02::1:2。例如，嘗試在網路上搜索 DHCPv6 伺服器位置的 DHCPv6 用戶端，會將 [請求] 訊息從它的連結本機位址傳送到 FF02::1:2。如果主機的子網路上有 DHCPv6 伺服器，它就會接收 [請求] 訊息，並會傳送適當的回覆。更典型的情況是，主機的子網路上的 DHCPv6 轉接代理會接收請求訊息，然後將它轉送到 DHCPv6 伺服器。
Figure 3 Structure of messages between relay and server
Figure 3 Structure of messages between relay and server

可設定狀態的訊息交換
為了取得 IPv6 位址和組態設定而進行的 DHCPv6 可設定狀態的訊息交換 (若接收之路由器通告中的 M 和 O 旗標都設為 1) 通常會包含下列訊息：
  • 由用戶端傳送來尋找伺服器的 [請求] 訊息。
  • 由伺服器傳送的 [通告] 訊息，指出它可以提供位址和組態設定。
  • 由用戶端傳送的 [要求] 訊息，來向特定伺服器要求位址和組態設定。
  • 由要求的伺服器傳送的 [回覆] 訊息，其中包含位址和組態設定。
如果用戶端和伺服器之間有轉接代理，轉接代理就會傳送伺服器 [回覆轉寄] 訊息，其中包含來自用戶端封裝的 [請求] 訊息和 [要求] 訊息。伺服器會傳送轉接代理的 [轉接回覆] 訊息，其中包含針對用戶端封裝的 [通告] 訊息和 [回覆] 訊息。如需 DHCPv6 訊息的完整清單，請參閱 [圖 4]。
Figure 4 DHCPv6 訊息 (Close Figure 4)

DHCPv6 訊息 | 描述 | 同等的 DHCP for IPv4 訊息
請求 | 由用戶端傳送來尋找伺服器。 | DHCPDiscover
通告 | 伺服器為了回應 [請求] 訊息而傳送，以指出可用性。 | DHCPOffer
要求 | 由用戶端傳送來向特定伺服器要求位址或組態設定。 | DHCPRequest
確認 | 由用戶端傳送給所有伺服器，以判斷用戶端的設定對連接的連結是否有效。 | DHCPRequest
更新 | 由用戶端傳送到特定伺服器，以延長指派位址的存留時間並取得更新的組態設定。 | DHCPRequest
重新連結 | 當未接收到 [更新] 訊息的回應時，由用戶端傳送到伺服器。 | DHCPRequest
回覆 | 由伺服器傳送到特定用戶端，以回應 [請求]、[要求]、[更新]、[重新連結]、[資訊要求]、[確認]、[釋放] 或 [拒絕] 訊息。 | DHCPAck
釋放 | 由用戶端傳送，以指出用戶端已不再使用指派的位址。 | DHCPRelease
拒絕 | 由用戶端傳送到特定伺服器，以指出已使用指派的位址。 | DHCPDecline
重新設定 | 由伺服器傳送到用戶端，以指出伺服器有新的或更新的組態設定。然後，用戶端會傳送 [更新] 訊息或 [資訊要求] 訊息。 | N/A
資訊要求 | 由用戶端傳送來要求組態設定 (但非位址)。 | DHCPInform
轉接轉寄 | 由轉接代理傳送來轉寄訊息給伺服器。[轉接轉寄] 會包含封裝為 DHCPv6 [轉接訊息] 選項的用戶端訊息。 | N/A
轉接回覆 | 由伺服器傳送，以透過轉接代理傳送訊息給用戶端。[轉接回覆] 會包含封裝為 DHCPv6 [轉接訊息] 選項的伺服器訊息。 | N/A

無狀態訊息交換
只為了取得組態設定而進行的 DHCPv6 無狀態訊息交換 (若接收之路由器通告中的 M 旗標設為 0 且 O 旗標設為 1) 通常會包含下列訊息：由 DHCPv6 用戶端傳送來向伺服器要求組態設定的 [資訊要求] 訊息，以及由伺服器傳送並包含所要求之組態設定的 [回覆] 訊息。
針對已設定路由器指派無狀態位址首碼給 IPv6 主機的 IPv6 網路，可利用雙訊息 DHCPv6 交換來指派 DNS 伺服器、DNS 網域名稱和其他組態設定，這些設定並不包含在路由器通告訊息中。

Windows 中的 DHCPv6 支援
Windows Vista™ 和下一版的 Windows Server® (代號 "Longhorn") 包括 DHCPv6 用戶端。DHCPv6 用戶端會根據接收之路由器通告訊息中的 M 和 O 旗標值，來嘗試使用 DHCPv6 設定。因此，若要使用 DHCPv6，您必須設定 DHCPv6 伺服器及轉接代理來為每一部 IPv6 子網路提供服務，然後設定 IPv6 路由器，將這兩個旗標設為其適當值。如果給定的子網路有多個通告路由器，它們應該設定為通告相同的無狀態位址首碼及 M 和 O 旗標值。執行 Windows® XP 或 Windows Server 2003 的 IPv6 主機不包括 DHCPv6 用戶端，因此，在接收的路由器通告中，會忽略 M 和 O 旗標值。
您可以使用 "netsh interface ipv6 set interface InterfaceName managedaddress=enabled" 命令，設定執行 Windows Vista 或 Windows Server "Longhorn" 的 IPv6 路由器在路由器通告中將 M 旗標設為 1。同樣地，您可以使用 "netsh interface ipv6 set interface InterfaceName otherstateful=enabled" 命令，在路由器通告中將 O 旗標設為 1。
Windows Server "Longhorn" 的 Beta 2 版使用 DHCP 伺服器服務來支援 DHCPv6 轉接代理和 DHCPv6 無狀態設定。您可以針對 DHCPv6 選項設定 DHCP 伺服器服務，來分送至前述雙訊息 DHCPv6 訊息交換中的所有 DHCPv6 用戶端。Microsoft 計劃將在 Windows Server "Longhorn" Beta 3 版中支援 DHCPv6 可設定狀態作業，包括在 DHCP 嵌入式管理單元中建立 IPv6 位址範圍的能力。
DHCPv6 RFC 資源
選取的 RFC，與 DHCPv6 相關：
  • RFC 3315 IPv6 的動態主機設定通訊協定 (DHCPv6)
  • RFC 2462 IPv6 無狀態位址自動設定
  • RFC 3633 DHCP 第 6 版的 IPv6 首碼選項
  • RFC 3646 DHCPv6 的 DNS 設定選項
  • RFC 3736 IPv6 的無狀態 DHCP 服務

Joseph Davies 是 Microsoft 的技術文件作家，從 1992 年開始教導和編寫 Windows 網路方面的主題。他為 Microsoft Press 寫過 5 本書，同時也是每個月 TechNet Cable Guy 專欄的作家。


 Windows Powershell: 變數的效用
Windows Powershell
變數的效用
Don Jones

如果您使用 Windows 指令碼語言，例如 VBScript 或 KiXtart，應該已習慣於變數只是某種資料儲存機制。Windows PowerShell 也有變數，但是其變數的效用遠大於舊式指令碼語言中的變數。Windows
PowerShell 的變數實際上是對應至 Microsoft® .NET Framework 中的基礎類別。而 Framework 中的變數是物件，也就是說，變數可以儲存資料，也可以利用許多種方式操作資料。事實上，Windows PowerShell™ 中的變數功能強大，所以 Windows PowerShell 指令碼語言沒有包含任何內建的資料操作函數。它不需要這些函數，因為變數本身已經提供了功能。

宣告變數
雖然 Windows PowerShell 中的 New-Variable cmdlet 允許您宣告變數及指派其初始值，不過您並不需要使用 cmdlet。您只要在作業中指派值給變數，就可以建立新變數：
$var = "Hello"

Windows PowerShell 中的變數名稱一律以貨幣符號 ($) 開頭，而且可以包含字母、數字、符號，甚至空格的混合 (不過若是使用空格，您必須以括號括住變數，例如 ${My Variable} = "Hello")。此範例建立一個名為 $var 的新變數，並為其指派初始值 "Hello"。因為在此範例中的值是一串字元，所以 Windows PowerShell 會使用 String 資料類型來儲存值。就 .NET Framework 而言，這是 System.String 類別，此類別可能擁有任何變數類型中最多的內建功能。假設我若是要檢視 $var 中之值的全部小寫版本，可以這麼做：
PS C:\> $var.ToLower()
hello
PS C:\>
ToLower 方法會內建在 System.String 類別中，且會產生字串值的全部小寫表示。但是它不會變更變數 $var 的實際內容。若要檢視 System.String 類別所能執行之所有工作的完整清單，可傳送字串變數到 Get-Member cmdlet，如下所示：
$var | get-member
[圖 1] 顯示輸出，其中包含幾十種用於操作字串的方法。幾乎 VBScript 字串操作函數所提供的所有功能，在 Windows PowerShell 中都改由字串變數的方法提供。
Figure 1 A look at the System.String class output
Figure 1 A look at the System.String class output

在系統管理環境中，字串變數的許多功能比 VBScript 等語言中的字串函數更有用。假設您撰寫了一段指令碼，會從檔案讀入通用命名慣例 (UNC) 路徑，並會對路徑執行某些操作。您希望在嘗試使用路徑之前，先確認讀入的每個路徑都是 UNC。StartsWith 方法可讓您確認字串的值是以 UNC 要求的必要反斜線字元開頭：
PS C:\> $path = "\\Server\Share"
PS C:\> $path.StartsWith("\\")
True
PS C:\>
因為 StartsWith 會傳回 True 或 False 值，所以您可以在邏輯建構中使用此方法：
if ($path.StartsWith("\\")) {
 # code goes here
}
Windows PowerShell 甚至還提供變數之方法的自動完成形式，減少您必須打字的量。如果 $var 包含字串，您可以輸入
$var.
然後按 Tab 鍵，這會顯示 $var 變數的第一個方法名稱。再按一次 Tab 鍵就會移至下一個方法，而按 Shift+Tab 鍵則會顯示前一個方法。以這種方式，可以循環顯示所有可用的方法，直到您找到所要的方法為止。

變數的混淆
到目前為止，我的範例都允許 Windows PowerShell 決定我的變數的資料類型。指派字串給變數實質上會強制變數成為 System.String 類別。另一方面，指派數字給變數通常會導致變數成為整數 (Interger) (或者更明確地說，成為 Int32，可以儲存特定範圍的值)。例如，設想下列範例：
PS C:\> $int = 5
PS C:\> $int | get-member

  TypeName: System.Int32
此截斷的輸出顯示 Windows PowerShell 會將 $int 當成 Int32 處理，它擁有自己的方法和屬性集合。而事實上，它的方法和屬性集合遠少於 String 類型的集合。
$int 會成為 Int32，原因在於其值並未以引號括住，而且值只包含數字。如果以引號括住，則會當成 System.String 來解譯。
讓 Windows PowerShell 決定使用何種資料類型不一定都會產生您要的結果。假設您從檔案讀取值，而且您希望值一律當成字串處理。但是，某些值可能只包含數字，使得 Windows PowerShell 可能會將這些值當成 Int32 或其他數字類型處理。這可能會導致您的指令碼發生問題。如果 Windows PowerShell 未將值辨識為字串，則 System.String 類別的所有方法都無法使用 (而且您的指令碼可能依賴這些無法使用的方法)。
若要解決此問題，您可以在首次使用變數時宣告特定的類型，強制 Windows PowerShell 將變數當成該類型處理。請看以下範例：
[string]$var = 5
$var 通常會是 Int32，但是我已經強制 Windows PowerShell 將 $var 當成 String，確保我可以使用與 System.String 類別關聯的所有方法。變數類型宣告也提供方便的程式碼自我說明，因為現在 $var 中的資料是何種類型已很明顯。事實上，我已經習慣一律為我的所有變數宣告特定的類型，完全不讓 Windows PowerShell 做決定。這使我的指令碼行為更好預測，而且在許多情況下，也節省我許多偵錯的時間。
您應該預期到強制宣告變數會有一些影響，不過不一定是壞的影響。以這個未宣告變數類型的範例為例：
PS C:\> $me = 5
PS C:\> $me = "Don"
$me 變數一開始是 Int32，但是在加入 "Don" 這個值後，Windows PowerShell 已將其變更為 String。只要變數尚未明確地設定為特定的類型，Windows PowerShell 就可以視需要變更變數的類型。
在此範例中，我使用 [int] 類型名稱強制將 $me 設定為 Int32：
PS C:\> [int]$me = 5
PS C:\> $me = "Don"
Cannot convert value "Don" to type
"System.Int32". Error: "Input string
was not in a correct format."
At line:1 char:4
+ $me <<<< = "Don"
然後，當我嘗試為其指派字串值時，出現了錯誤訊息。因為我已明確地強制 $me 設定為 Int32，所以 Windows PowerShell 應該要將字串 "Don" 轉換為整數值。但它無法進行轉換，也無法將 $me 的類型變更為 String。

好多的類型
Windows PowerShell 中有許多可用的類型。事實上，您可以使用任何 .NET Framework 類型 (以及數百種可用的類型)。不過，Windows PowerShell 會為常用的資料類型定義許多捷徑。[圖 2] 只是部分清單，顯示最常使用之類型捷徑中的 10 種。如需完整的清單，請參閱 Windows PowerShell 文件。
Figure 2 常用類型捷徑 (Close Figure 2)

捷徑 | 資料類型
[datetime] | 日期或時間
[string] | 字元字串
[char] | 單一字元
[double] | 雙精度浮點數
[single] | 單精度浮點數
[int] | 32 位元整數
[wmi] | Windows Management Instrumentation (WMI) 執行個體或集合
[adsi] | Active Directory 服務物件
[wmiclass] | WMI 類別
[Boolean] | True 或 False 值
您也可以使用完整的 .NET Framework 類別名稱宣告變數的類型，如下所示：
[System.Int32]$int = 5
此技巧允許您使用 .NET Framework 中的類型，但是在 Windows PowerShell 中並無特定捷徑的類型。

延伸類型
Windows PowerShell 中最棒的事，可能就是它能夠延伸這些變數類型的功能。在 Windows PowerShell 安裝資料夾中 (通常位於 %systemroot\system32\windowspowershell\v1.0，不過在 64 位元系統上，路徑可能稍有不同)，可以找到名為 types.ps1xml 的檔案。您可以在記事本或 XML 編輯器 (例如 PrimalScript) 中編輯這個檔案。根據預設，雖然會列出其他許多類型，但是並不會列出 System.String 類別。不過，可以藉由將它新增到 types.ps1xml 檔案，為 System.String 類型新增功能。
變更之後，我必須關閉 Windows PowerShell，然後再重新開啟。我還必須確定本機指令碼執行原則允許執行未經簽署的指令碼，因為我並未簽署 types.ps1xml。
Set-executionpolicy remotesigned
現在，只要我重新啟動 Windows PowerShell 後，就可以使用新功能，如下所示：
PS C:\> [string]$comp = "localhost"
PS C:\> $comp.canping
True
PS C:\>
如您所見，我已新增了 CanPing 屬性至 System.String 類別。這會傳回 True 或 False，以指出本機電腦是否能夠 Ping 字串中所包含的位址。在 [圖 3] 中，您會注意到 WMI 查詢使用一個特殊的變數 $this。這個 $this 變數代表字串中所包含的目前值，也是字串變數的內容傳入 WMI 查詢的方式。
Figure 3 延伸 System.String 類型 (Close Figure 3)
<Type>
  <Name>System.String</Name>
  <Members>
    <ScriptProperty>
      <Name>CanPing</Name>
      <GetScriptBlock>
      $wmi = get-wmiobject -query "SELECT *
FROM Win32_PingStatus WHERE Address = '$this'"
      if ($wmi.StatusCode -eq 0) {
        $true
      } else {
        $false
      }
      </GetScriptBlock>
    </ScriptProperty>
  </Members>
</Type>

讓變數執行工作
Windows PowerShell 提供彈性、功能豐富的變數類型，以及同樣彈性的系統以延伸類型的功能。這些功能可以很容易地讓您在指令碼中建立強大的功能。事實上，變數在複雜的指令碼中可以成為主要的建置組塊，在許多情況下，可以提供在較複雜的函數中才有的進階功能。
從線上深入了解
我在每個月的第二個星期二會主持一系列的網路廣播，廣播中將繼續探討 Windows PowerShell 所提供的豐富指令碼功能，歡迎您參加。請造訪 microsoft.com/events/series/donjonesscripting.mspx，立即註冊。

2007 年 2 月 20 日，Windows PowerShell:The Scripting Crash Course
(英文)
參加此網路廣播，了解 Windows PowerShell 中的變數、語言建構、指令碼及函數。在這個一小時的速成課程中，我們會示範 Windows PowerShell 中簡單但有效的指令碼語言如何加快 Windows® 系統管理的自動化。我們也會探討讓 Windows PowerShell 指令碼盡可能容易的許多第三方工具。

2007 年 3 月 20 日，Windows PowerShell:Functions, Filters, and Efficiency
(英文)
學習在 Windows PowerShell 函數與篩選器中建立有效、模組化的程式碼。我們會探索 Windows PowerShell 中能讓您完全封裝函數與篩選器的強大範圍規則，並說明可以多容易地在不同專案重複使用這些函數和篩選器。我們也會示範如何將您自己的自訂函數加入 Windows PowerShell 中的全域範圍，全域範圍可以輕鬆容易地組合實用的公用程式函數庫。

2007 年 4 月 17 日，Windows PowerShell and Windows Management Instrumentation
(英文)
Windows PowerShell 可以存取 Windows Management Instrumentation (WMI) 所有的優點和功能。我們不只會說明如何使用 Windows PowerShell 存取 WMI，也會介紹如何透過 Windows PowerShell 管線傳遞 WMI 物件和集合。我們會探討如何在 Windows PowerShell 指令碼中使用 WMI 屬性和方法，並說明 WMI 中的基礎安全性與組態功能。

2007 年 5 月 22 日，Windows PowerShell:Converting from VBScript
(英文)
是否想要將 VBScript 的指令碼，甚至只是您的技能，轉換到 Windows PowerShell？請參加此網路廣播，了解如何做到。我們會探索 Windows PowerShell 如何包含 VBScript 的所有主要建構和功能，讓您很容易將您的 VBScript 技能轉譯到這個新的系統管理環境。我們會說明如何將 VBScript 中的工具轉換為 Windows PowerShell 中的原生指令碼語言。我們也會檢視 Windows PowerShell 中獨特的結構，並示範如何開始使用 Windows PowerShell 指令碼語言，讓您的工作更有效率並且更有效。

2007 年 6 月 19 日，Windows PowerShell:Under-the-Hood Extensions
(英文)
在這個網路廣播中，我們會探討 Windows PowerShell 如何使用功能強大且彈性的 .NET Framework 來處理資料，提供您管理字串、日期及其他資料類型的幾百個內建函數。但是，您知道可以使用 Windows PowerShell 指令碼來延伸這些函數嗎？我們會示範如何製作字串變數，其中不只包含電腦名稱，還可以告訴您電腦是否啟動並執行中。了解如何建立可以不使用外部函數，自動將資料格式化的日期和時間變數。請參加此課程，了解如何迅速在 Windows PowerShell 中建立各式各樣的新功能，讓 Windows 的系統管理更快且更容易。

Don Jones 是 SAPIEN Technologies 的專案與服務總監，也是 Windows PowerShell:TFM (SAPIEN Press) 的作者之一。Don 的連絡方式為：www.ScriptingAnswers.com。


 嗨，Scripting Guy！: 只要 5 分錢...就能為您回答 OU 相關問題
嗨，Scripting Guy！
只要 5 分錢...就能為您回答 OU 相關問題
Microsoft Scripting Guy
下載本文程式碼: HeyScriptingGuy2007_03.exe (151KB)

問：如何才能顯示出對話方塊，好讓我從 Active Directory 中選取 OU？

是這樣的， 如果每一次有人向我們提出此問題，Scripting Guy 可以收五分錢，我們應該可以獲利不少 -- 其實算一算一共只能收到 $37.15 啦。但是如果是針對每一個「想要」提出此問題，只是沒有機會直接詢問的人，都給我們五分錢，那就真的發了 -- 不過金額一點也不重要。畢竟我們不是為了錢，才成為 Scripting Guy。我們之所以成為 Scripting Guy，是為了藉由幫助大家更快速、簡便的進行系統管理工作，而從中獲得成就感。
附註： 嚴格來說，我承認我們的確是為了錢才擔任 Scripting Guy 的工作啦。但是經理這麼告訴我們：「你們的確可以做大事、賺大錢，但前提是必須願意非常努力工作，堅持只做高品質的東西才行」。於是我們就下定決心，相信金錢並不代表一切。
反正也無所謂。重點是，許多人想知道如何顯示出對話方塊，以便能選取 OU，然後利用指令碼連接到該 OU。最近收到一封電子郵件中寫到，「你們已經說明如何顯示出可選擇資料夾的對話方塊，也告訴我們如何顯示出可選擇檔案的對話方塊。但是你們為什麼從不解說如何顯示出可從 Active Directory® 選取 OU 的對話方塊？」
這個嘛，首先說明我們的確已經教過大家如何顯示出可選取資料夾的對話方塊，範例就在 這裡。我們也說明過如何顯示出可選取檔案的對話方塊，不相信的話，請造訪網址 microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx。這兩篇文章皆已受到認可，而大家也將這些技巧運用在指令碼中。這樣說來，我們為何還不告訴大家如何顯示出可從 Active Directory 選取 OU 的對話方塊？這是不是 Microsoft 的某種陰謀或詭計？
當然不是這樣的。(不過...所有搞陰謀的人都會這樣回答，不是嗎？)事實上，我們之所以還沒教大家如何顯示從 Active Directory 選取 OU 的對話方塊，其實是有原因的：這種對話方塊根本不存在。就像是棒球場上說的，看不到的球無法打擊。而編寫指令碼的說法則是，不存在的東西無法顯示。
我們本月的專欄就寫到這裡。下回見。
沒這麼好的事！TechNet Magazine 的編輯說，專欄不可能就這樣結束。他們說，「如果真的沒有這種對話方塊，那該怎麼辦？」「拜託，你們是 Scripting Guy 耶，難道不能建立一個對話方塊來解決這個問題嗎？我們還以為 Scripting Guy 可以解決所有指令碼的問題。」
毫無疑問的，TechNet Magazine 的編輯都被嚴重誤導了。可以解決所有指令碼的問題？並不是這麼一回事。事實上，我們這些 Scripting Guy 只有解決一種指令碼問題的能力。
不過幸好這唯一的能力，就是建立對話方塊，以便讓您從 Active Directory 選取 OU。請參閱 [圖 1]。
沒錯，這的確是一串很長的指令碼。但您應該聽過這句話：要煎蛋餅就得打破雞蛋 (天下沒有白吃的午餐)。同樣的，要建立自訂對話方塊就得打破一些雞蛋 (專欄寫到一半有點餓了，所以停下來吃點心)。現在滿足了口腹之慾，就要來看看能否清楚說明整個運作方式。
在這個指令碼中，我們使用 Internet Explorer® 物件模型，建立虛擬對話方塊。我們要建立 Internet Explorer 執行個體，從 Active Directory 取得 OU 集合，然後在 Internet Explorer 視窗的清單方塊中，顯示這些 OU。我們會等到使用者選取 OU 之後，再取得選取項目的 ADsPath、解除「對話方塊」，然後再繼續執行。
附註：這是否會成為史上最花俏、美麗的對話方塊？如果對您而言，「花俏和美麗」代表連 [確定] 或 [取消] 按鈕都沒有的極簡風格，答案就是肯定的。不過以我們的看法，這裡的訴求只是要提供最基本的基礎架構。若您希望美化或修改對話方塊，請自行發揮。
(天哪，如果每次回答「不好意思，您得自行發揮」都能拿到五分錢，我們就真的會變成有錢人。請將捐款寄給 The Scripting Guys，並由 TechNet Magazine 代收。)
為了讓我們的說明能夠容納於已分配的空間，我們必須先快速瀏覽一些事項。舉例而言，對於下列程式碼區塊，我們只能說它會建立 350 x 400 像素的 Internet Explorer 執行個體，如此一來，便隱藏了位址列和狀態列：
Set objExplorer = CreateObject( _
    "InternetExplorer.Application")

objExplorer.Navigate "about:blank"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width= 350
objExplorer.Height = 400
objExplorer.Left = 400
objExplorer.Top = 400
objExplorer.Visible = 1
當然這些都是為了提供我們一個空白的 Internet Explorer 視窗。為了取得網域中的 OU 清單，我們需要先搜尋 Active Directory。我們無法在此詳細解釋 Active Directory 的搜尋方式；如需相關資訊，請參閱 Script Center 中的兩篇式連載 (microsoft.com/technet/scriptcenter/resources/tales/sg0405.mspx)。我們只能告訴您這是我們在 fabrikam.com 網域中，用於擷取每個 OU 名稱和 ADsPath 的程式碼：
objCommand.CommandText = _
    "SELECT Name, ADsPath FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory=
    'organizationalUnit' ORDER BY Name"
為了讓您更方便使用，我們還將 OU 依名稱字母排序。這就是 ORDER BY Name 子句的目的 (別客氣；畢竟我們人生的目的，就是為大眾服務)。
呼叫 Execute 方法時，會取得 fabrikam.com 所有 OU 組成的資料錄集。這意味著下一步就是要在清單方塊中顯示出每個 OU。
那麼究竟該怎麼做？首先，我們需要在記憶體中建立整個清單方塊。初學者或許不太了解，這個意思是使用此程式碼行，將 <SELECT> 標籤儲存在名為 strHTML 的變數中：
strHTML = "<select size = '20' name='OUList' style='width:300px'>"
這行程式碼的功用到底是什麼？其實我們只是建立標準的 HTML 清單方塊 (利用 <SELECT> 標籤來達到目的)。在建立的過程中，我們將清單方塊命名為 OUList，且設定為每次顯示 20 個項目，並為 300 像素 (300px) 寬。如果您略懂 HTML，應該頗為熟悉上述程式碼。
接下來，我們需要增加一些項目 (也就是 OU) 到清單方塊中。巧的是，我們的資料錄集恰好是由網域中每個 OU 的資訊所組成。因此，我們可以設定 Do Until 迴圈，於整個資料錄集之中循環，擷取資訊，然後將每個 OU 加入清單方塊。在迴圈裡，我們使用下列程式碼 (再次說明，這是在清單方塊中新增項目的標準 HTML) 來新增每個 OU，設定項目以便於清單中顯示 OU 名稱，而且若您按一下清單方塊中的 OU，ADsPath 就會傳送到指令碼中：
strHTML = strHTML & "<option value= " & _
    Chr(34) & objRecordSet.Fields
    ("AdsPath").Value & Chr(34)
strHTML = strHTML & ">" & objRecordSet.
    Fields("Name").Value
為何要將 ADsPath 傳送給指令碼？很簡單。假設我們傳送的是 OU 名稱，而該名稱假定為 Finance，則會難以繫結到該 OU；畢竟 Finance 本身並非有效的 ADSI 繫結字串。然而，如果我們傳回 ADsPath (LDAP://ou=Finance,dc=fabrikam,dc=com)，就可以輕鬆繫結。這是因為 ADsPath 完全符合我們尋找和連結到 Active Directory 物件的需求。
附帶一提，我們之所以在清單方塊中顯示名稱，是因為假設您的 OU 名稱是唯一的。但不一定都是如此；例如 OUs North America\Research and Europe\Research 也有相同的名稱 (Research)。如果您的 OU 名稱重複，最好在清單方塊中使用不同的屬性來代替，例如 ADsPath 或 distinguishedName。這必須由您自己來決定。(鉲鏘！又是五分進帳！)
對了，記憶體中的清單方塊還沒建立完成：每個加入方塊的項目都會加入變數 strHTML。這些都在計劃之中：將整個清單方塊的程式碼儲存到變數 strHTML，然後使用該變數值，即可實際將清單方塊加入 Internet Explorer 的執行個體中。
待所有 OU 加入完成之後，我們便使用下列程式碼來表示清單方塊的結束：
strHTML = strHTML & "</select>"
此時，strHTML 中已包含所有建立清單方塊所需的 HTML 標記，最棒的是還有一個清單方塊，其中每個項目皆代表 Active Directory 的 OU。也就是說，我們現在可以將 strHTML 的值，指派給 Internet Explorer 文件的 InnerHTML 屬性：
objExplorer.Document.Body.InnerHTML = strHTML
這會傳回一個清單方塊，其中顯示所有網域中的 OU。
等等，先別走啊；我們還沒做完呢。舉例來說，我們還需要一些程式碼，才能暫停指令碼直到使用者在對話方塊中選取 OU 為止；若沒有這些程式碼，雖然仍可顯示清單方塊，但不論使用者是否進行選取動作，指令碼仍會繼續執行。那就糟糕了！為了要避免發生這種情況，我們可以使用以下程式碼區塊：
Do While objExplorer.Document.Body.All.OUList.Value = ""
    Wscript.Sleep 300
Loop
上述程式碼的作用，是不斷重複檢查清單方塊的值 (如果您還記得，我們之前已命名為 OUList，這也是其中一位 Scripting Guy 為女兒取的名字)。如果值為空字串 (表示未選取任何項目)，只要暫停指令碼 300 毫秒，然後繼續迴圈後，再檢查一次。這樣的動作會繼續進行：a) 直到永遠；b) 直到使用者選取清單方塊的項目為止；或者 c) 直到使用者關閉 Internet Explorer 視窗為止。
讓我們假設使用者在清單方塊中選取某個 OU。如果是這種情況，我們便取得該值 (您應該還記得，這是 OU 的 ADsPath) 並指派給變數 strTargetOU：
strTargetOU = objExplorer.Document.Body.All.OUList.Value
接著使用 Quit 方法來解除 Internet Explorer 的執行個體，如下所示：
objExplorer.Quit
此時已經快要大功告成。我們先檢查 strTargetOU 是否等於空字串：
If strTargetOU = "" Then
    Wscript.Quit
End If
如果是，就表示使用者未選取 OU 即關閉 Internet Explorer；此時我們使用 Wscript.Quit 方法來中止指令碼 (我們假設如果使用者不選擇 OU，就表示他不打算執行指令碼)。然而，若 strTargetOU 不等於空字串，我們就傳回變數值：
Wscript.Echo strTargetOU
當然，在實際指令碼中，您可以直接在 Active Directory 中繫結到該 OU，而非只是單純回應 ADsPath。不過您應該知道標準答案 -- 至少是我們的標準答案：這個就得靠您自行發揮了。
如先前所述，以及 [圖 2] 所示，這並非很花俏的對話方塊，但絕對可以使用，而且比手動輸入 ADsPath (假設您知道 ADsPath) 更加簡單。此外，這還可以讓您有機會自訂程式碼和對話方塊，以符合自己的需求。
Figure 2 A simple script dialog
Figure 2 A simple script dialog

現在，但願我們所寫過有關如何顯示對話方塊，以便從 Active Directory 選取 OU 的每篇專欄，都能換來五分錢。畢竟這樣我們就能拿到比 TechNet Magazine 平時多五分錢的酬勞。
對了，我們可不是在抱怨喔。

Microsoft Scripting Guy 的工作是...沒錯，就是 Microsoft 聘請的員工。在比賽、訓練、看棒球賽 (以及其他各種活動) 之餘，他們也負責管理 TechNet Script Center。請造訪他們的網址 www.scriptingguys.com。


 Exchange 佇列問題與解答: 交易記錄檔、Cmdlet、遠端管理...等等
Exchange 佇列問題與解答
交易記錄檔、Cmdlet、遠端管理...等等
KC Lemson and Nino Bilic

問：你們為什麼在 Microsoft® Exchange Server 2007 中，把交易記錄檔大小降到 1MB?
答：Exchange 2007 有一項很酷的功能，叫做記錄檔傳送，這也是本機連續複寫 (Local Continuous Replication，LCR) 以及叢集連續複寫 (Cluster Continuous Replication，CCR) 等幾項新功能所採用的技術。在儲存群組 (SG) 層級啟用此功能時，SG 交易記錄檔會從實際執行中的 SG 複製到副本 SG。副本 SG 的記錄檔會在資料庫中重新顯示，以保持最新資料。這顯然是以最簡單的方式說明整個運作，但相信這樣已經足以提供概念。
其中的竅門就在於交易記錄檔必須先在實際執行的 SG 上關閉之後，才能傳送到副本 SG。換言之，必須等到 e00 記錄檔 (目前在第一個儲存群組中的記錄檔) 已滿、關閉並且重新命名之後，才能傳送。此外，還有一些設定可以控制此程序中的記錄檔數量，因為可用性與效能兩者無法兼得 (這些設定可以藉由在 Exchange Management Shell 中執行 Set-MailboxServer cmdlet 取得。說明檔有提供實際需要使用之參數的詳細資料)。
簡單的說，我們之所以會縮減交易記錄檔大小，是要將儲存群組兩個副本之間可能無法同步的資料最小化。例如，當實際執行資料庫的硬碟機損毀，而您必須自行從副本啟動 SG，這時候就會開始發揮作用。比較小的交易記錄檔，可以減少資料遺失的可能性。
這並不代表我們保證您只會遺失 1MB 的資料。雖然這些看起來都是交易記錄檔，但遺失的 1MB 檔案也有可能包括如 COMMIT 交易的 5MB 資料。在這種情況下，副本中可能會少了這 5MB 的資料，即使您可能已經接收五個記錄檔與資料，但最後一個少量資料的記錄檔以及必要的 COMMIT 交易是不可或缺的。
最終還是需要由您判斷，您在商務需求上是否能夠接受這樣的風險。犧牲少量資料的遺失以換取能夠在幾分鐘內就復原，與需要數小時的時間才能還原相較，或許可以接受。我們未來一定會再深入探討這個主題！

問：現在交易記錄檔變短了，我們是否會更快就把交易記錄檔用完？
答：在 Exchange 中，「用完」這個問題只會發生在交易記錄檔的名稱。在 Exchange Server 2003 中，交易記錄檔的命名方式如下：
E nn fffff.log
nn 是首碼，不同 SG 會有不同的首碼。在 SG 存留期間，nn 會維持不變，因此可以為儲存群組建立且名稱是唯一的交易記錄檔數量，基本上僅受限於 fffff 值，亦即大約是一百萬個記錄檔。由於有些客戶的郵件伺服器很繁忙，因此已經遭遇這項限制問題。
從 Exchange Server 2000 開始，我們就有提供 Hotfix 以便於達到限制時，在應用程式記錄檔中顯示事件 (請參閱 support.microsoft.com/kb/896001 以取得詳細資訊)。
那麼在 Exchange 2007 中又會發生什麼樣的情況呢？正如剛才所述，交易記錄檔已從 5MB (舊版 Exchange 的大小) 縮減為 1MB (Exchange 2007 的大小)。這是否表示只要有五分之一的資料，就會把唯一名稱的交易記錄檔用完？
答案是否定的。在 Exchange 2007 中，交易記錄檔的名稱格式如下：
E nn ffffffff.log
請注意我們一共有 ffffffff 個記錄檔可以使用，與舊版 Exchange 的 fffff 相差很多。由於內部可延伸儲存引擎 (Extensible Storage Engine，ESE) 的數學運算方式，Exchange 2007 無法建立所有 ffffffff 個記錄檔。相反的，它建立出 7fffffec 個記錄檔，這仍然是極龐大的數量 (如果您不相信，不妨從十六進位轉換為十進位看看！)
這在實際作業中代表什麼呢？實際上，這表示使用 Exchange 2007，您可以建立比舊版 Exchange 多上約 2048 倍的記錄檔。現在我們以五分之一大小的記錄檔計算：
2048 / 5 = 409.6
呈如上述，新的記錄檔命名配置可以處理比舊版多出 409 倍的資料量！而且別忘了，這只是每個 SG 的量，而不是每部伺服器的量，因為每個儲存群組都有不同的記錄檔首碼 (如 e00、e01 等等)。我們有沒有告訴過您，在 Exchange 2007 Enterprise 版中，您可以為每一部伺服器建立 50 個 SG 呢？我想在短時間內，應該不太可能用完交易記錄檔吧！

問：我如何遠端管理 Exchange 2007 伺服器？
答：遠端管理 Exchange 2007 伺服器的方式有數種可供選擇。第一，您可於 Exchange Server 以外的另一台機器上安裝 Exchange 2007 管理工具，只要這部機器執行的是 32 位元或 64 位元版本的 Windows Server® 2003 Service Pack 1 (SP1) 或更新的版本、Windows Server 2003 R2，或者 Windows XP SP2 (含) 或更新的版本。請注意，實際執行環境中並不支援在 32 位元硬體上安裝任何伺服器角色 (用戶端存取、信箱、邊緣...等等)，但是有支援在 32 位元的電腦上安裝管理工具。此外也請記住，此為 Exchange Server 2007 的初版，因此 Windows Vista™ 不支援管理工具。
在某些組織裡，IT 部門可建立單一伺服器來做為管理伺服器，將各種產品所有必要的管理工具都安裝到這台伺服器上。接著需要使用這些工具的管理者，可透過終端機伺服器存取管理伺服器，以便進行遠端管理。在其他環境下，使用者可以將管理工具安裝到自己的桌面上。
透過主控台或 Shell，即可於組織的伺服器上執行作業。在主控台中可以看到伺服器，因此可以遠端執行任何作業。在 Shell 中，許多工作都有支援類似篩選旗標的伺服器，可以讓您將作業範圍設定在單一伺服器上。不過仍有幾個例外情形，亦即有些命令必須在本機執行，例如 Get-NetworkConnectionInfo 命令。

問：在最後一個資料行中，您有建議 Exchange 2007 伺服器應配置的 RAM 數量。那請問分頁檔的大小呢？
答：為了防止 Exchange 2007 伺服器發生潛在的虛擬記憶體不足錯誤，我們建議採用以下方式，來判斷您的系統分頁檔最佳大小。
若伺服器的 RAM 小於 8GB，分頁檔的最小值應為 RAM 的大小加上 10MB。因此若伺服器的 RAM 是 4GB，則至少需要 4GB 加 10MB。不過建議的分頁檔大小是 RAM 的大小乘以 1.5。因此，4GB 的伺服器就需要 6GB 的分頁檔大小。
此外，針對 RAM 有 8 GB 以上的伺服器，其分頁檔的最小值計算方式相同，也就是 RAM 的大小加上 10MB。不過建議大小則各有不同的判斷方式。基本上，在 RAM 超過 8GB 的伺服器上，如果較小的分頁檔會導致虛擬記憶體不足的錯誤，則最多只應該設為 RAM 的 1.5 倍。
請注意，此處所指的錯誤其實與虛擬記憶體片段無關 (這是 Exchange 2000 和 Exchange 2003 伺服器的問題)。這些是系統實際記錄的快顯錯誤，表示分頁檔大小已增加或分頁檔太小。

問：我想學習如何使用 Exchange Management Shell，但我過去從未使用過命令列來管理系統。請問我應該從哪裡開始學習？
答：首先，我們可以從基本知識開始。Exchange Management Shell 中的每個 cmdlet，都是由單一動詞和單一名詞組合而成。Exchange Management Shell 僅使用少數幾個動詞：「Get」是用來擷取物件屬性、「Set」是用來變更物件屬性，而「New」則是用來建立新物件，諸如此類。Exchange Management Shell 的名詞則包括許多 Exchange 管理員皆已熟知的概念 (例如 Mailbox、Contact、Queue 及 OWAVirtualDirectory)。除此之外，Exchange Server 2007 還有一些新概念 (例如 TransportRule、StorageGroupCopy 及 UMAutoAttendant)。因此在實際執行上，基本 cmdlet 看起來會像 New-Mailbox (建立信箱) 或 Get-Mailbox (擷取組織的信箱清單)。
然而大多數的 cmdlet 都必須更精確的指出您想要進行的工作。舉例來說，如果您想變更信箱屬性，就必須指定哪個信箱和哪個屬性。這點可以透過參數完成。倘若 New-Sandwich 是 cmdlet，那麼參數有可能是 -NumberOfTomatoSlices 4、-Bread Wheat，以及其他各種類似選項，以詳細指定您希望 sandwich 採用的格式 (-FlufferNutter $true-ahhhh yum)。
只要了解動詞-名詞的區分，就可以使用 Exchange Management Console (EMC) 精靈中的命令列，以熟悉哪些 cmdlet 會執行何種作業。在 EMC 中，執行精靈以建立新使用者。在精靈結束且作業完成之後，會出現精靈在幕後執行的命令列副本 (請參閱 [圖 1])。按下 Ctrl+C 可複製該對話方塊內容，以便您將 cmdlet 貼入記事本，並且和自己的簡單批次檔組合在一起。
Figure 1 Command-line exposure for creating a new user
Figure 1 Command-line exposure for creating a new user
若您想要練習使用 cmdlet (但不想造成任何損害)，有一個妙方是把 -WhatIf 放在命令列的尾端。如此一來，系統會告訴您執行命令會產生哪些動作，但不會實際變更系統。
只要熟悉基本 cmdlet (例如 *-Mailbox) 之後，就可以開始做其他嘗試。若要尋找其他 cmdlet，可使用 Get-ExCommand cmdlet，這會顯示出所有 Exchange 管理 cmdlet 的清單 (您必須在執行 Exchange Management Shell 的情況下做這個動作。只打開 Microsoft Command Shell 或者 Windows PowerShell™ 並無法讓您執行這個動作，也無法執行其他 Exchange 管理工作)。這份清單相當龐大，因此請使用萬用字元來找出您要的項目。例如 Get-ExCommand *database* 會傳回所有名稱裡包含 database 的 Exchange cmdlet，例如 Dismount-Database、Move-DatabasePath，和 New-MailboxDatabase。
如果您知道要找的部分名詞，可以循環顯示所有選項。例如，您可以輸入 Get-Mailbox 然後按下 Tab 鍵，以便循環顯示所有工作名稱的名詞中有 mailbox 的 cmdlet。您甚至可以合併使用萬用字元以及 Tab 鍵的自動完成功能。舉例而言，您可以輸入 Get-*Mailbox*，並使用 Tab 鍵來循環顯示可能的選項。
另一個簡單的方法是使用提示。每個 cmdlet 都有一組預設的必要參數，這是執行作業時必須有的基本參數。如 Get-Mailbox 等「Get」cmdlets，則不需要任何參數。根據預設，Get-Mailbox 會傳回整個組織的所有信箱清單 (此清單預設不得超過 1000。若要變更上限設定，您可以輸入像是 Get-Mailbox -ResultSize 2000)。建立或修改物件的 Cmdlets (如 Set 或 New) 會提示您輸入必要的資訊，例如要建立或修改的物件。舉例來說，若您執行 New-Mailbox，Shell 會提示您一一輸入密碼、資料庫、名稱...等等。
若要進一步了解特定 cmdlet 可用的參數，請使用說明系統：Help Move-DatabasePath (您也可以直接輸入 Move-DatabasePath、Move-DatabasePath -? ...等等，我們已嘗試涵蓋所有基礎部分)。說明中會提供 cmdlet 的描述以及參數清單，並詳述每一項的用途。您也可以使用 Get-Help cmdlet 存取說明 (只要輸入簡短的 Get-Help 豈不是太棒了？您應該很希望在真實世界中的某些白目朋友也能夠執行這個 cmdlet (以獲救) 吧？)
找出某 cmdlet 可用參數的另一種方法，是於參數名稱中使用 Tab 鍵功能。輸入 Get-Mailbox -S 並按下 Tab 鍵，就可以循環顯示 S 開頭的可用參數。
當然，您也可以參考詳盡的說明系統。若您無法在離線狀態下找到需要的項目，別忘了試試會定期更新的說明內容，網址為 go.microsoft.com/fwlink/?linkid=79421，以及位於 go.microsoft.com/fwlink/?linkid=64647 的快速參考指南。
上述所有內容都能幫助您開始學習 Exchange Management Console，但這些資訊也只論及命令列之強大功能與彈性的皮毛而已。我們還會在未來的專欄中詳加討論。

問：在 Exchange Server 2003 ESM (Exchange 系統管理員) 中，可以輕易看見所有使用者的信箱大小。這項功能在 Exchange 2007 裡好像找不到了。請問 Exchange 2007 是否也能有同樣的功能?
答：在新的 Exchange 2007 主控台中，您可以在信箱本身的 [一般] 內容頁上得知信箱大小。若您想要看到多重使用者的資料，必須使用 Exchange Management Shell。
若您執行 Get-MailboxStatistics，則可取得整個伺服器的資料 (不僅是特定資料庫)。根據預設，並不會顯示信箱大小，您必須執行使用 Format-List 的 cmdlet 才能取得大小資訊：
get-mailboxstatistics | format-list
更好的方法是選擇您想看的內容，然後傳送到資料表中。在本範例中，我們將取得信箱的顯示名稱、郵件大小總數、刪除的郵件大小總數，以及信箱所屬的資料庫：
Get-MailboxStatistics | Select-Object
displayname,totalitemsize,
totaldeleteditemsize,databasename
| Format-Table
您可以依照想要尋找的資訊，使用不同的輸出格式。在本範例中，Format-Table 會比 Format-List 合適

KC Lemson 目前擔任 Exchange Server 小組的首席專案經理。她的 ATM 密碼是 0000：別一次把錢花光了。
Nino Bilic 目前擔任技術組長，他閒暇時都在忙著收取 $1,000 元的支票，這是他為 Bill (比爾) 轉寄電子郵件的酬勞。


 安全性監控: 部署 EFS：第二篇
安全性監控
部署 EFS：第二篇
John Morello

任何加密檔案系統 (EFS) 部署基本上有兩個部分：著重於憑證管理和修復代理的後端設計部分，及使用者面對的 EFS 部署部分。上個月我寫了後端部分，並討論了資料和金鑰修復的選項
以及提供用戶端憑證的選項。這裡，我的重點會放在一般使用者所看得見的部署層面，例如 Windows® 檔案總管的增強功能、選擇要加密的檔案系統位置，以及如何利用群組原則來管理加密選項。

判斷 EFS 是否為已使用
決定要部署 EFS 之後，第一步就是判斷組織內之 EFS 使用方法的目前狀態。回顧一下，EFS 可以用於獨立模式，一般使用者只負責其加密金鑰的建立和備份。組織中可能會有進階使用者已依此方式使用 EFS，因此，為確保能夠順利轉換為受管理的部署，就必須判斷這些使用者是誰。
電腦上第一次有任何給定的使用者運用 EFS 時，Windows 會在 HKEY_CURRENT_USER 中建立下列登錄項目：
HKCU\Software\Microsoft\Windows NT\CurrentVersion\EFS\CurrentKeys\CertificateHash
Microsoft® Systems Management Server (SMS)、Active Directory 登入指令碼或其他工具，都可用來檢查此項目在您企業的電腦上是否存在。如果使用者有此登錄值，表示他已使用過 EFS。不過，此值未必表示目前有人使用 EFS 或是否有加密其任何資料。因此，當電腦上有此登錄機碼時，應該更詳細檢查以判斷目前是否有任何檔案加密。
使用 cipher.exe 及傳遞 /U 和 /N 參數，可指示 Cipher 報告電腦上之檔案和目錄的加密狀態。例如，如果您要判斷系統上的資料是否加密，就可以執行下列命令：
cipher /U /N
登錄檢查和 Cipher 報告可以合併成單一指令碼來檢查登錄值存在與否，如果存在，會產生電腦上目前加密檔案的報告。產生這些報告之後，就會知道哪些使用者有加密檔案，且準備將它們移轉到集中管理的設計。
若要在部署期間控制群組原則的應用程式，則在網域中建立兩個安全性群組就很有用，因為這樣可將使用 EFS 的那些電腦與沒有 EFS 的電腦分隔開來。例如，"SG-ComputersUsingEFS" 包含那些已使用 EFS 之電腦的電腦帳戶，而 "SG-ComputersNotUsingEFS" 包含目前未使用 EFS 的所有其他電腦。

使用群組原則控制 EFS 使用方法
一旦知道誰使用及誰未使用 EFS 之後，用戶端部署的下一步就是要針對目前未使用它的使用者停用獨立 EFS 使用方法。這是部署程序的一個重要步驟，因為第一次啟用並正確設定 EFS，比移轉使用自我簽署憑證的使用者更容易。只有在判斷哪些使用者已使用 EFS 之後，您才應該執行此步驟，因為透過群組原則停用 EFS 之後，使用者便無法存取任何目前加密的檔案。您可以在群組原則物件編輯器的 Compu-ter Configuration\Windows Settings\Security Settings\Public Key Policies\Encrypting File System 之下找到此原則。
如前所述，此值只應該在目前未使用 EFS 的電腦上啟用，才不會中斷已使用 EFS 之使用者的工作。因此，在我的範例中，停用 EFS 之群組原則物件 (GPO) 上的存取控制清單 (ACL) 只允許 "SG-ComputersNotUsingEFS" 群組套用群組原則。

加密或不加密
在判斷哪些系統目前正在使用 EFS，以及在尚未受管理部署的所有其他系統上停用 EFS 之後，下一步就是要決定哪些項目需要在受管理的部署中加密。視用戶端系統的管理方式而定，此程序可以很簡單，也可以很複雜。
在思考要加密哪些檔案時，首先要考慮的就是使用者是否為其系統上的系統管理員。如果使用者是本機系統管理員，您只能教導及鼓勵他們將機密資料加密，但無法真正控管。原因很簡單：本機系統管理員可以在檔案系統上的任何位置建立檔案和目錄。因此，雖然您可以加密一般位置，例如 [我的文件]，但如果使用者在另一個位置建立新目錄，並在該處儲存機密資訊，則很難確定此資料是否也受到保護。當一般使用者並非本機系統管理員時，除了有安全性的優點之外，這也可以讓 EFS 更好管理，且更安全。
要牢記的下一個 EFS 要點是，它屬於個別使用者式的加密。換句話說，某位使用者加密的項目只能由同一位使用者解密，包括 SYSTEM 帳戶在內 (當然，資料修復代理或 DRA 例外)。這表示，如果可執行檔或 DLL 是以使用者的金鑰加密，而系統上的另一個主體嘗試存取它，則另一個主體將收到存取遭拒的錯誤。因此，一般而言，如果檔案或目錄包含可能需要由系統上之多個主體存取的可執行程式碼，您就不應該將檔案或目錄加密。Windows 會防止 %SystemRoot% 中的檔案或含有 SYSTEM 屬性的檔案被加密，但軟體廠商有時也會將 SYSTEM 帳戶可能執行之服務的二進位檔案安裝到 %ProgramFiles% 中。例如，膝上型電腦廠商在安裝要以服務執行的電源及裝置管理軟體時，就會使用這般方案。
基於這兩個事實，什麼才是 EFS 加密目標的最佳作法？答案在於使用者系統的設定方式。在具有標準化作業系統影像的妥善管理環境中，您可以根據影像中預定的資料儲存位置，讓使用者的加密程序自動化。例如，如果使用者只能將資料儲存在 %userprofile%\My Documents 中，則您只需要加密該目錄 (注意：如果您使用資料夾重新導向，加密 [我的文件] 時就要小心謹慎。如果 [我的文件] 重新導向至伺服器，則伺服器必須為 [受信任委派]，且對該使用者的設定檔具有存取權。在這類情況下，通常只加密 [離線檔案] 快取會較容易，這點我們將在本專欄後面加以討論)。
在管理較為鬆懈的環境中 (使用者可寫入至檔案系統上的許多位置)，建議您自動化少數共用儲存位置的加密，然後教育使用者如何自行加密其他位置。不論環境如何，都應該在目錄層級而非檔案層級進行加密。這麼做可確保在該目錄中建立的所有檔案 (包括暫存檔案) 一定會加密。

建議的加密位置
一般而言，您應該加密的位置為：%userprofile%\My Documents、%userprofile%\Application Data\Microsoft\Outlook (假設您使用 Microsoft Office Outlook® 做為傳訊用戶端) 和 %userprofile%\Desktop。加密 [我的文件] 可保護 Windows XP 中儲存檔案的預設位置。保護 Outlook 目錄可確保在本機快取的機密電子郵件也受到加密；這對於在 Outlook 2003 預設 [快取模式] 下執行的使用者特別重要。最後，桌面通常是做為一種暫存目錄，使用者可以在該處放置目前處理的文件或經常傳送的簡報。當然，您可能已在組織中修改其中一些目錄的預設位置，因此，EFS 加密選項應該反映您組織通常使用的位置。
除了這些一般最佳作法之外，您也應該判斷是否擁有可在替代位置儲存機密資訊的應用程式。例如，有些應用程式是在 %ProgramFiles%\AppName 中，而非使用者設定檔中儲存使用者資訊。判斷您的用戶端系統上是否擁有這類應用程式，以適當保護其利用的資料，這點很重要。在最好的狀況下，可設定應用程式將變更儲存在另一個使用者設定檔特定路徑 (例如 My Documents)，如此便不需要其他 EFS 變更。在最壞的狀況下，亦即如果應用程式需要將資料儲存在其 Program Files 目錄中，則 EFS 可用來只加密 Program Files 中的特定子目錄。
最後，如果您打算將暫存目錄加密 (%TMP% 和 %TEMP%)，請小心謹慎。許多應用程式安裝程式會使用此目錄來展開安裝套用內容，然後對展開的檔案執行檔案移動作業，將它們放在 %ProgramFiles% 的適當路徑上。因為相同磁碟區上的一個已移動檔案保留其原始屬性，所以該檔案在放到 %ProgramFiles% 之後會繼續加密。如果非執行安裝程式的使用者嘗試使用此檔案，他的存取會遭到拒絕。通常，這類問題無法在應用程式錯誤訊息中看出根本的導因。因此，我通常會建議只在管理完善 (亦即一般使用者不會自行安裝應用程式) 的環境中針對 %TMP% 進行加密。

保護離線檔案
離線檔案是 Windows 2000 及更新版本的一項功能，可讓使用者為儲存在檔案伺服器上的資料建立本機副本。然後，當伺服器中斷連線時，離線檔案可讓使用者處理此資料，並在下次連線時，將所做的變更與伺服器再度同步處理。不過，離線檔案不是包含伺服器檔案副本的簡單目錄。相反地，它是全系統共用的資料庫，且會以 SYSTEM 帳戶的內容執行。在 Windows XP 中，此資料庫可能會由 EFS 保護。根據先前的討論，EFS 應該是針對個別使用者。那麼使用者專屬的 EFS 又如何能夠將多個安全性主體所使用的資料庫加密？
當執行 Windows XP 的使用者在 Windows 檔案總管中選擇要將離線檔案加密的選項時，所利用的加密常式與用於使用者可起始的其他加密作業的常式不同。SYSTEM 帳戶不會利用使用者個人的 EFS 金鑰組 (這會防止 SYSTEM 存取檔案)，而是自行產生金鑰組來搭配 EFS 使用，並使用該金鑰組來加密用戶端的快取。這有很大的安全隱憂，因為如果有人取得以 SYSTEM 執行程式碼的管道，他就可以在快取中將此資料解密。如果筆記型電腦遭竊，則攻擊者可輕而易舉重設系統管理員密碼，並以系統管理員身分登入。以系統管理員身分執行之後，同樣不費吹灰之力，即可強迫程式碼以 SYSTEM 執行，然後存取快取 (請注意，此行為在 Windows Vista™ 中已變更。Windows Vista 會使用個別使用者的金鑰，來加密使用者專屬的離線檔案)。
若要防止遭到此種類型的攻擊，筆記型電腦可設定為以這兩種方式之一離線儲存 Security Accounts Management (SAM) 資料庫的加密金鑰：在開機時儲存為密碼輸入 (模式 2)，或是在開機過程中儲存到磁片上 (模式 3)。這兩種方式都很麻煩，因為在開機過程中，它們需要與電腦進行非自動互動，因而產生潛在的自動化系統管理問題。不過，如果電腦上要同時使用離線檔案與 EFS，則必須使用其中一個選項以保護快取中的資料。通常我會建議您使用開機密碼 (請參閱 [圖 1])。這是因為筆記型電腦提袋遭竊的使用者，很可能會將磁碟放在裡面，如果連同筆記型電腦一併被偷走，則磁碟更肯定也是放在一起。
Figure 1 Automate EFS operations
Figure 1 Automate EFS operations

啟用 EFS
決定要在用戶端加密的項目之後，下一步是執行實際加密作業。此程序可透過登入指令碼或其他處理序達成，其中需要在用戶端執行指令碼來呼叫 cipher.exe，以執行加密作業。如果您的環境中已有獨立 EFS 使用者，如先前範例中所討論，我建議先進行移轉。
若要移轉這些獨立使用者，第一步是為用戶端系統提供受管理的憑證，如本專欄 2007 年 2 月份期刊中所討論 (microsoft.com/technet/technetmag/issues/2007/02/SecurityWatch)。當所有系統已註冊這些受管理的憑證之後，應該以 /U 參數執行 Cipher，用新的加密和修復代理金鑰來更新所有現有的檔案。此時，SG-ComputersUsingEFS 群組中的所有系統都應該以受管理方式利用 EFS，包括集中發行 (且可能已備份) 金鑰和集中管理修復代理。
若要為目前未使用 EFS 的使用者部署 EFS，您必須先移除群組原則，以防止 EFS 的使用。完成此動作且使用者已註冊受管理憑證之後，即可執行登錄指令碼來加密上述的金鑰路徑。以下是簡單的指令碼範例：
cipher /e /s /a "%userprofile%\My Documents"

cipher /e /s /a "%userprofile%\Application Data\Microsoft\Outlook"

cipher /e /s /a "%userprofile%\Desktop"
在所要的目錄上啟用 EFS 之後，建議您考慮設定其他兩個選項，以增加 EFS 部署的安全性，兩者都涉及從記憶體分頁到磁碟的資料。請注意，在每一個案例中，惡意的一方可能修復的資料量，僅限於合法使用期間有載入至記憶體中或已分頁至磁碟的資料。換句話說，如果使用者電腦上有由 EFS 保護的機密資料，但是尚未檢視 (因而尚未載入記憶體中)，則上述攻擊方法對尚未檢視的資料不會造成危害。
Windows 會使用分頁檔案做為虛擬記憶體 (在其他作業系統中通常稱為交換空間)，此分頁檔案包含記憶體內部資料的原始片段，且是以純文字寫入硬碟中。這會使 EFS 保護系統上的機密資料有危險，因為如果攻擊者可以修復分頁檔案，他們就有可能利用鑑識工具從這個檔案中擷取可用的資料。由於分頁檔案本身無法在 Windows XP 中加密 (請注意，在 Windows Vista 中可以加密)，所以最佳選項是強迫 Windows 在關機時清除它。這可透過群組原則完成，如 [圖 2] 所示。
Figure 2 Setting group policy
Figure 2 Setting group policy
此設定的缺點是會大幅增加關機時間，尤其是對於擁有大量記憶體的電腦 (根據預設，分頁檔案的大小與電腦上的實體記憶體數量有關)。這是因為若要清除分頁檔案，Windows 就必須在關機之前實際寫入磁碟上的每一頁。
當電腦管理模式設為啟用休眠時，Windows 的休眠檔案會包含電腦實體記憶體的傾出。休眠時，Windows 會將實體記憶體的完整內容寫入至磁碟的休眠檔案中，讓電腦能夠還原至使用者可繼續工作的狀態。和分頁檔案一樣，休眠檔案無法在 Windows XP 中加密。不過，和分頁檔案不同的是，休眠不能從 GPO 直接停用。相反地，您應該使用指令碼來呼叫具有 /HIBERNATE 參數的 powercfg.exe，以停用 (或重新啟用) 休眠。
完成初始加密及組態工作之後，您應該考慮全面清除一次部署中各磁碟的殘存空間。此程序可能耗時又麻煩，但在高安全性環境中則有提升安全性的優點。殘存空間是指目前作用中資料未使用到的磁碟空間，但由於硬碟的操作方式，有可能包含先前所使用檔案的機密資訊片段。換句話說，由於檔案刪除作業並不會實際覆寫檔案在磁碟上佔用的所有磁區 (它只會移除檔案資料表中的指標)，因此已刪除的資料可能還存在於磁碟上。在這些情況下，可由鑑識工具修復此資料，該工具可讀取殘存空間並從中重新組合檔案。若要安全地清除此常駐資料，可使用 /W 參數執行 Cipher。這會強迫 Cipher 重複覆寫磁碟上所有標示為可用的磁區。只要機密資料上的所有未來檔案作業是發生在 EFS 保護目錄中，就不需要定期執行此命令。

針對 EFS 加強 Windows 檔案總管
根據預設，檔案和目錄的加密和解密選項會嵌入 Windows 檔案總管的進階內容功能表中。您可以選擇在 Windows 檔案總管內容功能表上放置 [加密] 和 [解密] 選項 (以滑鼠右鍵按一下來顯露)，以提供一般使用者共便捷的 EFS 使用方式。另外，Windows 檔案總管可設定為以不同於其他檔案的顏色 (綠色) 來顯示 EFS 保護的檔案和目錄。這樣可幫助使用者知道檔案或目錄是否已加密，而不必向下鑽研進階內容功能表。最後，您可以新增選項來定義哪些使用者對檔案或目錄有存取權。若要啟用這些選項，請透過呼叫 reg.exe 的指令碼執行下列變更：

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]

"EncryptionContextMenu"=dword:00000001

"ShowCompColor"=dword:00000001

[HKEY_CLASSES_ROOT\*\Shell\Encrypt To User...\Command]
@="rundll32 efsadu.dll,AddUserToObject %1"

Windows Vista 中的 EFS
EFS 在 Windows Vista 中獲得一些重要增強功能，使得部署、管理及增加其安全性更為容易。在這些增強功能當中，其中的主要項目之一，是可以在智慧卡上儲存 EFS 金鑰的支援。對於已利用智慧卡登入的組織而言，這是一項特別重要的功能，因為相同的智慧卡也可以用來儲存使用者的 EFS 金鑰。智慧卡的支援也涵蓋修復代理的憑證，亦即機密 DRA 憑證也可以儲存在智慧卡上。
先前在 Windows XP 中不可能或不容易完成的項目加密作業，如今在 Windows Vista 中可以支援。Windows Vista 可將分頁檔案加密，因此不再需要設定 [清除虛擬記憶體分頁檔] 選項。離線檔案的設計已在 Windows Vista 中完全更新。除了更好的效能和穩定性 (以及更友善的介面) 之外，現在用戶端的快取已採取個別使用者式，表示可以安全地加密快取而不必使用 SYSKEY 模式 2 或 3。這兩個增強功能解決了目前 Windows XP 架構環境的主要部署障礙。
最後，Windows Vista 可讓系統管理員直接透過群組原則來設定 [文件] 資料夾的加密，而不必利用個別指令碼。[圖 3] 說明可透過 Windows Vista 中的 GPO 使用的新 EFS 屬性。
Figure 3 EFS properties in Windows Vista
Figure 3 EFS properties in Windows Vista

總結
EFS 提供 Windows 系統管理員一個保護行動資料的高度安全選項。EFS 除了可擴充和易於管理以外，還提供極具彈性的資料修復機制。Windows Vista 中的 EFS 更進一步增強了多項功能，包括更容易管理及部署，還有可以在智慧卡上儲存金鑰。對於想要更有效保護資料的組織 (即使電腦失竊)，EFS 是一項功能強大的解決方案，且早已成為現有 Windows 平台的一部分。
何處取得詳細資訊
如需有關本專欄所討論主題的詳細資訊，請參閱下列資源：
  • 2007 年 2 月《安全性監控》專欄
  • Encrypting File System in Windows XP and Windows Server 2003
  • How to Use the SysKey Utility to Secure the Windows Security Accounts Manager Database

John Morello 以最優異的成績畢業於 LSU，且已在 Microsoft 工作六年，擔任過各種角色。身為資深的顧問，他曾為美國財星前 100 大 (Fortune 100) 企業及民間和國防部門設計安全解決方案。他目前擔任 Windows Server 小組的專案經理，負責開發安全性和遠端存取技術。


 桌面檔案: PsTools 入門
桌面檔案
PsTools 入門
Wes Miller
下載本文程式碼: MillerTheDesktopFiles2007_03.exe (150KB)

截至去年為止，我都在 Winternals Software 工作，而這家公司於 2006 年 7 月被 Microsoft 收購。Winternals 販售的是商用軟體，但這家公司的創始人 Mark Russinovich 與 Bryce Cogswell 還擁有另一家名為 Sysinternals 的公司，Sysinternals 發佈過許多免費軟體工具。其中有些免費軟體應用程式後來
甚至成為 Winternals Administrator's Pak 中的元件。有些公司希望在一般免費軟體授權合約所規定的範圍以外使用這些工具，Mark 和 Bryce 也會另外提供授權給這些公司。
其中一個我最愛的 Sysinternals 程式庫工具 (好吧，應該說是一整組工具) 就是 PsTools 組合，您現在可從 microsoft.com/technet/sysinternals/utilities/pstools.mspx 取得。Mark 是採取 UNIX 處理序清單公用程式 -- ps，為這些工具命名。如同下載工具的網站所述，內建的 Windows® 命令列公用程式，也能執行與這些工具相同的一些功能。不過，姑且不論工具本身獨一無二的功能，主要的差別在於 PsTools 組合可供本機或遠端使用 (當然，前提是必須正確設定遠端系統)。更棒的是，從遠端執行這些工具的程序幾乎跟從本機執行一樣簡單。
PsTools 組合包含好幾個個別的應用程式，如 [圖 1] 所列。正如其他的 Sysinternals 公用程式一樣，其中只有應用程式而沒有安裝程式。直接將這些應用程式放入已定義路徑的資料夾中，就可以開始使用！
Figure 1 PsTools 公用程式 (Close Figure 1)

工具 | 描述
PsExec | 可讓您在任何使用者內容中執行處理序。
PsFile | 顯示系統上以遠端方式開啟的檔案。
PsGetSid | 顯示電腦或使用者的 Windows 安全性識別碼 (SID)。
PsInfo | 列出有關 Windows 系統的資訊。
PsKill | 根據名稱或處理序識別碼刪除處理序。
PsList | 列出有關執行中處理序的詳細資訊。
PsLoggedOn | 顯示所有本機登入使用者，以及遠端資源共用使用者。
PsLogList | 傾印 Windows 事件記錄檔記錄。
PsPasswd | 變更使用者帳戶密碼。
PsService | 檢視和控制 Windows 服務。
PsShutdown | 讓電腦關閉、重新啟動、休眠或暫止。
PsSuspend | 暫止執行中的處理序。
您可能已經注意到，其中有些功能 (特別是 PsLogList) 可以透過使用 Windows Management Instrumentation (WMI) 和一些複雜的指令碼來完成。但是 PsTools 組合的重點在於，每個公用程式都是專為完成特定工作而設計，而且強調操作的簡便。
我將逐一介紹各個工具，並提供簡單的範例來說明使用這些工具的原因和方法。不過首先我要稍微介紹一下這些工具本身的運作方式，以及使用這些工具的先決條件。

工具的運作方式？
大體而言，這些工具都是以相同的模式運作。您要在主機系統上啟動所需的 PsTool。雖然大部分工具都能在本機執行，但是您將發現，這些工具往往在針對遠端系統或同時針對好幾個系統執行，最能發揮其效用 (我想到 PsExec 是例外，稍後將以範例說明)。公用程式會使用您提供的命令列引數，自行複製到遠端系統的系統管理共用上，這等同於遠端系統上的 %SystemRoot% (Windows 目錄)。
一旦複製到遠端目錄後，應用程式便會自動啟動並安裝 Windows 服務。接著這個 Windows 服務會使用您在啟動時提供的認證，來執行所要求的工作。若有特定工具需要使用用戶端系統上的使用者 UI，那麼這個服務便會在使用者內容中啟動額外的二進位碼檔案(別忘了，服務不能產生直接互動式 UI)。此時服務會傳回必要的資訊給啟動服務的主控台。最後，服務會自我解除安裝。
正如您所見，這些工具的功能強大而且可以獨立執行。雖然執行工具的過程中牽涉到多個二進位碼檔案以及多個處理序，但是身為工具的使用者，您不必操心這些事情，只要執行所需的工具，它自然會開始運作。
若要使用這些工具，必須滿足下列先決條件：Windows NT®、Windows 2000、Windows XP 或 Windows Server® 2003 (支援 Windows 的 x86 版本或 x64 版本，但不支援 Itanium 版本)；執行工具的遠端系統上，必須啟用預設的系統管理網路共用 (admin$)；而且必須在遠端系統上開啟用於「檔案和印表機共用」的連接埠 (無論使用的是 Windows 防火牆、網際網路連線防火牆或其他防火牆產品)。

PsExec
在這些工具中，我個人最愛用 PsExec，而且原因可能出乎您的意料之外。兩年來我有大半時間都是以非系統管理員身分在執行系統，也就是說以使用者而非系統管理員的身分。需要時，我會使用稱為 run.vbs 的簡短指令碼，讓我能夠以本機系統管理員的身分執行應用程式 (其實也能夠以任何使用者的身分執行)。[圖 2] 顯示此指令碼的內容 (您可以從 TechNet Magazine 網站取得這個指令碼，網址是：technetmagazine.com/code07.aspx)。此指令碼假設 Path 系統變數中已經包含 PsTools。
Figure 2 Run.vbs (Close Figure 2)
SET WshShell = WScript.CreateObject("WScript.Shell")
SET WshSysEnv = WshShell.Environment("SYSTEM")
SET FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.Count <> 0 Then
    FOR EACH arg IN WScript.Arguments
        iArgCount = iArgCount + 1
        strCmdArg = (arg)
        strCmdArray = Split(strCmdArg, " ", 2, 1)
        IF iArgCount = 1 THEN
        strExe = strCmdArray(0)
        ELSEIF iArgCount = 2 THEN
        strRun = strCmdArray(0)
        ELSE
        strParams = strParams&" "&strCmdArray(0)
        END IF
    NEXT
END IF
'/t:0A && title ***** Admin *****
        strExt = LCase(Right(strExe, 3))

IF strExt <> "exe" AND strExt <> "bat" AND strExt <> "cmd" THEN
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD  cmd /c start "&strExe&"
    "&strRun&" "&strParams, 0, FALSE
ELSE
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD "&strExe&" "&strRun&"
    "&strParams, 0, FALSE
END IF

    SET WshShell = NOTHING
    SET WshSysEnv = NOTHING
    SET FSO = NOTHING
這個簡單指令碼是一個例子，其中結合了 PsExec 與我們在 Winternals 研發 Protection Manager 產品時 Mark 加入的功能：讓權限受限的使用者提供權限較高的認證，以便從本機啟動 PsExec。當然，PsExec 比較常見的用法是遠端執行，例如，執行本身不提供遠端、指令碼或自動化架構的公用程式。PsExec 的幾個主要功能包括可將二進位碼檔案複製到要執行的遠端系統上，以及指定處理器相關性設定。PsExec 還有一項很方便的功能，就是能夠藉由提供指令檔來同時針對很多電腦撰寫指令碼。
以下是 PsExec 的簡化使用方式：
PsExec \\computer -u username -p password command
您可以使用 [圖 3] 顯示的參數來延伸功能。
Figure 3 PsExec 參數 (Close Figure 3)

參數 | 描述
-a | 指定處理器相關性設定。
-c | 指示是否要複製應用程式到遠端系統。
-d | 指定無須先等待處理序完成再結束 (不會等待成功或失敗訊息)。
-e | 使用指定的帳戶設定檔載入。
-f | 即使遠端系統上已有應用程式也要複製該應用程式。確認您執行的是最新 (或特定) 版本。
-i | 以互動方式在遠端系統上執行應用程式 (若要讓使用者檢視應用程式的使用者介面，就必須這麼做)。
-l | 以權限受限的使用者身分執行應用程式。移除 Administrators 群組語彙基元，同時將其處理序權限縮減為 Users 群組成員的層級。便於以最低權限來執行高風險的網際網路面向應用程式。
-n | 指定要等候的逾時時間，超過此時間則無法連線到遠端電腦。
-priority | 依照指定的優先順序來執行處理序。也就是說，指定 Windows 該如何設定特定工作的處理序優先順序 (-low、-belownormal、-abovenormal、-high 或 -realtime )。
-s | 使用系統 (System) 帳戶執行處理序 (便於執行 Regedit 來存取需要特殊權限的登錄機碼)。
-v | 只複製版本更新的應用程式。
-x | 在 Winlogon 安全桌面上顯示 UI (只適用於本機系統)。
@file | 在文字檔案中指定的所有電腦上執行命令。

PsFile
相較於 PsExec，PsFile 算是用途比較狹窄的工具。具體來說，它是用來檢查遠端系統上開啟了哪些檔案，以及由誰開啟。如果您想要在重新啟動伺服器之前，先追蹤哪些檔案處於開啟狀態，這個工具就很好用。如果您要知道哪位使用者鎖定了檔案 (可能是為了防止檔案被編輯或刪除)，您可以手動方式通知使用者，或透過 PsFile 關閉檔案。PsFile 的使用方式如下：
PsFile \\computer -u username -p password
這只會傳回在遠端系統上的已開啟檔案控制碼清單。除了標準用法以外，您也可以新增 Id 參數到陳述式中，以便指定您想要尋找相關資訊或要關閉的檔案名稱。您還可以加入 -c 參數，這樣會關閉您使用 Id 參數所指明的檔案。

PsGetSid
PsGetSid 也是用途較為狹窄的工具。它會告訴您有關電腦、使用者或群組的安全識別項 (SID)。若您想要確認網域中沒有重複使用 SID，或只是想要檢查系統上所有使用者或群組的 SID，都很適合使用這個工具。PsGetSid 的使用方式如下：
PsGetSid \\computer -u username -p password account
請注意，帳戶可以用來指定使用者、電腦或群組。PSGetSid 的語法很簡單，不過還提供幾個額外參數。SID 參數可指定已經有指定 SID 的帳戶 (群組或電腦)，而 @file 則會根據指定的文字檔案清單，在清單所列的所有電腦上執行命令。

PsInfo
PsInfo 可用來提供詳細的系統資訊。顯然這個工具在撰寫多個遠端系統的指令碼時最好用，它的輸出會傳送到檔案 (例如 Excel® 及適用於資料庫的 CSV 檔案)。請注意，這個公用程式運作的重要概念與其他大部分的工具不同：如果您並未提供電腦名稱，則 PsInfo 預設會嘗試查詢網域中的所有電腦。PsInfo 的使用方式如下：
PsInfo  \\computer -u username -p password
語法很簡單，不過也提供如 [圖 4] 所示的額外參數 (Switch/Parameter)
Figure 4 PsInfo 參數 (Close Figure 4)

參數 | 描述
-h | 顯示所有 Windows 更新。
-s | 顯示系統上安裝的所有應用程式。
-d | 顯示有關系統的磁碟/磁碟區資訊。
-c | 以 CSV 格式輸出結果。
-t | 指定 \t 預設值以外的另一種 CSV 檔案分隔符號。
Filter | 只顯示符合指定篩選條件的資料。
@file | 在指定的文字檔案所列的所有電腦上執行命令。

PsKill
PsKill 是適用於在本機或遠端系統上終止處理序的公用程式。用法很簡單，它可讓您迅速刪除處理序以及其所有子處理序。PsKill 的使用方式與我先前討論的其他工具很類似：
PsKill -t \\computer -u username -p password process id | process name
請注意，您可以指定所要刪除的處理器識別碼或處理器名稱。

PsList
我不常使用 PsList，因為我是 Process Explorer 的愛用者 (詳細資訊請參閱 microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx)。不過由於 Process Explorer 沒有可遠端處理的版本，因此 PsList 理所當然成為 Process Explorer 提供的某些關鍵功能的代用品。實際上，PsList 是一份可遠端處理清單，其中包含在遠端系統上執行的一個或多個處理序。
PsList 的使用方式很簡單：
PsList \\computer -u username -p password account
正如其他工具一樣，帳戶參數可以指定為使用者、電腦或群組。額外的參數如 [圖 5] 所示。
Figure 5 PsList 參數 (Close Figure 5)

參數 | 描述
-t | 顯示執行緒層級的資訊。
-m | 提供每個處理序的詳細記憶體資訊。
-x | 顯示處理序、記憶體及執行緒資訊
-t | 以處理序樹狀目錄的方式顯示資訊 (類似 Process Explorer 樹狀檢視)。
-s [n] | 在工作管理員模式中持續執行指定的秒數。這樣可即時顯示 (相對而言) 遠端處理序資訊。
-r [n] | 指定在工作管理員模式中執行時，重新整理的頻率 (以秒為單位)。
name | 顯示以指定名稱開頭之處理序的相關資訊。
-e | 精準比對處理序名稱。
pid | 顯示有關特定處理序的資訊。
PsList 的功能超強且容易使用，讓您無須使用遠端桌面即可檢視詳盡的遠端處理序資訊。舉例來說，您可以利用這些資訊進一步透過 PsKill 或 PsSuspend 來處理必須制止的處理序。

PsLoggedOn
PsLoggedOn 的用途不言可喻。此公用程式會顯示登入系統的使用者。無論是本機 (互動) 登入或網路共用登入均可顯示。這個工具與 PsFile 相似，當您需要在伺服器上執行維護作業時，很適合用來辨識正在使用伺服器的使用者。使用方式很簡單：
PsLoggedOn \\computer
PsLoggedOn 只有兩個選擇性參數：-l 只會顯示本機登入 (無網路登入)，而 -x 會排除登入時間。
雖然功能很陽春，不過 PsLoggedOn 可讓您輕鬆地檢視資訊，而不用辛苦地在好幾個 Windows 位置中挖掘。

PsLogList
PsLogList 是最實用的公用程式之一，這個工具將 Windows 事件記錄檔傾印成文字格式，接著再用於記錄讀取器、資料庫或其他任何用途。它的主要優點是能夠將事件記錄檔項目從原本的二進位格式轉換成容易轉換或自動化的格式 (當然，在 Windows Vista™ 中的事件記錄檔原本就提供 XML 格式，不過這又另當別論了)。
PsLogList 的使用方式如下：
PsLogList \\computer -u username -p password
另外提供的一些額外參數如 [圖 6] 所示。
Figure 6 PsLogList 參數 (Close Figure 6)

參數 | 描述
-a | 指傾印指定日期之後的事件。
-b | 只傾印指定日期之前的事件。
-c | 傾印所要的輸出後，永久清除事件記錄檔。
-d | 只顯示指定天數的資訊。
-e | 排除包含指定事件識別碼的事件 (最多可指定 10 個)。
-f | 篩選事件類型 (警告、錯誤...等等)。
-g | 將事件記錄檔匯出成 EVT 檔案 (需要使用 -c 參數)。
-h | 只顯示指定小時數的資訊。
-l | 從指定的 EVT 檔案傾印。
-m | 只顯示指定分鐘數的資訊。
-n | 只顯示指定筆數內的最新事件。
-o | 只顯示來自特定來源的事件 (例如，-o SRService 代表來自 Windows System Restore Service 的事件)。
-q | 排除特定來源的事件 (與 -o 相反)。
-r | 反轉順序，依照最舊到最新的順序來傾印記錄事件。
-s | 以每行一個分隔欄位的方式列出記錄。
-t | 將 -s 輸出的分隔符號 (逗號) 指定為其他符號。
-w | 等待新事件填入，然後即時傾印。這只適用於本機系統。
-x | 傾印事件記錄檔的延伸資料。
eventlog | 指定要傾印的事件記錄檔。預設值是 System。
@file | 在文字檔案中指定的所有電腦上執行命令。
Windows 事件記錄檔是一項功能極為強大的診斷工具，不過麻煩的地方是取得資料以致於能夠操作或合併這些資料的過程。PsLogList 就能處理這件麻煩事。

PsPasswd
PsPasswd 是簡單而有效的公用程式，其設計與 Net.exe 的一些功能雷同，但兼顧了可遠端處理及自動化的能力。
PsPasswd  \\computer -u username -p password Username Newpassword
您可以指定電腦，也可以不指定電腦 (本機系統)，或者將電腦指定為 \\*，如此一來，公用程式便會在目前網域中的所有電腦上執行。PsPasswd 只提供一個額外參數：@file 在文字檔案中指定的所有電腦上執行命令。再強調一次，這是非常基本的公用程式，但是可提供超強的多系統操作功能。

PsService
PsService 可讓您檢視及編輯網路中的一個或多個系統上的服務控制管理員 (SCM) 資訊，您甚至可以搜尋位於您網路中的系統上的指定服務名稱。
PsService \\computer -u username -p password command options
執行 PsService 時，命令是指 [圖 7] 所列的其中一個命令，而選項則會指定要套用到特定命令的屬性。若未提供額外的命令參數，PsService 將會提供完整的 SCM 資訊傾印。
Figure 7 PsService 命令 (Close Figure 7)

命令 | 描述
query | 查詢指定的服務。
config | 查詢指定服務的組態資訊。
setconfig | 設定指定服務的組態資訊。
start | 啟動服務。
stop | 停止服務。
restart | 重新啟動 (停止再啟動) 服務。
pause | 暫停服務。
cont | 繼續執行暫停的服務
depend | 顯示依存指定服務的服務。
find | 在網路中尋找指定的服務執行個體。
security | 提供指定服務的安全性資訊。
因此您可以將 PsService 想像成功能強大且提供可遠端處理之命令列的 Services.msc 翻版，不僅如此，還可讓您跨網路查詢服務 (看看是否有潛在危險性的服務) 並設定組態資訊。

PsShutdown
PsShutdown 是另一個我愛用的工具。有些人可能會說，Microsoft 已經包含可處理這項工作的工具 (shutdown.exe)，但其實不盡相同。主要差別在於 PsShutdown 的強大功能：也就是它可以關閉或重新啟動遠端系統。除此之外，這個工具還能讓系統進入待命或休眠模式 (不僅是關機或重新啟動)，也可以鎖定系統，還可以對使用者顯示訊息，然後在指定的一段時間後重新啟動系統。
PsShutdown \\computer -u username -p password
PsShutdown 可以使用一些額外參數，如 [圖 8] 所示。
Figure 8 PsShutdown 參數 (Close Figure 8)

參數 | 描述
-a | 中止由 PsShutdown 啟動的正在進行中的關機作業。
-c | 可讓互動使用者中止關機作業。
-d | 暫止電腦 (待命)。
-e | 關機理由代碼。建議您瀏覽 Microsoft 網站以取得使用這些參數的協助，因為這些參數同時與 PsShutdown 和內建 shutdown.exe 搭配使用時可能會引起問題。詳細資訊請參閱 msdn2.microsoft.com/en-us/library/aa376885.aspx。
-f | 強制終止所有執行中的應用程式。
-h | 讓電腦休眠。
-k | 關閉電腦電源 (若不支援電源關閉，則重新開機)。
-l | 鎖定電腦。
-m | 指定要向互動使用者顯示的訊息。
-n | 指定要等候的逾時時間，超過此時間則無法連線到遠端電腦。
-o | 登出主控台使用者。
-r | 重新啟動電腦。
-s | 關機，但不關閉電源。
-t | 執行關機命令前的倒數計時時間，或是關閉電源的特定時間。
-v | 關機之前向使用者顯示的訊息。
@file | 在文字檔案中指定的所有電腦上執行命令。
您可以看出，PsShutdown 是功能超強且可設定性很高的系統電源控制公用程式，而且相對來說很容易使用。

PsSuspend
若您想要暫時管控不聽話的處理序，或是希望高 CPU 使用率的處理序暫緩執行且不會遺失任何資料或應用程式內容，那麼 PsSuspend 是很方便的公用程式。
PsSuspend \\computer -u username -p password process ID
您可以使用 PsList 來取得處理序識別碼。將處理序暫止之後，可以使用 -r 參數來繼續執行該處理序。請注意，Process Explorer 也實作了暫止及繼續執行處理序的概念，但只適用於本機。顯然 PsSuspend 能夠在遠端與本機上暫止和繼續執行處理序，在這點上它比 Process Explorer 的內建實作更有優勢。

結論
我發覺 PsTools 組合是很寶貴的公用程式集。當我在系統中重新安裝 Windows 時，相較於其他 Sysinternals 公用程式 (即 Regmon、Filemon、Process Explorer 以及現在的 Process Monitor)，PsTools 是第一個放入我的路徑中的程式。如果您之前不熟悉 PsTools，我希望本專欄能夠帶領您認識這套工具，如果您已經知道 PsTools，那麼我希望您在此能獲得有關此工具的一些額外知識。當然我要特別感謝 Mark Russinovich 這麼多年來免費提供這些工具，並且在我撰寫這篇專欄時提供內容上的協助。

Wes Miller 是 Pluck 公司 (www.pluck.com) 的開發經理，該公司位於美國德州的奧斯丁。Wes 之前任職於同樣位在奧斯丁的 Winternals Software，並且曾在 Microsoft 擔任 Windows 的專案經理與產品經理。Wes 的聯絡方式為 technet@getwired.com。


 Inside Microsoft.com: 資料庫鏡像快速入門
Inside Microsoft.com
資料庫鏡像快速入門
Saleem Hakani

如果您的資料庫離線了，您可能就會一籌莫展，對嗎？然而，如果您使用的是含 SP1 的 SQL Server 2005，資料庫鏡像功能可以避免這樣的災難。此嶄新的高可用性科技可讓您將資料庫持續保持在熱待命 (Hot Standby) 的狀態，以便在實際執行的資料庫
因任何原因而無法使用時進行備援。資料庫鏡像功能的運作方式，是將資料庫的交易記錄從主要伺服器轉移到次要伺服器，而此次要伺服器的作用就是以熱待命提供備援。有進行資料庫鏡像作業時，在變更實際資料頁之前，資料的變更會先記錄在交易記錄中，如同 SQL Server™ 的更新作業一樣。記錄檔的記錄首先會放置在主要資料庫的記錄緩衝記憶體中，然後再儲存到磁碟中予以保存。這些交易記錄會複製到鏡像伺服器的資料庫中，並重新執行。這會造成主要資料庫的變更被複製到鏡像資料庫上。請注意，只有主要資料庫可供用戶端連線存取。當主要資料庫收到用戶端的變更要求時，主要伺服器會將允許的變更傳送到鏡像伺服器；鏡像伺服器並不會自行做出這些決定。啟用資料庫鏡像之後，當主要資料庫失敗時，就可以使用鏡像資料庫。

資料庫鏡像的運作原理
支援 SQL Server 2005 的標準硬體，都可用於資料庫鏡像，這可確保資料在資料庫失敗時不會遺失。鏡像資料庫永遠都會以目前正在主要資料庫伺服器上處理的交易進行更新。[圖 1] 說明資料的流向。
如果您的主要伺服器不幸停止運作，您還是可以放心，因為鏡像伺服器上會有主要資料庫按照已認可交易時間點所儲存的完整副本。因此，鏡像伺服器永遠都是備妥可隨時接手主要伺服器的角色。
Figure 1 Data replication to the mirror
Figure 1 Data replication to the mirror
在資料庫鏡像拓撲當中，如果您想要在主要伺服器和鏡像伺服器之間啟動自動容錯移轉，就需要稱為見證伺服器的第三部伺服器。見證伺服器可以是任何支援 SQL Server 2005 的電腦。

作業模式
您所使用的資料庫鏡像拓撲，取決於您所選擇的交易安全性和作業模式。資料庫鏡像所支援的作業模式包含高安全性 (無論有無自動容錯移轉) 和高效能。
高安全性 (有自動容錯移轉)：此模式支援最高資料庫可用性，有同步資料移轉和自動容錯移轉至鏡像資料庫的功能。此作業模式最適合在主要伺服器與鏡像伺服器之間有快速且可靠的通訊，而且您只需要針對單一資料庫進行自動容錯移轉。使用此配置時，主要資料庫在認可交易之前會先等候鏡像伺服器的訊息，亦即確認鏡像伺服器已順利將交易的記錄儲存到磁碟上。
高安全性 (無自動容錯移轉)：此模式支援最高資料庫可用性，有同步資料移轉至鏡像資料庫的功能，但是沒有自動容錯移轉至鏡像資料庫的功能。在此模式中，如果鏡像伺服器執行個體變得無法使用，主要伺服器執行個體就會持續運作，但是無法鏡像資料。如果主要伺服器停止運作，資料庫鏡像就會暫停，但是您可以手動強制服務進行容錯移轉。
高效能：在此作業模式當中，資料的轉移是非同步的。主要伺服器並不會如同上述兩種模式一樣，等候鏡像伺服器的確認。鏡像伺服器會竭盡所能跟上主要伺服器的腳步，但是並不保證主要伺服器上的所有最新交易，都能夠隨時儲存到鏡像伺服器的交易記錄中。如果主要伺服器停止運作，資料庫鏡像就會暫停，但是您可以手動強制服務進行容錯移轉。

奠定基礎
只要您使用最佳作法來建立穩固的基礎，資料庫鏡像設定其實是很簡單的程序：
伺服器版本 確認主要伺服器和鏡像伺服器所執行的是相同版本的 SQL Server 2005，您可以使用 Standard 版或 Enterprise 版。
見證伺服器可用性 如果您計劃使用高安全性伺服器加上自動容錯移轉功能，請確定見證伺服器是可用的，而且已經安裝了 SQL Server 2005 (無論是任何版本)。見證伺服器可以在任何支援 SQL Server 2005 的可靠電腦系統上執行。
鏡像影像 請確定鏡像伺服器執行個體與主要伺服器執行個體有完全相同的作業、登入、SQL Server Integration Service (SSIS) 套件、磁碟分割、檔案位置及伺服器組態。將鏡像伺服器設定成與主要伺服器完全相同，才能夠讓鏡像伺服器的運作和主要伺服器相同。
完整復原 請注意，所有加入資料庫鏡像的資料庫，都必須設定為「完整」復原模式。
Master 和 TempDB 確認在鏡像拓撲中的所有伺服器執行個體，都使用相同的 Master 和 TempDB 定序和字碼頁。使用不同的定序和字碼頁可能會造成設定資料庫鏡像時發生問題。
備份 如果要進行鏡像的資料庫很龐大，您必須先為資料庫執行完整備份，然後使用 [NORECOVERY] 選項，在鏡像伺服器執行個體上還原。
預先規劃 決定所有伺服器名稱、通訊埠編號、安全性帳戶及資料庫位置，並且記錄這些資料。請參閱 [資料庫鏡像最佳作法] 資訊看板來檢視核對清單。
一但您已確切處理了基礎工作，就可以開始動手在環境中設定資料庫鏡像。
資料庫鏡像最佳作法
  1. 使用擁有相同 CPU、記憶體、儲存裝置及網路容量的夥伴伺服器。
  2. 確定雙方伺服器都安裝了相同的 SQL Server 和 OS 版本、Service Pack 及更新程式。
  3. 將 SQL Server 安裝在主要伺服器執行個體和鏡像伺服器執行個體上的相同目錄和磁碟機結構中。
  4. 如果效能成為問題，請考慮使用專屬網路介面卡來分攤負載量。
  5. 如同伺服器夥伴，請確定主要伺服器執行個體和鏡像伺服器執行個體在 CPU、記憶體、儲存裝置和網路容量方面都完全相同。確認兩部伺服器都有相同的目錄結構、磁碟分割配置及 SQL Server 組態，才可以免除在執行容錯移轉至鏡像夥伴伺服器期間，或是執行容錯移轉至鏡像夥伴伺服器之後，還需要進行這些設定的變更。
  6. 確定所有的應用程式都可以連接和執行所有必要的動作，而且主要伺服器執行個體上的所有使用中 SQL Server 登入 (以及它們的權限) 也都存在於鏡像伺服器執行個體上。您可以使用 [傳送登入工作] 工作，讓 SQL Server 2005 Integration Services 來完成此工作。
  7. 從主要伺服器複製 SQL Server 代理程式作業、警示、SSIS 封裝、支援資料庫、連結的伺服器定義、備份裝置、維護計劃、資料庫郵件設定檔...等等到鏡像伺服器。
  8. 建立標準程序，讓您無論何時在主要伺服器上做出任何變更 (如硬體變更、軟體變更、SQL Server 設定變更或是任何資料庫物件變更) 時，系統會自動進行重複或是複寫，以傳送變更到鏡像伺服器執行個體上。
  9. 在正式使用之前，先執行多重容錯移轉測試。

設定作業
讓我們使用具備自動容錯移轉的高安全性作業模式，來設定資料庫鏡像功能 (如同前述，這表示需要見證伺服器執行個體)。在此範例中，我將使用 [圖 2] 的伺服器和資料庫名稱，這也指定了每個伺服器的角色。
請記住，由於設定可能會影響從主要伺服器複製擱置中的交易記錄到鏡像伺服器時的效能，所以您或許應該選擇在離峰時段執行資料庫初始設定。
鏡像功能的設定包含三個步驟：在參與鏡像作業的伺服器上建立端點、針對主要資料庫執行備份和還原，以及在所有參與的伺服器上啟動鏡像工作階段。
在建立資料庫鏡像工作階段之前，您必須先為所有參與資料庫鏡像作業的伺服器建立通訊機制。若要這麼做，請同時在 ServerA 和 ServerB 上執行下列陳述式，在所有伺服器上建立端點：
Create Endpoint Mirroring_Endpoint
State= Started as TCP (Listener_Port=5001)
For Database_Mirroring (Role=Partner);
請將 ServerC (它將會是見證伺服器) 的 (Role=Partner) 變更為 (Role=Witness)，然後執行陳述式。這將控制每個執行個體接聽的 TCP 通訊埠。
在下一個步驟當中，您應該執行完整的資料庫備份，接著進行主要伺服器 DBM_Demo 資料庫記錄檔的備份，然後使用 [NORECOVERY] 選項，在鏡像伺服器上還原此資料庫 (使用 NORECOVERY 可以確保鏡像資料庫將會是在還原狀態中，讓交易記錄可以套用)。
以下是從 ServerA (主要伺服器執行個體) 進行 DBM_Demo 資料庫完整備份的 T-SQL 陳述式：
Backup Database DBM_Demo to DISK='E:\MSSQL\Bak\DBM_Demo_FULL.bak';
在您執行完整資料庫備份之後，如果資料庫有任何的變更，就可能需要執行資料庫記錄的備份；否則應該不需要。
如有必要，您可以使用下列 T-SQL 陳述式，從 ServerA 上執行 DBM_Demo 資料庫記錄的備份：
Backup Log DBM_Demo to Disk='E:\MSSQL\Bak\DBM_Demo_Log.bak';
一但您已執行過所有的備份工作，請將備份檔案移到 ServerB 或到一個共用位置，讓您可以在 ServerB 上還原這些備份檔案。完成這些步驟之後，您也應該還原自上一次 ServerA 執行完整資料庫備份之後，所備份的任何交易記錄。
您可以使用下列 T-SQL 陳述式，在 ServerB 上以 [NORECOVERY] 選項來還原完整備份和記錄的備份：
--Restore full database backup on the mirror --server instance
Restore Database DBM_Demo from Disk='E:\MSSQL\Bak\DBM_Demo_FULL.bak' with NORECOVERY;
最後，請使用下列 T-SQL 陳述式，以 [NORECOVERY] 選項在鏡像伺服器上還原記錄的備份：
Restore Log DBM_Demo from Disk='E:\MSSQL\Bak\DBM_Demo_Log.bak' with NORECOVERY;
完成所有備份的還原之後，您就可以執行最終步驟 -- 在所有參與的伺服器上啟動您的資料庫鏡像工作階段。
資料庫鏡像工作階段的設定，需要每個伺服器執行個體都有伺服器網路位址。此位址必須藉由提供系統位址和該執行個體所接聽的通訊埠編號，來識別該執行個體。伺服器網路位址語法應如下所示：
TCP://<System-address>:<port>
其中 <System-address>:是完整的網域名稱或是 IP 位址，您可以從本機電腦的命令提示字元中執行 IPCONFIG，來獲取此資訊。
<Port> 則是在您建立端點時就已經建立了。
在 ServerB 上啟動資料庫鏡像工作階段的方法如下所示：
Alter Database DBM_Demo
Set Partner= 'TCP://ServerA.com:5001';
然後在 ServerA 上執行下列 T-SQL，即可啟動工作階段：
Alter Database DBM_Demo
Set Partner='TCP://ServerB.com:5001';
接下來，請啟用 ServerC (見證伺服器) 上的鏡像工作階段，如下所示：
Alter Database DBM_Demo
Set Witness='TCP://ServerC.com:5001';
現在您的工作環境已經可以開始執行資料庫鏡像了。任何在 DBM_Demo 資料庫上所新增或是修改的資料庫物件，都會傳送到 ServerB 的備份上。然而，如果 ServerA 的資料庫變得無法使用，就可能會造成容錯移轉，使鏡像資料庫的角色變成主要資料庫的角色。
完成資料庫鏡像功能的設定且開始執行之後，如果您的實際資料庫停止運作，就會有一個熱待命的資料庫可以隨時接手。

Saleem Hakani 是 Microsoft 的資深資料庫工程師，他在資料庫系統方面有超過 14 年的經驗。他成立且主導 Microsoft SQL 社群，而且負責發表遍及 Windows Live 組織的 SQL Server 標準化與自動化。Saleem 擁有 MCTS、MCDBA 及 MCSA 等證照。他的電子郵件為 Saleem@sqlcommunity.net。


 現場筆記: 門診開始
現場筆記
門診開始
Matt Hester

不久之前 ，我發現 IT 專家有點像醫生。這是我在剛開始使用 Windows Vista™ 時所得到的啟示。當時我碰到的是網路連線的問題。經過數個小時的 ping、ipconfig 還有幾次重新開機，我的 IT 專家好奇心突然將目光集中到一個新字眼：「診斷」。通常，當我在使用作業系統時，只會看到如「修復」、「狀態」、「工作管理員」及「傳送錯誤報告」等字眼，來協助我檢測作業系統。但是「診斷」這個字眼，卻令我聯想到這兩種職業的相似性。
首先，醫生和 IT 專家都需要通過專業的能力測驗和認證，這樣才能在我們的姓名中冠上敬稱/職稱縮寫。這些敬稱/職稱縮寫可以用來識別我們的專業領域，也可以讓牆壁上的獎狀和名片更引人注目。
和醫生一樣，IT 專家也需要仰賴各種資源來排解問題。醫生們會和其他同事共同研討難題，也會在專業的刊物和網際網路中搜尋相關資訊。像我這樣的 IT 專家也會和同事們共同研討難題，並透過網際網路和技術刊物中尋找相關資訊 (當然一定會先查詢 TechNet Magazine 囉！) 來協助我們排解問題。
此外，醫生和 IT 專家都需要仰賴工具。醫生們會使用各種儀器，像是聽診器；而我們則使用 ping。這些都是可以讓我們「聆聽」狀況的工具。
最後一個共同點與社交行為有關。亦即無論是醫生或 IT 專家，到了社交場合都或盡量掩蓋我們的專業身分。唉，最近在一個派對中，我就被揭穿身分，而且突然變得很受歡迎。但所謂的受歡迎是有代價的：我遺失了個人的特質，沒有人會「真正」認識我。我直接變成「電腦先生」，而且還被強迫需要為派對上的所有客人提供現場電腦技術支援服務：「嘿，電腦先生，我的電腦早上怎麼會當機呢？」「嘿，電腦先生，請問『任何』鍵是在鍵盤上的哪個位置？」、「嘿，電腦先生，你可以幫我修理我的 Mac 電腦嗎？」最嘔的是我看到房間對面有一位醫生，他一直在偷笑，因為他可以不受打擾地盡情跳舞。
現在讓我回到連線的問題吧：過了大約三個小時一直無法連線之後，我終於決定按一下新發現的 [診斷和修復] 按鈕。當我看到下列回應畫面時，真的是又驚訝又難堪：
我難堪到嘴巴無法合攏，整個臉漲紅，我趕快看看四周，以確定沒有人看到我的窘境。接著我把網路線插入電腦後端。在該好笑事件之後，我經常會在使用 Windows Vista 時利用診斷功能。此功能讓我在偵測問題時，節省了不少的時間。而且它可以完全與 [問題報告及解決方案] 控制台整合，亦即您可以在線上便捷地搜尋其他資訊。建議您善用此功能，可以為您省下不少麻煩喔。
當晚我迷迷糊糊快要睡著時 (很放鬆又很滿足，因為順利找出並解決網路連線問題)，我開始想：這是否代表我可以去打高爾夫球和去買一部新跑車來犒賞一下自己？

Matt Hester 是 Microsoft Across America 小組的成員，擔任 TechNet 的講師。若要進一步了解他的演講內容，請造訪 technetevents.com/mhester。您也可以造訪他的部落格，網址為 blogs.technet.com/matthewms。


 Windows 機密文件: 大智若愚
Windows 機密文件
大智若愚
Raymond Chen

當您 將 CD 光碟片放入電腦時，Windows® 或許會詢問您下一歩該怎麼做，即使上一次您已經告知電腦該怎麼做。為什麼 Windows 會忘記您的自動播放設定呢？事實上它並沒有忘記，只是在跟您確認而已。
Windows XP 處理 CD 自動播放的方式有兩個問題存在。首先，有許多使用者發現在安裝完支援 CD 自動播放的程式之後，他們不知該如何將此程式設定為新的預設 CD 自動播放程式。如果他們在先前就已選取了一個程式，並且勾選了 [自動執行選取的動作]，就不容易發現如何取消此執行動作以再次顯示 CD 自動播放對話，讓使用者能夠重新選取預設程式。
再來，某些素行不良的應用程式在安裝的時候，會祕密地自行竄改未記載的 CD 自動播放功能，讓自己成為預設的 CD 自動播放處理常式，進而取代使用者的選擇。
總之，對使用者而言有兩個問題，也就是：「我剛剛才安裝了此程式，而我想要它成為我的 CD 自動播放程式」，還有情況正好相反的「我剛剛才安裝了此程式，但是我不想要它成為我的 CD 自動播放程式」。
Windows Vista treats autoplay settings globally
Windows Vista treats autoplay settings globally
Windows XP Service Pack 2 (SP2) 推出了嶄新的 CD 自動播放行為，為的就是要嘗試解決這些問題。當系統偵測到有新的 CD 自動播放處理常式可用時，Windows 就會再次顯示 CD 自動播放對話。這讓您有機會選取您剛安裝的新應用程式，或是如果該應用程式大膽地將自己設定為新的預設播放程式，您也可以取消選取該應用程式。
在升級到 Windows XP SP2 之後，您也會在初次插入 CD 時看到 CD 自動播放對話方塊。這是「遲到總比不到好」的對話方塊，主要是要在您升級到 Windows XP SP2 之後，用來應付先前已安裝的處理常式。
在以往，作業系統只需關注如何提供介面給開發人員運用。但是在當下的軟體環境中，它還需要擔憂如何阻絕濫用介面的程式設計師。
另一種情況是 Windows 看起來似乎已經忘記您的自動播放設定。當您插入卸除式儲存裝置時 (如 USB 磁碟機)，電腦可能還是會顯示提示問題，即使您已經選取選項，並且核取 [自動執行選取的動作]。這並非 Windows 已經忘記您的自動播放設定，而是因為記得太清楚。
當您為卸除式儲存裝置選取一個選項時，Windows 會記住該裝置的設定。如果您插入不同的裝置，將會有新的提示方塊出現，因為您並未指定此裝置的行為。此設計的意圖在於讓您可以將數位相機預設成 [檢視圖片]，而將音樂播放器預設成 [播放音樂] (如果裝置沒有序號，那麼將該裝置插入到不同的 USB 連接埠時，電腦會將它視為另一個不同的裝置)。
對於 Windows XP 設計所造成的混淆，Windows Vista™ 已經變更此行為了。自動播放設定已視為全域性，而非針對個別裝置。如果您選取 [不要有任何動作]，那麼 Windows Vista 就不會進行任何動作，無論您是否插入另一個裝置，或是在什麼位置插入。有時候要讓作業系統看起來更聰明，就是要讓它裝笨，正所謂「大智若愚」。

Raymond Chen 的網站 The Old New Thing (英文) (blogs.msdn.com/oldnewthing)，以及採用相同標題做為個書名的出版品 (Addison-Wesley，2007)，專門研討 Windows 的歷史及 Win32 的程式設計。聽說他在閒暇之餘會去改國中生的作文。