ETERNUS SF AdvancedCopy Manager 運用手引書 13.0 -Microsoft(R) Windows(R) 2000- -Microsoft(R) Windows Server(TM) 2003-
目次 索引 前ページ次ページ

付録A バックアップ/リストアの前後処理

本章では、AdvancedCopy Managerのバックアップおよびリストアの前後処理について説明します。

A.1 概 

バックアップ/リストアの前後処理スクリプトは、バックアップ同期処理開始コマンド、バックアップ実行コマンド、リストア実行コマンドを実施した際に、コピー処理の前後で起動されます。

これらの前後処理では、業務ボリュームのバックアップおよびリストアを行う際に必要な処理が実行されます。

この章では、前後処理の内容および設定について説明します。

A.2 バックアップの前後処 

AdvancedCopy Managerでのバックアップは、基本的に業務ボリュームが他のプロセスからアクセスできない状態で処理を行う必要があります。

そのため、通常、前処理では、業務ボリュームをロックします。また、バックアップ実行コマンドにXflushオプションを指定する、あるいは、バックアップ用業務ボリュームロック動作指定ファイルのBufferFlushOnlyをonに設定することで、ロックを実施せずにファイルシステムバッファのフラッシュを実施することもできます。

また、前処理ではバックアップボリュームもロックされます。バックアップボリュームのロックはバックアップ同期処理開始、または、スナップショット処理開始で実施され、バックアップ後処理で解除されます。

同期処理開始前処理

(バックアップ同期処理開始コマンド内で実施される)

[デフォルト動作]

バックアップボリュームをロックします。

同期処理開始後処理

(クラスタシステム運用の場合、バックアップ同期処理開始コマンド内で実施される)

[デフォルト動作]

バックアップボリュームのマウントを解除します。

バックアップボリュームのロックを解除します。

バックアップ前処理

(バックアップ実行コマンド内で実施される)

[デフォルト動作]

スナップショット型バックアップの場合、または、クラスタシステム運用の同期型バックアップの場合、バックアップボリュームをロックします。

業務ボリュームをロックします

[Xflushオプション指定またはBufferFlushOnly=onの場合]

スナップショット型バックアップの場合、または、クラスタシステム運用の同期型バックアップの場合、バックアップボリュームをロックします。

業務ボリュームのファイルシステムバッファをフラッシュします

バックアップ後処理

(バックアップ実行コマンド内で実施される)

[デフォルト動作]

業務ボリュームのロックを解除します。

バックアップボリュームのマウントを解除します。

バックアップボリュームのロックを解除します

[Xflushオプション指定またはBufferFlushOnly=onの場合]

バックアップボリュームのマウントを解除します。

バックアップボリュームのロックを解除します

ユーザー固有の処理を前後処理に追加する必要がある場合は、バックアップ前後処理スクリプトに処理を追加してください。

これらのスクリプトはJScript言語で記述されており、Windows Scripting Host(WSH)上で実行されます。

スクリプトをカスタマイズする場合、エラーコードは以下の規約に従ってください。

エラーコード

用途

0-99

使用不可(AdvancedCopy Managerが予約)

100-255

使用可能

後処理に失敗した場合は、資源情報の整合性が不完全になっている可能性がありますので、本マニュアルの『資源整合コマンド(swstsrsemtch)』を実施してください。

以下に前後処理の動作イメージを示します。

【同期型バックアップ時の処理方法】

A.2.1 バックアップ実行時の前処

バックアップ実行時の前処理のスクリプトファイル名は、以下の通りです。

非クラスタ運用の場合

“環境設定ディレクトリ”\etc\backup\scripts\OpcBackupPre.js

クラスタ運用の場合

