バックアップ実行時の後処理スクリプトは、以下のとおりです。
クラスタ運用でない場合
<環境設定ディレクトリ>\etc\backup\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: } |
ポイント
業務ボリュームのロック/ロック解除およびバッファーのフラッシュは、スクリプトではなく、コマンド内で実施されています。したがって、バックアップ前処理スクリプトおよびバックアップ後処理スクリプトは、ボリュームのロック/ロック解除およびバッファーのフラッシュの処理の直前と直後で、それぞれ実行されます。バックアップ前後処理スクリプトでは、実質的に何も処理していません。
注意
同期処理開始およびバックアップの前処理では、他アプリケーションとの一時的なアクセス競合を回避するため、ロックに失敗した場合にロック処理をリトライします。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、業務ボリューム/バックアップボリュームを使用しているプロセスが存在しているため、アプリケーションやサービスを停止するなどの対処を実施し、ほかのプロセスがボリュームを使用していない状態にしてください。リトライ回数は、「A.2.3 バックアップ用業務ボリュームロック動作指定ファイル」、「A.2.4 バックアップ用バックアップボリュームロック動作指定ファイル」で変更できます。
なお、バックアップ処理実行時にほかのプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合、通常、これらのファイルは作成不要です。
クラスタシステム運用で同期型バックアップを行う場合、クラスタシステムの監視を回避するため、バックアップボリュームのロック保持期間は、バックアップ同期処理開始コマンドおよびバックアップ実行コマンドの動作中だけとなります(上図参照)。すなわち、バックアップ同期処理開始コマンドの実行後からバックアップ実行コマンドの実行前までは、バックアップボリュームはロックされません。このため、「13.1.1 全般的な注意事項」の「イベントビューアに出力されるメッセージについて」に記載されているメッセージがイベントログに出力されることがありますが、問題はないので無視してください。