RestoreClusterDatabase 函式 (clusapi.h)
[此函式可用於需求一節中指定的作業系統。 Windows Server 2008 已移除此函式的支援,此函式不會執行任何動作並傳回 ERROR_CALL_NOT_IMPLEMENTED。]
還原叢集資料庫,並在呼叫函式的節點上重新啟動叢集服務。 此節點稱為還原節點。
語法
DWORD RestoreClusterDatabase(
[in] LPCWSTR lpszPathName,
[in] BOOL bForce,
[in, optional] LPCWSTR lpszQuorumDriveLetter
);
參數
[in] lpszPathName
以 Null 結尾的 Unicode 字串,指定備份文件的路徑。 叢集組態資訊包含在此位置中;這是應保護的敏感數據。 例如,您可以使用存取控制清單來保護此資料,以限制資料儲存位置的存取權。
[in] bForce
如果為 FALSE,如果適用下列任一情況,則不會完成還原作業:
- 其他節點目前為作用中。
- 目前仲裁資源的分割區配置與進行備份時就地的仲裁資源分割配置不同。 (「分割區配置」一詞是指磁碟上的分割區數目,以及每個分割區的位移。磁碟簽章和驅動器號指派不一定相同。)
[in, optional] lpszQuorumDriveLetter
選擇性。 識別 要還原叢集資料庫 之仲裁資源的驅動器號。 只有在備份之後已取代仲裁資源時,才使用此參數。 字串的格式必須如下所示:
- 第一個字元必須是字母,也就是範圍 'a'-'z' 或 'A'-'Z'。
- 第二個字元必須是冒號 (『) 。
- 第三個字元必須是終止 null ('\0') 。
傳回值
如果作業成功,函式會 傳回ERROR_SUCCESS。
如果作業失敗,函式會傳回 系統錯誤碼。 以下是可能的錯誤碼。
傳回碼 | Description |
---|---|
|
作業失敗,因為其他叢集節點目前為作用中。 如果您再次呼叫 RestoreClusterDatabase ,並將 bForce 設定為 TRUE,叢集會嘗試關閉其他作用中節點上的叢集服務。 |
|
作業失敗,因為備份中所述的仲裁磁碟不符合目前的仲裁磁碟。 如果您再次呼叫 RestoreClusterDatabase 並將 bForce 設定為 TRUE,叢集會嘗試將目前仲裁磁碟的簽章和驅動器號變更為儲存在備份中的值。 |
備註
如果還原作業成功,還原節點會根據還原叢 集 資料庫中的組態數據形成叢集。 當其他節點加入叢集時,它們會從還原節點上的資料庫更新其叢集資料庫。
請注意,在還原的叢集資料庫無法辨識備份之後新增或變更的仲裁資源以外的 叢集磁碟 ,即使還原作業成功,仍會保持 脫機 狀態。 您必須為這些磁碟建立新的 資源 (請參閱 建立實體磁碟資源) 。
建議針對任何叢集還原例程使用下列一般程式:
- 呼叫 RestoreClusterDatabase , 並將 bForce 設定為 FALSE 且未指定驅動器號。 這是最佳方法,因為如果成功,作業就不需要強制變更組態。
-
如果第一次呼叫失敗,讓用戶決定是否要強制程序繼續或手動修正問題。 請務必傳達每個決策的影響。
傳回值 強制時採取動作 手動修正 ERROR_CLUSTER_NODE_UP 還原作業將會停止所有其他節點上的叢集服務。 用戶手動關閉所有其他叢集節點上的叢集服務。 Net Stop ClusSvc 命令已足夠;不需要完全關閉電源。 ERROR_QUORUM_DISK_NOT_FOUND 用戶必須提供仲裁資源的驅動器號。 還原作業會將磁碟的簽章和驅動器號變更為儲存在備份中的值。 使用者會重新分割仲裁磁碟,讓配置與儲存在備份中的配置相同。 如果使用者同意強制接續,請呼叫 RestoreClusterDatabase ,並將 bForce 設為 TRUE ,並在適用) 時呼叫指定的驅動器號 (。 強制不保證成功。 如果還原作業再次失敗,請測試傳回值並適當地回應。
範例
下列範例說明上述程式。 如需包含 BackupClusterDatabase的更完整範例,請參閱 備份和還原叢集組態。 此範例使用故障轉移叢集檔中定義的 ClusDocEx.h 頭檔。
int main( void )
{
WCHAR szPath[] = L"c:\\ClusBack\\19991215";
WCHAR szInput[3];
BOOL bForce = FALSE;
DWORD dwResult = ERROR_SUCCESS;
// First try: no force
dwResult = RestoreClusterDatabase( szPath, FALSE, NULL );
// Allow user to force shutdown if necessary.
if( dwResult == ERROR_CLUSTER_NODE_UP )
{
wprintf( L"The operation failed because other cluster nodes are currently active. " );
wprintf( L"The Cluster service must be shut down on all other nodes in order for this operation to succeed." );
wprintf( L"Enter 'f' to force automatic shutdown, or any other key to exit for manual shutdown: " );
fgetws( szInput, 2, stdin );
if( towupper( szInput[0] ) == L'F' )
dwResult = RestoreClusterDatabase( szPath, TRUE, NULL );
}
// Allow user to locate quorum resource if necessary.
if( dwResult == ERROR_QUORUM_DISK_NOT_FOUND )
{
wprintf( L"\n\nERROR: QUORUM DISK NOT FOUND\n" );
wprintf( L"The restore routine cannot find a quorum resource with the same partition layout as the quorum resource described in the backup. " );
wprintf( L"The existing quorum resource must have a layout (number of partitions and offsets to each partition) identical to the layout stored in the backup.\n" );
wprintf( L"Enter the drive letter of the quorum resource to force continuation, or any non-letter key to exit: " );
fgetws( szInput, 3, stdin );
if( iswalpha( szInput[0] ) )
{
szInput[1] = L':';
szInput[2] = L'\0';
dwResult = RestoreClusterDatabase( szPath, TRUE, szInput );
}
}
// Only one force attempt per error, then report success or failure.
if( dwResult == ERROR_SUCCESS )
{
wprintf( L"\n\nSUCCESS\n" );
wprintf( L"The restore routine succeeded. Start the Cluster service on the other cluster nodes to complete the restore operation." );
wprintf( L"As nodes join the cluster, they will update their cluster databases to match the restored configuration." );
return 0;
}
else
{
wprintf( L"RestoreClusterDatabase failed (%d)\n", dwResult );
return 1;
}
}
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 都不支援 |
最低支援的伺服器 | Windows Server 2003 Enterprise、Windows Server 2003 Datacenter |
目標平台 | Windows |
標頭 | clusapi.h |
程式庫 | ClusAPI.lib |
Dll | ClusAPI.dll |