<共有ディスク>:\etc\opt\swstorage\etc\backup\scripts\OpcBackupPre.js

  1: // AdvancedCopy Manager for Windows
  2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006
  3: //
  4: // OpcBackupPre.js: Pre-Processing Script for swstbackup
  5: //
  6: // [Parameters]
  7: // 1st argument: device name of transaction volume
  8: // 2nd argument: device name of backup volume
  9: //
 10: // [Return Values]
 11: // 0: The script ended normally.
 12: // 2: The number of the arguments is incorrect.
 13: // (2-3): not used, but must not be used because older versions use these values.
 14: // 4: An error other than the above occurred.
 15: 
 16: try {
 17:     // create global objects
 18:     var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
 19:     var WshEnv = WshShell.Environment("PROCESS");                      // create Environment object
 20:     var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
 21: 
 22:     // create SwstBackupPreProc object
 23:     var proc = new SwstBackupPreProc();
 24: 
 25:     // there is nothing to do if the pre/post-processing is not customized
 26:     proc.doNothingForDriveLetter();
 27: 
 28:     // if a backup volume is specified, .bd file is created.
 29:     if (proc.bvName.length != 0) {
 30:         proc.writePostFile(proc.bdFileName, proc.bvName);
 31:     }
 32:     SwstQuit(0);
 33: } catch (e) {
 34:     SwstQuit(4);
 35: }
 36: 
 37: function SwstBackupPreProc()
 38: {
 39:     // member variables
 40:     this.tvName       = WScript.Arguments.length!=2?SwstQuit(1):WScript.Arguments.Item(0); // device name of transaction volume
 41:     this.postFileName = getDataPathName() + "\\" + getPutFileName(this.tvName) + ".pre";   // name of postprocessing file
 42:     this.bvName       = WScript.Arguments.Item(1);                                         // device name of transaction volume
 43:     this.bdFileName   = getDataPathName() + "\\" + getPutFileName(this.tvName) + ".bd";    // name of postprocessing file
 44: 
 45:     // member functions
 46:     this.doNothingForDriveLetter = doNothingForDriveLetter; // self-explanatory
 47:     this.writePostFile           = writePostFile;           // self-explanatory
 48: }
 49: 
 50: function doNothingForDriveLetter()
 51: {
 52:     this.writePostFile(this.postFileName, "none");
 53: }
 54: 
 55: function writePostFile(postfile, postdata)
 56: {
 57:     var overwrite = true; // means to overwrite a file if it exists.
 58:     var postFileStream = fsObj.CreateTextFile(postfile, overwrite);
 59:     postFileStream.Write(postdata);
 60:     postFileStream.Close();
 61: }
 62: 
 63: function SwstQuit(exitStatus)
 64: {
 65:     switch(exitStatus) {
 66:     case 0:
 67:         WScript.Quit(0);
 68:     case 1:
 69:         WScript.Echo("[Backup Preprocessing] The number of the arguments is incorrect.");
 70:         WScript.Quit(2);
 71:     default:
 72:         WScript.Echo("[Backup Preprocessing] The script exited abnormally.");
 73:         WScript.Quit(4);
 74:     }
 75: }
 76: 
 77: function getDataPathName()
 78: {
 79:     return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\backup\\data\\DEFAULT";
 80: }
 81: 
 82: function getBinPathName()
 83: {
 84:     return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin";
 85: }
 86: 
 87: function getSetupInfoKey()
 88: {
 89:     var nodeName = WshEnv.Item("SWSTGNODE");
 90:     if( nodeName != "" ){
 91:         return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
 92:     }
 93:     return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
 94: }
 95: 
 96: function getPutFileName(deviceName){
 97:     var fileName;
 98:     if( isSafeDISKName(deviceName) ){
 99:         var re = /(\S+)\/(\S+):(\S+)/;
100:         fileName = deviceName.replace(re, "$1_$2_$3");
101:     }else{
102:         fileName = deviceName;
103:     }
104:     return(fileName);
105: }
106: 
107: function getGXDXPX(deviceName){
108:     var gXdXpX;
109:     if( isSafeDISKName(deviceName) ){
110:         var re = /(\S+)\/(\S+):(\S+)/;
111:         gXdXpX = deviceName.replace(re, "$3");
112:     }else{
113:         gXdXpX = deviceName;
114:     }
115:     return(gXdXpX);
116: }
117: 
118: function isSafeDISKName(deviceName){
119:     var key = ":g";
120:     var s = deviceName.indexOf(key);
121:     if ( s < 0 ) {
122:         return (false);
123:     } else {
124:         return (true);
125:     }
126: }

