ETERNUS SF AdvancedCopy Manager 運用手引書 13.0 -Microsoft(R) Windows(R) 2000- -Microsoft(R) Windows Server(TM) 2003- |
目次
索引
![]() ![]() |
本章では、AdvancedCopy Managerのバックアップおよびリストアの前後処理について説明します。
バックアップ/リストアの前後処理スクリプトは、バックアップ同期処理開始コマンド、バックアップ実行コマンド、リストア実行コマンドを実施した際に、コピー処理の前後で起動されます。
これらの前後処理では、業務ボリュームのバックアップおよびリストアを行う際に必要な処理が実行されます。
この章では、前後処理の内容および設定について説明します。
AdvancedCopy Managerでのバックアップは、基本的に業務ボリュームが他のプロセスからアクセスできない状態で処理を行う必要があります。
そのため、通常、前処理では、業務ボリュームをロックします。また、バックアップ実行コマンドにXflushオプションを指定する、あるいは、バックアップ用業務ボリュームロック動作指定ファイルのBufferFlushOnlyをonに設定することで、ロックを実施せずにファイルシステムバッファのフラッシュを実施することもできます。
また、前処理ではバックアップボリュームもロックされます。バックアップボリュームのロックはバックアップ同期処理開始、または、スナップショット処理開始で実施され、バックアップ後処理で解除されます。
同期処理開始前処理 (バックアップ同期処理開始コマンド内で実施される) |
[デフォルト動作] バックアップボリュームをロックします。 |
同期処理開始後処理 (クラスタシステム運用の場合、バックアップ同期処理開始コマンド内で実施される) |
[デフォルト動作] バックアップボリュームのマウントを解除します。 バックアップボリュームのロックを解除します。 |
バックアップ前処理 (バックアップ実行コマンド内で実施される) |
[デフォルト動作] スナップショット型バックアップの場合、または、クラスタシステム運用の同期型バックアップの場合、バックアップボリュームをロックします。 業務ボリュームをロックします [Xflushオプション指定またはBufferFlushOnly=onの場合] スナップショット型バックアップの場合、または、クラスタシステム運用の同期型バックアップの場合、バックアップボリュームをロックします。 業務ボリュームのファイルシステムバッファをフラッシュします |
バックアップ後処理 (バックアップ実行コマンド内で実施される) |
[デフォルト動作] 業務ボリュームのロックを解除します。 バックアップボリュームのマウントを解除します。 バックアップボリュームのロックを解除します [Xflushオプション指定またはBufferFlushOnly=onの場合] バックアップボリュームのマウントを解除します。 バックアップボリュームのロックを解除します |
ユーザー固有の処理を前後処理に追加する必要がある場合は、バックアップ前後処理スクリプトに処理を追加してください。
これらのスクリプトはJScript言語で記述されており、Windows Scripting Host(WSH)上で実行されます。
スクリプトをカスタマイズする場合、エラーコードは以下の規約に従ってください。
エラーコード |
用途 |
---|---|
0-99 |
使用不可(AdvancedCopy Managerが予約) |
100-255 |
使用可能 |
後処理に失敗した場合は、資源情報の整合性が不完全になっている可能性がありますので、本マニュアルの『資源整合コマンド(swstsrsemtch)』を実施してください。
以下に前後処理の動作イメージを示します。
【同期型バックアップ時の処理方法】
バックアップ実行時の前処理のスクリプトファイル名は、以下の通りです。
非クラスタ運用の場合
“環境設定ディレクトリ”\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: } |
バックアップ実行時の後処理のスクリプトファイル名は、以下の通りです。
非クラスタ運用の場合
“環境設定ディレクトリ”\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)かつクラスタシステム運用の場合]
同期処理開始前処理、および、バックアップ前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、業務ボリューム、バックアップボリュームを使用しているプロセスが存在していますので、アプリケーションやサービスの停止を行う等の対処を実施して、他のプロセスからボリュームが使用されていない状態にしてください。なお、ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより、規定のリトライ回数の変更を行うことが可能ですが(詳細は「バックアップ用業務ボリュームロック動作指定ファイル」、「バックアップ用バックアップボリュームロック動作指定ファイル」を参照してください)、バックアップ処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常これらのファイルを作成する必要はありません。
クラスタシステム運用において同期型バックアップを行う場合、クラスタシステムの監視を回避するため、バックアップボリュームのロック保持期間はバックアップ同期処理開始コマンドおよびバックアップ実行コマンドの動作中のみとなります(上図参照)。すなわち、バックアップ同期処理開始コマンドの実行後からバックアップ実行コマンドの実行前まではバックアップボリュームはロックされません。これにより、本マニュアル『全般的な注意事項』の『イベントビューアに出力されるメッセージについて』に記載されているメッセージがイベントログに出力されることがありますが、問題はないため無視してください。
業務ボリュームのバックアップ前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。標準のリトライ動作は以下の通りです。
ロック処理に失敗した場合は、1秒間待った後、再度、ロック処理を実施します。
ロック処理のリトライを20回(初回と合わせて計21回)実施しても、ロックが取得できない場合は、処理を中断してコマンドを異常終了させます。
リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、バックアップ用業務ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。また、この設定ファイルでは、業務ボリュームのバックアップ前処理に対して、以下の動作を指示することもできます。
ロック処理のリトライを行う前に、そのボリューム内の全てのファイルハンドルを無効にすることを指定する(強制ロック機能)。
バックアップ前処理において、ロック/ロック解除の代わりにファイルシステムバッファのフラッシュを行うことを指定する(Xflushオプションと同等の機能)。
バックアップ用業務ボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。バックアップ用業務ボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンド等を使用してバックアップしておく必要があります。
バックアップ用業務ボリュームロック動作指定ファイルは以下のファイル名で作成してください。
ファイル名 |
[クラスタ運用でない場合] 環境設定ディレクトリ\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 |
バックアップ用業務ボリュームロック動作指定ファイルの作成方法は以下の通りです。
ロック動作を変更するボリュームのセクションを作成し、パラメーターを記述します(上記の例ではg1d1p1、g1d1p2のセクションが作成されています)。変更可能なパラメーターは下表に示された4つのパラメーターですが、4つ全てを記述する必要はなく、変更したいパラメーターのみを記述してください。記述しなかったパラメーターについては、デフォルト値が使用されます。
また、デフォルトのロック動作を変更するためには「ANY」というセクションを作成し、パラメーターを記述します。これにより、バックアップ用業務ボリュームロック動作指定ファイルに明示的に記述されているボリューム以外の全てのボリュームのロック動作を変更することができます(上記の例ではg1d1p1、g1d1p2以外の全てのボリュームのロック動作は「ANY」セクションの値にしたがって動作します)。
キー |
説明 |
---|---|
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)はすべて無効となります。 |
バックアップボリュームのバックアップ前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。
標準のリトライ動作は以下の通りです。
ロック処理に失敗した場合は、1秒間待った後、再度、ロック処理を実施します。
ロック処理のリトライを20回(初回と合わせて計21回)実施しても、ロックが取得できない場合は、処理を中断してコマンドを異常終了させます。
リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、バックアップ用バックアップボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。
また、この設定ファイルでは、バックアップボリュームのバックアップ前処理に対して、以下の動作を指示することもできます。
ロック処理のリトライを行う前に、そのボリューム内の全てのファイルハンドルを無効にすることを指定する(強制ロック機能)。
バックアップ用バックアップボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。バックアップ用バックアップボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンド等を使用してバックアップしておく必要があります。
バックアップ用バックアップボリュームロック動作指定ファイルは以下のファイル名で作成してください。
ファイル名 |
[クラスタ運用でない場合] 環境設定ディレクトリ\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 |
バックアップ用バックアップボリュームロック動作指定ファイルの作成方法は以下の通りです。
ロック動作を変更するボリュームのセクションを作成し、パラメーターを記述します(上記の例ではg1d1p1のセクションが作成されています)。変更可能なパラメーターは下表に示された3つのパラメーターですが、3つ全てを記述する必要はなく、変更したいパラメーターのみを記述してください。記述しなかったパラメーターについては、デフォルト値が使用されます。
また、デフォルトのロック動作を変更するためには「ANY」というセクションを作成し、パラメーターを記述します。これにより、バックアップ用バックアップボリュームロック動作指定ファイルに明示的に記述されているボリューム以外の全てのボリュームのロック動作を変更することができます(上記の例ではg1d1p1以外の全てのボリュームのロック動作は「ANY」セクションの値にしたがって動作します)。
キー |
説明 |
---|---|
LockForceMode |
バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。 off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない on =ロックのリトライ前にマウント解除を実施する ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。 ※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。 |
LockRetryNumber |
バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。 デフォルトの設定値は20(回)です。 指定されたリトライ回数、リトライを実施しても業務ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。 |
LockRetryInterval |
バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。 |
AdvancedCopy Managerでのリストアは、リストア先ボリュームが他のプロセスからアクセスできない状態で処理を行う必要があります。
そのため、通常前処理では、次の処理を行います。
前処理 |
---|
リストア先ボリュームをロックします。 |
後処理は、前処理で行った処理によって何をするのかを判断します。
後処理 |
---|
リストア先ボリュームのマウントを解除します。 |
この他にも、特殊な前後処理が必要な場合は、前後処理スクリプトに処理を追加する必要があります。
これらのスクリプトはJScript言語で記述されており、Windows Scripting Host(WSH)上で実行されます。
スクリプトをカスタマイズする場合、エラーコードは以下の規約に従ってください。
エラーコード |
用途 |
---|---|
0-99 |
使用不可(AdvancedCopy Managerが予約) |
100-255 |
使用可能 |
後処理に失敗した場合は、資源情報の整合性が不完全になっている可能性がありますので、運用手引書の『資源整合コマンド(swstsrsemtch)』を実施してください。
以下に前後処理の動作イメージを示します。
【リストア時の処理方法】
リストア実行時の前処理のスクリプトファイル名は、以下の通りです。
非クラスタ運用の場合
“環境設定ディレクトリ”\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: } |
リストア実行時の後処理のスクリプトファイル名は、以下の通りです。
非クラスタ運用の場合
“環境設定ディレクトリ”\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: } |
業務ボリュームのロック/ロック解除処理はスクリプトではなく、コマンド内で実施されています。したがって、リストア前処理スクリプト、リストア後処理スクリプトは、業務ボリュームのロック/ロック解除処理の直前、直後にそれぞれ実行されます。[リストア]
リストア前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、リストア先ボリュームを使用しているプロセスが存在していますので、アプリケーションやサービスの停止を行う等の対処を実施して、他のプロセスからボリュームが使用されていない状態にしてください。なお、ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより、規定のリトライ回数の変更を行うことが可能ですが(詳細は「リストア先ボリュームロック動作指定ファイル」を参照してください)、リストア処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常、これらのファイルを作成する必要はありません。
リストア前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、リストア先ボリュームのロック処理に失敗した場合、ロック処理のリトライを実施します。標準のリトライ動作は以下の通りです。
ロック処理に失敗した場合は、1秒間待った後、再度、ロック処理を実施します。
ロック処理のリトライを20回(初回と合わせて計21回)実施しても、ロックが取得できない場合は、処理を中断してコマンドを異常終了させます。
リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、リストア先ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。また、この設定ファイルでは、リストア先ボリュームのリストア前処理に対して、以下の動作を指示することもできます。
ロック処理のリトライを行う前に、そのボリューム内の全てのファイルハンドルを無効にすることを指定する(強制ロック機能)。
リストア先ボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。リストア先ボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンド等を使用してバックアップしておく必要があります。
リストア先ボリュームロック動作指定ファイルは以下のファイル名で作成してください。
ファイル名 |
[クラスタ運用でない場合] 環境設定ディレクトリ\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 |
リストア先ボリュームロック動作指定ファイルの作成方法は以下の通りです。
ロック動作を変更するボリュームのセクションを作成し、パラメーターを記述します(上記の例ではg1d1p1のセクションが作成されています)。変更可能なパラメーターは下表に示された3つのパラメーターですが、3つ全てを記述する必要はなく、変更したいパラメーターのみを記述してください。記述しなかったパラメーターについては、デフォルト値が使用されます。
また、デフォルトのロック動作を変更するためには「ANY」というセクションを作成し、パラメーターを記述します。これにより、リストア先ボリュームロック動作指定ファイルに明示的に記述されているボリューム以外の全てのボリュームのロック動作を変更することができます(上記の例ではg1d1p1以外の全てのボリュームのロック動作は「ANY」セクションの値にしたがって動作します)。
キー |
説明 |
---|---|
LockForceMode |
リストア先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。 off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない on =ロックのリトライ前にマウント解除を実施する ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。 ※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。 |
LockRetryNumber |
リストア先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。 デフォルトの設定値は20(回)です。 指定されたリトライ回数、リトライを実施してもリストア先ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。 |
LockRetryInterval |
リストア先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。 |
目次
索引
![]() ![]() |