A.2.2 バックアップ実行時の後処

バックアップ実行時の後処理のスクリプトファイル名は、以下の通りです。

非クラスタ運用の場合

“環境設定ディレクトリ”\etc\scripts\OpcBackupPost.js

クラスタ運用の場合

<共有ディスク>:\etc\opt\swstorage\etc\backup\scripts\OpcBackupPost.js

  1: // AdvancedCopy Manager for Windows
  2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006
  3: //
  4: // OpcBackupPost.js: Post-Processing Script for swstbackup
  5: //
  6: // [Parameters]
  7: // 1st argument: device name of transaction volume
  8: //
  9: // [Return Values]
 10: // 0: The script ended normally.
 11: // 2: The number of the arguments is incorrect.
 12: // (1,3,5-8): not used, but must not be used because older versions use these values.
 13: // 4: An error other than the above occurred.
 14: 
 15: try {
 16:     // create global objects
 17:     var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
 18:     var WshEnv = WshShell.Environment("PROCESS");                      // create Environment object
 19:     var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
 20: 
 21:     // create SwstBackupPostProc object
 22:     var proc = new SwstBackupPostProc();
 23: 
 24:     // do nothing if postprocessing file exists
 25:     if (fsObj.FileExists(proc.postFileName) == false) {
 26:         SwstQuit(0);
 27:     }
 28: 
 29:     // get postprocessing type
 30:     var postProcType = proc.getPostProcData(proc.postFileName);
 31:     switch(postProcType) {
 32:     case "none":
 33:         proc.doNothing();
 34:         break;
 35:     }
 36: 
 37:     // do nothing if postprocessing file exists
 38:     if (fsObj.FileExists(proc.bdFileName) == true) {
 39:         var bvName = proc.getPostProcData(proc.bdFileName);
 40:         proc.doNothing();
 41:     }
 42: 
 43:     // clear temporary files
 44:     proc.deletePostFile(proc.postFileName);
 45:     proc.deletePostFile(proc.bdFileName);
 46:     SwstQuit(0);
 47: } catch (e) {
 48:     SwstQuit(6);
 49: }
 50: 
 51: function SwstBackupPostProc()
 52: {
 53:     // member variables
 54:     this.tvName       = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of transaction volume
 55:     this.postFileName = getDataPathName() + "\\" + getPutFileName(this.tvName) + ".pre";   // name of postprocessing file
 56:     this.bdFileName   = getDataPathName() + "\\" + getPutFileName(this.tvName) + ".bd";    // name of postprocessing file
 57: 
 58:     // member functions
 59:     this.getPostProcData     = getPostProcData;             // self-explanatory
 60:     this.doNothing           = doNothing;                   // self-explanatory
 61:     this.deletePostFile      = deletePostFile;              // self-explanatory
 62: }
 63: 
 64: function getPostProcData(postfile)
 65: {
 66:     var iomode = 1;     // means read-only mode
 67:     var create = false; // means not to create a file
 68:     var postFileStream = fsObj.OpenTextFile(postfile, iomode, create);
 69:     var postData = postFileStream.ReadAll();
 70:     postFileStream.Close();
 71:     return postData;
 72: }
 73: 
 74: function doNothing()
 75: {
 76:     // do nothing
 77: }
 78: 
 79: function deletePostFile(postfile)
 80: {
 81:     if (fsObj.FileExists(postfile) == true) {
 82:         fsObj.DeleteFile(postfile);
 83:     }
 84: }
 85: 
 86: function SwstQuit(exitStatus)
 87: {
 88:     switch(exitStatus) {
 89:     case 0:
 90:         WScript.Quit(0);
 91:     case 1:
 92:         WScript.Echo("[Backup Postprocessing] The number of the arguments is incorrect.");
 93:         WScript.Quit(2);
 94:     default:
 95:         WScript.Echo("[Backup Postprocessing] The script exited abnormally.");
 96:         WScript.Quit(4);
 97:     }
 98: }
 99: 
100: function getDataPathName()
101: {
102:     return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\backup\\data\\DEFAULT";
103: }
104: 
105: function getBinPathName()
106: {
107:     return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin";
108: }
109: 
110: function getSetupInfoKey()
111: {
112:     var nodeName = WshEnv.Item("SWSTGNODE");
113:     if( nodeName != "" ){
114:         return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
115:     }
116:     return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
117: }
118: 
119: function getPutFileName(deviceName){
120:     var fileName;
121:     if( isSafeDISKName(deviceName) ){
122:         var re = /(\S+)\/(\S+):(\S+)/;
123:         fileName = deviceName.replace(re, "$1_$2_$3");
124:     }else{
125:         fileName = deviceName;
126:     }
127:     return(fileName);
128: }
129: 
130: function getGXDXPX(deviceName){
131:     var gXdXpX;
132:     if( isSafeDISKName(deviceName) ){
133:         var re = /(\S+)\/(\S+):(\S+)/;
134:         gXdXpX = deviceName.replace(re, "$3");
135:     }else{
136:         gXdXpX = deviceName;
137:     }
138:     return(gXdXpX);
139: }
140: 
141: function isSafeDISKName(deviceName){
142:     var key = ":g";
143:     var s = deviceName.indexOf(key);
144:     if ( s < 0 ) {
145:         return (false);
146:     } else {
147:         return (true);
148:     }
149: }

業務ボリュームのロック/ロック解除処理、バッファフラッシュ処理はスクリプトではなく、コマンド内で実施されています。したがって、バックアップ前処理スクリプト、バックアップ後処理スクリプトは、ボリュームのロック/ロック解除処理、バッファフラッシュ処理の直前、直後にそれぞれ実行されます。バックアップ前後処理スクリプトでは、実質的に何も処理を実施していません。

[スナップショット型バックアップ(OPC)の場合]

[同期型バックアップ(EC)かつ非クラスタシステムの場合]

[同期型バックアップ(EC)かつクラスタシステム運用の場合]

同期処理開始前処理、および、バックアップ前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、業務ボリューム、バックアップボリュームを使用しているプロセスが存在していますので、アプリケーションやサービスの停止を行う等の対処を実施して、他のプロセスからボリュームが使用されていない状態にしてください。なお、ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより、規定のリトライ回数の変更を行うことが可能ですが(詳細は「バックアップ用業務ボリュームロック動作指定ファイル」、「バックアップ用バックアップボリュームロック動作指定ファイル」を参照してください)、バックアップ処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常これらのファイルを作成する必要はありません。

クラスタシステム運用において同期型バックアップを行う場合、クラスタシステムの監視を回避するため、バックアップボリュームのロック保持期間はバックアップ同期処理開始コマンドおよびバックアップ実行コマンドの動作中のみとなります(上図参照)。すなわち、バックアップ同期処理開始コマンドの実行後からバックアップ実行コマンドの実行前まではバックアップボリュームはロックされません。これにより、本マニュアル『全般的な注意事項』の『イベントビューアに出力されるメッセージについて』に記載されているメッセージがイベントログに出力されることがありますが、問題はないため無視してください。

A.2.2.1 バックアップ用業務ボリュームロック動作指定ファイ

業務ボリュームのバックアップ前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。標準のリトライ動作は以下の通りです。

リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、バックアップ用業務ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。また、この設定ファイルでは、業務ボリュームのバックアップ前処理に対して、以下の動作を指示することもできます。

バックアップ用業務ボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。バックアップ用業務ボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンド等を使用してバックアップしておく必要があります。

A.2.2.1.1 バックアップ用業務ボリュームロック動作指定ファイルの作成方法 

バックアップ用業務ボリュームロック動作指定ファイルは以下のファイル名で作成してください。

ファイル名

[クラスタ運用でない場合]

環境設定ディレクトリ\etc\backup\data\BTRANLOCK.INI

[クラスタ運用の場合]

<共用ディスク>:\etc\opt\swstorage\etc\backup\data\BTRANLOCK.INI


バックアップ用業務ボリュームロック動作指定ファイルの設定例を以下に示します。

[g1d1p1]

BufferFlushOnly=off

LockForceMode=on

LockRetryNumber=10

LockRetryInterval=10

[g1d1p2]

BufferFlushOnly=on

[ANY]

BufferFlushOnly=off

LockForceMode=off

LockRetryNumber=20

LockRetryInterval=100

バックアップ用業務ボリュームロック動作指定ファイルの作成方法は以下の通りです。

■BTRANLOCK.INIの設定項目

キー

説明

BufferFlushOnly

業務ボリュームのロックを実施する代わりに、業務ボリュームのファイルシステムバッファのフラッシュを実施することを指定します:

off(デフォルト値)=バッファフラッシュを実施しない(ロックを実施する)

on =バッファフラッシュを実施する(ロックを実施しない)

swstbackup、swstbackup_exchangeにXflushオプションが指定され、かつ、BufferFlushOnly=offの場合は、Xflushオプションが優先されます。

また、BufferFlushOnlyがonに指定されている場合は、他のパラメーター(LockForceMode、LockRetryNumber、LockRetryInterval)は全て無効となります。

本設定項目をonに指定する場合、業務ボリュームに対する書き込み処理を事前に全て停止する必要があります(書き込み処理を停止しない状態で複製作成を実施した場合、業務ボリュームのデータ内容は保証されません)。

NoPrePostがonに指定されている場合は、本パラメーターは無効となります。

LockForceMode

業務ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。

off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない

on =ロックのリトライ前にマウント解除を実施する

ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。

※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。

BufferFlushOnlyまたはNoPrePostがonに指定されている場合は、本パラメーターは無効となります。

LockRetryNumber

業務ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。

デフォルトの設定値は20(回)です。

指定されたリトライ回数、リトライを実施しても業務ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。

BufferFlushOnlyまたはNoPrePostがonに指定されている場合は、本パラメーターは無効となります。

LockRetryInterval

業務ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。

BufferFlushOnlyまたはNoPrePostがonに指定されている場合は、本パラメーターは無効となります。

NoPrePost

バックアップ前後処理を実施しないことを指定します。

off(デフォルト値)=バックアップ前後処理を実施する

on=バックアップ前後処理を実施しない

NoPrePostがonに指定されている場合は、他のパラメーター(BufferFlushOnly、LockForceMode、LockRetryNumber、LockRetryInterval)はすべて無効となります。


A.2.2.2 バックアップ用バックアップボリュームロック動作指定ファイ

バックアップボリュームのバックアップ前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。
標準のリトライ動作は以下の通りです。

リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、バックアップ用バックアップボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。
また、この設定ファイルでは、バックアップボリュームのバックアップ前処理に対して、以下の動作を指示することもできます。

バックアップ用バックアップボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。バックアップ用バックアップボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンド等を使用してバックアップしておく必要があります。

A.2.2.2.1 バックアップ用バックアップボリュームロック動作指定ファイルの作成方法 

バックアップ用バックアップボリュームロック動作指定ファイルは以下のファイル名で作成してください。

ファイル名

[クラスタ運用でない場合]

環境設定ディレクトリ\etc\backup\data\BBACKLOCK.INI

[クラスタ運用の場合]

<共用ディスク>:\etc\opt\swstorage\etc\backup\data\BBACKLOCK.INI


バックアップ用バックアップボリュームロック動作指定ファイルの設定例を以下に示します。

[g1d1p1]

LockForceMode=on

LockRetryNumber=10

LockRetryInterval=10

[ANY]

LockForceMode=off

LockRetryNumber=20

LockRetryInterval=100

バックアップ用バックアップボリュームロック動作指定ファイルの作成方法は以下の通りです。

■BBACKLOCK.INIの設定項目

キー

説明

LockForceMode

バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。

off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない

on =ロックのリトライ前にマウント解除を実施する

ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。

※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。

LockRetryNumber

バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。

デフォルトの設定値は20(回)です。

指定されたリトライ回数、リトライを実施しても業務ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。

LockRetryInterval

バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。


A.3 リストアの前後処 

AdvancedCopy Managerでのリストアは、リストア先ボリュームが他のプロセスからアクセスできない状態で処理を行う必要があります。

そのため、通常前処理では、次の処理を行います。

前処理

リストア先ボリュームをロックします。

後処理は、前処理で行った処理によって何をするのかを判断します。

後処理

リストア先ボリュームのマウントを解除します。
リストア先ボリュームのロックを解除します。

この他にも、特殊な前後処理が必要な場合は、前後処理スクリプトに処理を追加する必要があります。

これらのスクリプトはJScript言語で記述されており、Windows Scripting Host(WSH)上で実行されます。

スクリプトをカスタマイズする場合、エラーコードは以下の規約に従ってください。

エラーコード

用途

0-99

使用不可(AdvancedCopy Managerが予約)

100-255

使用可能

後処理に失敗した場合は、資源情報の整合性が不完全になっている可能性がありますので、運用手引書の『資源整合コマンド(swstsrsemtch)』を実施してください。

以下に前後処理の動作イメージを示します。

【リストア時の処理方法】

A.3.1 リストア実行時の前処

リストア実行時の前処理のスクリプトファイル名は、以下の通りです。

非クラスタ運用の場合

“環境設定ディレクトリ”\etc\backup\scripts\OpcRestorePre.js

クラスタ運用の場合

<共有ディスク>:\etc\opt\swstorage\etc\backup\scripts\OpcRestorePre.js

  1: // AdvancedCopy Manager for Windows
  2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2005
  3: //
  4: // OpcRestorePre.js: Pre-Processing Script for swstrestore
  5: //
  6: // [Parameters]
  7: // 1st argument: device name of transaction volume
  8: //
  9: // [Return Values]
 10: // 0: The script ended normally.
 11: // 2: The number of the arguments is incorrect.
 12: // 3: not used, but must not be used because older versions use these values.
 13: // 4: An error other than the above occurred.
 14: 
 15: try {
 16:     // create global objects
 17:     var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
 18:     var WshEnv = WshShell.Environment("PROCESS");                      // create Environment object
 19:     var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
 20: 
 21:     // create SwstRestorePreProc object
 22:     var proc = new SwstRestorePreProc();
 23: 
 24:     // there is nothing to do if the pre/post-processing is not customized
 25:     proc.doNothingForDriveLetter();
 26: 
 27:     SwstQuit(0);
 28: } catch (e) {
 29:     SwstQuit(4);
 30: }
 31: 
 32: function SwstRestorePreProc()
 33: {
 34:     // member variables
 35:     this.tvName       = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of transaction volume
 36:     this.postFileName = getDataPathName() + "\\" + getPutFileName(this.tvName) + ".pre";   // name of postprocessing file
 37: 
 38:     // member functions
 39:     this.doNothingForDriveLetter = doNothingForDriveLetter; // self-explanatory
 40:     this.writePostFile           = writePostFile;           // self-explanatory
 41: }
 42: 
 43: function doNothingForDriveLetter()
 44: {
 45:     this.writePostFile("none");
 46: }
 47: 
 48: function writePostFile(type)
 49: {
 50:     var overwrite = true; // means to overwrite a file if it exists.
 51:     var postFileStream = fsObj.CreateTextFile(this.postFileName, overwrite);
 52:     postFileStream.Write(type);
 53:     postFileStream.Close();
 54: }
 55: 
 56: function SwstQuit(exitStatus)
 57: {
 58:     switch(exitStatus) {
 59:     case 0:
 60:         WScript.Quit(0);
 61:     case 1:
 62:         WScript.Echo("[Restore Preprocessing] The number of the arguments is incorrect.");
 63:         WScript.Quit(2);
 64:     default:
 65:         WScript.Echo("[Restore Preprocessing] The script exited abnormally.");
 66:         WScript.Quit(4);
 67:     }
 68: }
 69: 
 70: function getDataPathName()
 71: {
 72:     return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\backup\\data\\DEFAULT";
 73: }
 74: 
 75: function getBinPathName()
 76: {
 77:     return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin";
 78: }
 79: 
 80: function getSetupInfoKey()
 81: {
 82:     var nodeName = WshEnv.Item("SWSTGNODE");
 83:     if( nodeName != "" ){
 84:         return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
 85:     }
 86:     return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
 87: }
 88: 
 89: function getPutFileName(deviceName){
 90:     var fileName;
 91:     if( isSafeDISKName(deviceName) ){
 92:         var re = /(\S+)\/(\S+):(\S+)/;
 93:         fileName = deviceName.replace(re, "$1_$2_$3");
 94:     }else{
 95:         fileName = deviceName;
 96:     }
 97:     return(fileName);
 98: }
 99: 
100: function getGXDXPX(deviceName){
101:     var gXdXpX;
102:     if( isSafeDISKName(deviceName) ){
103:         var re = /(\S+)\/(\S+):(\S+)/;
104:         gXdXpX = deviceName.replace(re, "$3");
105:     }else{
106:         gXdXpX = deviceName;
107:     }
108:     return(gXdXpX);
109: }
110: 
111: function isSafeDISKName(deviceName){
112:     var key = ":g";
113:     var s = deviceName.indexOf(key);
114:     if ( s < 0 ) {
115:         return (false);
116:     } else {
117:         return (true);
118:     }
119: }

A.3.2 リストア実行時の後処

リストア実行時の後処理のスクリプトファイル名は、以下の通りです。

非クラスタ運用の場合

“環境設定ディレクトリ”\etc\backup\scripts\OpcRestorePost.js

クラスタ運用の場合

<共有ディスク>:\etc\opt\swstorage\etc\backup\scripts\OpcRestorePost.js

  1: // AdvancedCopy Manager for Windows
  2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006
  3: //
  4: // OpcRestorePost.js: Post-Processing Script for swstrestore
  5: //
  6: // [Parameters]
  7: // 1st argument: device name of transaction volume
  8: //
  9: // [Return Values]
 10: // 0: The script ended normally.
 11: // 2: The number of the arguments is incorrect.
 12: // (3,5): not used, but must not be used because older versions use these values.
 13: // 4: An error other than the above occurred.
 14: 
 15: try {
 16:     // create global objects
 17:     var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
 18:     var WshEnv = WshShell.Environment("PROCESS");                      // create Environment object
 19:     var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
 20: 
 21:     // create SwstRestorePostProc object
 22:     var proc = new SwstRestorePostProc();
 23: 
 24:     // do nothing if postprocessing file exists
 25:     if (fsObj.FileExists(proc.postFileName) == false) {
 26:         proc.doNothing();
 27:     }
 28:     // get postprocessing type
 29:     else {
 30:         var postProcType = proc.getPostProcType();
 31:         switch(postProcType) {
 32:         case "none":
 33:             proc.doNothing();
 34:             break;
 35:         }
 36:     }
 37: 
 38:     // clear temporary file
 39:     proc.deletePostFile();
 40:     SwstQuit(0);
 41: } catch (e) {
 42:     SwstQuit(6);
 43: }
 44: 
 45: function SwstRestorePostProc()
 46: {
 47:     // member variables
 48:     this.tvName       = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of transaction volume
 49:     this.postFileName = getDataPathName() + "\\" + getPutFileName(this.tvName) + ".pre";   // name of postprocessing file
 50: 
 51:     // member functions
 52:     this.getPostProcType     = getPostProcType;                     // self-explanatory
 53:     this.doNothing           = doNothing;                           // self-explanatory
 54:     this.deletePostFile      = deletePostFile;                      // self-explanatory
 55: }
 56: 
 57: function getPostProcType()
 58: {
 59:     var iomode = 1;     // means read-only mode
 60:     var create = false; // means not to create a file
 61:     var postFileStream = fsObj.OpenTextFile(this.postFileName, iomode, create);
 62:     var postProc = postFileStream.ReadAll();
 63:     postFileStream.Close();
 64:     return postProc;
 65: }
 66: 
 67: function doNothing()
 68: {
 69:     // do nothing
 70: }
 71: 
 72: function deletePostFile()
 73: {
 74:     if (fsObj.FileExists(this.postFileName) == true) {
 75:         fsObj.DeleteFile(this.postFileName);
 76:     }
 77: }
 78: 
 79: function SwstQuit(exitStatus)
 80: {
 81:     switch(exitStatus) {
 82:     case 0:
 83:         WScript.Quit(0);
 84:     case 1:
 85:         WScript.Echo("[Restore Postprocessing] The number of the arguments is incorrect.");
 86:         WScript.Quit(2);
 87:     default:
 88:         WScript.Echo("[Restore Postprocessing] The script exited abnormally.");
 89:         WScript.Quit(4);
 90:     }
 91: }
 92: 
 93: function getDataPathName()
 94: {
 95:     return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\backup\\data\\DEFAULT";
 96: }
 97: 
 98: function getBinPathName()
 99: {
100:     return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin";
101: }
102: 
103: function getSetupInfoKey()
104: {
105:     var nodeName = WshEnv.Item("SWSTGNODE");
106:     if( nodeName != "" ){
107:         return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
108:     }
109:     return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
110: }
111: 
112: function getPutFileName(deviceName){
113:     var fileName;
114:     if( isSafeDISKName(deviceName) ){
115:         var re = /(\S+)\/(\S+):(\S+)/;
116:         fileName = deviceName.replace(re, "$1_$2_$3");
117:     }else{
118:         fileName = deviceName;
119:     }
120:     return(fileName);
121: }
122: 
123: function getGXDXPX(deviceName){
124:     var gXdXpX;
125:     if( isSafeDISKName(deviceName) ){
126:         var re = /(\S+)\/(\S+):(\S+)/;
127:         gXdXpX = deviceName.replace(re, "$3");
128:     }else{
129:         gXdXpX = deviceName;
130:     }
131:     return(gXdXpX);
132: }
133: 
134: function isSafeDISKName(deviceName){
135:     var key = ":g";
136:     var s = deviceName.indexOf(key);
137:     if ( s < 0 ) {
138:         return (false);
139:     } else {
140:         return (true);
141:     }
142: }

業務ボリュームのロック/ロック解除処理はスクリプトではなく、コマンド内で実施されています。したがって、リストア前処理スクリプト、リストア後処理スクリプトは、業務ボリュームのロック/ロック解除処理の直前、直後にそれぞれ実行されます。

[リストア]

リストア前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、リストア先ボリュームを使用しているプロセスが存在していますので、アプリケーションやサービスの停止を行う等の対処を実施して、他のプロセスからボリュームが使用されていない状態にしてください。なお、ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより、規定のリトライ回数の変更を行うことが可能ですが(詳細は「リストア先ボリュームロック動作指定ファイル」を参照してください)、リストア処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常、これらのファイルを作成する必要はありません。

A.3.2.1 リストア先ボリュームロック動作指定ファイ

リストア前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、リストア先ボリュームのロック処理に失敗した場合、ロック処理のリトライを実施します。標準のリトライ動作は以下の通りです。

リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、リストア先ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。また、この設定ファイルでは、リストア先ボリュームのリストア前処理に対して、以下の動作を指示することもできます。

リストア先ボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。リストア先ボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンド等を使用してバックアップしておく必要があります。

A.3.2.1.1 リストア先ボリュームロック動作指定ファイルの作成方法 

リストア先ボリュームロック動作指定ファイルは以下のファイル名で作成してください。

ファイル名

[クラスタ運用でない場合]

環境設定ディレクトリ\etc\backup\data\RDSTLOCK.INI

[クラスタ運用の場合]

<共用ディスク>:\etc\opt\swstorage\etc\backup\data\RDSTLOCK.INI


リストア先ボリュームロック動作指定ファイルの設定例を以下に示します。

[g1d1p1]

LockForceMode=on

LockRetryNumber=10

LockRetryInterval=10

[ANY]

LockForceMode=off

LockRetryNumber=20

LockRetryInterval=100

リストア先ボリュームロック動作指定ファイルの作成方法は以下の通りです。

■RDSTLOCK.INIの設定項目

キー

説明

LockForceMode

リストア先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。

off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない

on =ロックのリトライ前にマウント解除を実施する

ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。

※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。

LockRetryNumber

リストア先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。

デフォルトの設定値は20(回)です。

指定されたリトライ回数、リトライを実施してもリストア先ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。

LockRetryInterval

リストア先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。



目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2002-2006