ETERNUS SF AdvancedCopy Manager 運用手引書 13.0 -Microsoft(R) Windows(R) 2000- -Microsoft(R) Windows Server(TM) 2003- |
目次
索引
![]() ![]() |
本章では、AdvancedCopy Managerのレプリケーションの前後処理について説明します。
レプリケーションの前後処理は、レプリケーション(複製)処理の前後で起動されます。
この章では、前後処理の内容および設定について説明します。
AdvancedCopy Managerでのレプリケーションの前後処理は、複写元/複写先ボリュームの双方に対して実施する必要がありますが、その目的は異なります。
複写元ボリュームに対する前後処理
複写元データを一時的に整合性の保証された状態で凍結することを目的としています。前処理で複写元データを一時的に凍結し、複製作成後、後処理で凍結状態を解除します。
複写先ボリュームに対する前後処理
レプリケーション(複製)処理中にアプリケーションが複写先ボリュームにアクセスしないようにすることを目的としています。前処理で複写先データをアクセス禁止状態とし、複製作成後、後処理でマウント解除処理を行った後アクセス禁止状態を解除します。
前後処理で行う具体的な処理は、そのボリュームのデータ内容によって異なります。次章では、ファイルシステムの前後処理について説明します。
AdvancedCopy Managerは、ファイルシステムが構築されたボリュームであることを前提として、複写元ボリューム、複写先ボリュームに対して、以下の前後処理をそれぞれ実施します。
複写元ボリューム |
前処理 |
[デフォルト動作] 複写元ボリュームをロックします [Xflushオプション指定またはBufferFlushOnly=onの場合] 複写元ボリュームのファイルシステムバッファをフラッシュします [fオプション指定の場合] 処理を実施しません(複写元前処理スクリプトを実行しません) |
後処理 |
[デフォルト動作] 複写元ボリュームのロックを解除します [Xflushオプション指定時] 処理を実施しません [fオプション指定の場合] 処理を実施しません(複写元後処理スクリプトを実行しません) |
|
複写先ボリューム |
前処理 |
[デフォルト動作] 複写先ボリュームをロックします。 [tオプション指定の場合] 処理を実施しません(複写先前処理スクリプトを実行しません) |
後処理 |
[デフォルト動作] 複写先ボリュームのロックを解除します。 [tオプション指定の場合] 処理を実施しません(複写先後処理スクリプトを実行しません) |
複写元ボリュームに対する前後処理は、複写元データを保証するためのものです。複写先ボリュームに対する前後処理は、同期処理実行中やスナップショットコピー時に他プロセスからのアクセスを不可能にするためのものです。
ファイルシステムの前後処理の実施状況を以下に示します。この表は、前後処理が実行されるかどうかは、コマンド種別によって異なり、さらに、そのコマンドを実行したときのコピー状態によっても異なることを示しています。
コマンド |
コピー状態 |
複製元/複製先 |
前処理 |
後処理 |
---|---|---|---|---|
複製開始コマンド (swsrpstartsync) |
未コピー状態または 複製確立状態 |
複製元 |
× |
× |
複製先 |
○--(1) |
△--(2) |
||
複製作成コマンド (swsrpmake) |
等価性維持状態 |
複製元 |
○ |
○ |
複製先 |
△--(1) |
○--(2) |
||
複製解除コマンド (swsrpcancel) |
等価性維持状態 |
複製元 |
○ |
○ |
複製先 |
△--(1) |
○--(2) |
||
複製確立状態 |
複製元 |
× |
× |
|
複製先 |
× |
× |
||
コピー中 |
複製元 |
× |
× |
|
複製先 |
× |
△--(2) |
||
スナップショット複製作成コマンド (swsrpmake) |
未コピー状態 |
複製元 |
○ |
○ |
複製先 |
○ |
○ |
○:実施する
△:複写先ボリュームがクラスタシステムの共用ボリュームの場合、実施する(ただし、複写先前後処理スクリプトの呼び出しは実施しない)。
×:実施しない
(1)で行った前処理に対する後処理は(2)で行われます。ファイルシステムの前後処理は、カスタマイズ可能なようにスクリプトになっています。レプリケーション管理コマンドを実施した際に、上の表にしたがって起動されます。また、サーバ間レプリケーションの場合、接続されていないボリュームの前後処理は、TCP/IPによるリモート実行でこれらのスクリプトが実行されます。
下図に前後処理の動作イメージを示します。
前後処理で標準の前後処理以外で必要な処理がある場合はそれぞれのスクリプトをカスタマイズしてください。
スクリプトをカスタマイズする場合、エラーコードは以下の規約に従ってください。
エラーコード |
用途 |
---|---|
0-99 |
使用不可(AdvancedCopy Managerが予約) |
100-255 |
使用可能 |
Oracle、SQL Server、Exchange以外のデータベースの前後処理については、AdvancedCopy Managerでは機能を提供しませんので、AdvancedCopy Managerコマンド実行の前後で独自に実施する必要があります。
前処理スクリプトには複写元ボリューム用(RepSrcPre.js)と複写先ボリューム用(RepDstPre.js)が存在し、以下のディレクトリ配下に格納されています。処理の必要性に応じてスクリプトをカスタマイズしてください。
非クラスタ運用の場合
<環境設定ディレクトリ>\etc\repl\scriptsディレクトリ配下
クラスタ運用の場合
<共有ディスク>:\etc\opt\swstorage\etc\repl\scriptsディレクトリ配下
RepSrcPre.js(複写元ボリューム前処理スクリプト)
1: // AdvancedCopy Manager for Windows 2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006 3: // 4: // RepSrcPre.js: Pre-Processing Script for Replication(Source) 5: // 6: // [Parameters] 7: // 1st argument: device name of source volume 8: // 9: // [Return Values] 10: // 0: The script ended normally. 11: // 2: The number of the arguments is incorrect. 12: // (1,3): unused, but must not be used because older versions use this value. 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 SwstReplicationPreProc object 22: var proc = new SwstReplicationPreProc(); 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(9); 30: } 31: 32: function SwstReplicationPreProc() 33: { 34: // member variables 35: this.svName = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of source volume 36: this.postFileName = getDataPathName() + "\\" + getPutFileName(this.svName) + ".spre"; // 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(this.postFileName, "none"); 46: } 47: 48: function writePostFile(postfile, postdata) 49: { 50: var overwrite = true; // means to overwrite a file if it exists. 51: var postFileStream = fsObj.CreateTextFile(postfile, overwrite); 52: postFileStream.WriteLine(postdata); 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("[Replication Preprocessing] The number of the arguments is incorrect."); 63: WScript.Quit(2); 64: default: 65: WScript.Echo("[Replication Preprocessing] The script exited abnormally."); 66: WScript.Quit(4); 67: } 68: } 69: 70: function getDataPathName() 71: { 72: return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\repl\\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: } |
RepDstPre.js(複写先ボリューム前処理スクリプト)
1: // AdvancedCopy Manager for Windows 2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006 3: // 4: // RepDstPre.js: Pre-Processing Script for Replication(Destination) 5: // 6: // [Parameters] 7: // 1st argument: device name of destination volume 8: // 9: // [Return Values] 10: // 0: The script ended normally. 11: // 2: The number of the arguments is incorrect. 12: // (1,3): unused, 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 SwstReplicationPreProc object 22: var proc = new SwstReplicationPreProc(); 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(9); 30: } 31: 32: function SwstReplicationPreProc() 33: { 34: // member variables 35: this.dvName = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of destination volume 36: this.postFileName = getDataPathName() + "\\" + getPutFileName(this.dvName) + ".dpre"; // 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(this.postFileName, "none"); 46: } 47: 48: function writePostFile(postfile, postdata) 49: { 50: var overwrite = true; // means to overwrite a file if it exists. 51: var postFileStream = fsObj.CreateTextFile(postfile, overwrite); 52: postFileStream.WriteLine(postdata); 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("[Replication Preprocessing] The number of the arguments is incorrect."); 63: WScript.Quit(2); 64: default: 65: WScript.Echo("[Replication Preprocessing] The script exited abnormally."); 66: WScript.Quit(4); 67: } 68: } 69: 70: function getDataPathName() 71: { 72: return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\repl\\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: } |
後処理スクリプトには複写元ボリューム用(RepSrcPost.js)と複写先ボリューム用(RepDstPost.js)が存在し、以下のディレクトリ配下に格納されています。処理の必要性に応じてスクリプトをカスタマイズしてください。
非クラスタ運用の場合
<環境設定ディレクトリ>\etc\repl\scriptsディレクトリ配下
クラスタ運用の場合
<共有ディスク>:\etc\opt\swstorage\etc\repl\scriptsディレクトリ配下
RepSrcPost.js(複写元ボリューム後処理スクリプト)
1: // AdvancedCopy Manager for Windows 2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006 3: // 4: // RepSrcPost.js: Post-Processing Script for Replication(Source) 5: // 6: // [Parameters] 7: // 1st argument: device name of source volume 8: // 9: // [Return Values] 10: // 0: The script ended normally. 11: // 2: The number of the arguments is incorrect. 12: // (1,3): unused, but must not be used because older versions use this value. 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 SwstReplicationPostProc object 22: var proc = new SwstReplicationPostProc(); 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: // clear temporary files 38: proc.deletePostFile(proc.postFileName); 39: SwstQuit(0); 40: } catch (e) { 41: SwstQuit(9); 42: } 43: 44: function SwstReplicationPostProc() 45: { 46: // member variables 47: this.svName = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of source volume 48: this.postFileName = getDataPathName() + "\\" + getPutFileName(this.svName) + ".spre"; // name of postprocessing file 49: 50: // member functions 51: this.getPostProcData = getPostProcData; // self-explanatory 52: this.doNothing = doNothing; // self-explanatory 53: this.deletePostFile = deletePostFile; // self-explanatory 54: } 55: 56: function getPostProcData(postfile) 57: { 58: var iomode = 1; // means read-only mode 59: var create = false; // means not to create a file 60: var postFileStream = fsObj.OpenTextFile(postfile, iomode, create); 61: var postData = postFileStream.ReadLine(); 62: postFileStream.Close(); 63: return postData; 64: } 65: 66: function doNothing() 67: { 68: // do nothing 69: } 70: 71: function deletePostFile(postfile) 72: { 73: if (fsObj.FileExists(postfile) == true) { 74: fsObj.DeleteFile(postfile); 75: } 76: } 77: 78: function SwstQuit(exitStatus) 79: { 80: switch(exitStatus) { 81: case 0: 82: WScript.Quit(0); 83: case 1: 84: WScript.Echo("[Replication Postprocessing] The number of the arguments is incorrect."); 85: WScript.Quit(2); 86: default: 87: WScript.Echo("[Replication Postprocessing] The script exited abnormally."); 88: WScript.Quit(4); 89: } 90: } 91: 92: function getDataPathName() 93: { 94: return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\repl\\data\\DEFAULT"; 95: } 96: 97: function getBinPathName() 98: { 99: return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin"; 100: } 101: 102: function getSetupInfoKey() 103: { 104: var nodeName = WshEnv.Item("SWSTGNODE"); 105: if( nodeName != "" ){ 106: return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName; 107: } 108: return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion"; 109: } 110: 111: function getPutFileName(deviceName){ 112: var fileName; 113: if( isSafeDISKName(deviceName) ){ 114: var re = /(\S+)\/(\S+):(\S+)/; 115: fileName = deviceName.replace(re, "$1_$2_$3"); 116: }else{ 117: fileName = deviceName; 118: } 119: return(fileName); 120: } 121: 122: function getGXDXPX(deviceName){ 123: var gXdXpX; 124: if( isSafeDISKName(deviceName) ){ 125: var re = /(\S+)\/(\S+):(\S+)/; 126: gXdXpX = deviceName.replace(re, "$3"); 127: }else{ 128: gXdXpX = deviceName; 129: } 130: return(gXdXpX); 131: } 132: 133: function isSafeDISKName(deviceName){ 134: var key = ":g"; 135: var s = deviceName.indexOf(key); 136: if ( s < 0 ) { 137: return (false); 138: } else { 139: return (true); 140: } 141: } |
RepDstPost.js(複写先ボリューム後処理スクリプト)
1: // AdvancedCopy Manager for Windows 2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006 3: // 4: // RepDstPost.js: Post-Processing Script for Replication(Destination) 5: // 6: // [Parameters] 7: // 1st argument: device name of destination volume 8: // 9: // [Return Values] 10: // 0: The script ended normally. 11: // 2: The number of the arguments is incorrect. 12: // (1,3,5-7): unused, 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 SwstReplicationPostProc object 22: var proc = new SwstReplicationPostProc(); 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: // clear temporary files 38: proc.deletePostFile(proc.postFileName); 39: SwstQuit(0); 40: } catch (e) { 41: SwstQuit(9); 42: } 43: 44: function SwstReplicationPostProc() 45: { 46: // member variables 47: this.dvName = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of destination volume 48: this.postFileName = getDataPathName() + "\\" + getPutFileName(this.dvName) + ".dpre"; // name of postprocessing file 49: 50: // member functions 51: this.getPostProcData = getPostProcData; // self-explanatory 52: this.doNothing = doNothing; // self-explanatory 53: this.deletePostFile = deletePostFile; // self-explanatory 54: } 55: 56: function getPostProcData(postfile) 57: { 58: var iomode = 1; // means read-only mode 59: var create = false; // means not to create a file 60: var postFileStream = fsObj.OpenTextFile(postfile, iomode, create); 61: var postData = postFileStream.ReadLine(); 62: postFileStream.Close(); 63: return postData; 64: } 65: 66: function doNothing() 67: { 68: // do nothing 69: } 70: 71: function deletePostFile(postfile) 72: { 73: if (fsObj.FileExists(postfile) == true) { 74: fsObj.DeleteFile(postfile); 75: } 76: } 77: 78: function SwstQuit(exitStatus) 79: { 80: switch(exitStatus) { 81: case 0: 82: WScript.Quit(0); 83: case 1: 84: WScript.Echo("[Replication Postprocessing] The number of the arguments is incorrect."); 85: WScript.Quit(2); 86: default: 87: WScript.Echo("[Replication Postprocessing] The script exited abnormally."); 88: WScript.Quit(4); 89: } 90: } 91: 92: function getDataPathName() 93: { 94: return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\repl\\data\\DEFAULT"; 95: } 96: 97: function getBinPathName() 98: { 99: return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin"; 100: } 101: 102: function getSetupInfoKey() 103: { 104: var nodeName = WshEnv.Item("SWSTGNODE"); 105: if( nodeName != "" ){ 106: return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName; 107: } 108: return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion"; 109: } 110: 111: function getPutFileName(deviceName){ 112: var fileName; 113: if( isSafeDISKName(deviceName) ){ 114: var re = /(\S+)\/(\S+):(\S+)/; 115: fileName = deviceName.replace(re, "$1_$2_$3"); 116: }else{ 117: fileName = deviceName; 118: } 119: return(fileName); 120: } 121: 122: function getGXDXPX(deviceName){ 123: var gXdXpX; 124: if( isSafeDISKName(deviceName) ){ 125: var re = /(\S+)\/(\S+):(\S+)/; 126: gXdXpX = deviceName.replace(re, "$3"); 127: }else{ 128: gXdXpX = deviceName; 129: } 130: return(gXdXpX); 131: } 132: 133: function isSafeDISKName(deviceName){ 134: var key = ":g"; 135: var s = deviceName.indexOf(key); 136: if ( s < 0 ) { 137: return (false); 138: } else { 139: return (true); 140: } 141: } |
ボリュームのロック/ロック解除処理、バッファフラッシュ処理はスクリプトではなく、コマンド内で実施されています。したがって、複写元前後処理スクリプト、複写先前後処理スクリプトは、複写元/複写先ボリュームのロック/ロック解除処理、バッファフラッシュ処理の直前、直後にそれぞれ実行されます。複写元/複写先前後処理スクリプトでは実質的に何も処理を実施していません。[スナップショット型レプリケーション(OPC)の場合]
[同期型レプリケーション(EC)の場合1:複写先ボリュームがクラスタシステムの共用ボリュームでない場合]
[同期型レプリケーション(EC)の場合2:複写先ボリュームがクラスタシステムの共用ボリュームの場合]
![]()
複写元ボリュームおよび複写先ボリュームのレプリケーション前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、複写元ボリューム、複写先ボリュームを使用しているプロセスが存在していますので、アプリケーションやサービスの停止を行う等の対処を実施して、他のプロセスからボリュームが使用されていない状態にしてください。なお、ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより、規定のリトライ回数の変更を行うことが可能ですが(詳細は本マニュアル『複写元ボリュームロック動作指定ファイル』、『複写先ボリュームロック動作指定ファイル』を参照してください)、レプリケーション処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常これらのファイルを作成する必要はありません。
同期型レプリケーション(EC)かつコピー先ボリュームがクラスタシステムの共用ボリュームの場合、クラスタシステムの監視を回避するため、コピー先ボリュームのロック保持期間は複製開始コマンドおよび複製作成コマンドの動作中のみとなります(上図参照)。すなわち、複製開始コマンドの実行後から複製作成コマンドの実行前まではコピー先ボリュームはロックされません。これにより、本マニュアルの『全般的な注意事項』の『イベントビューアに出力されるメッセージについて』に記載されているメッセージがイベントログに出力されることがありますが、問題はないため無視してください。
複写元ボリュームのバックアップ前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライが実施されます。標準のリトライ動作は以下の通りです。
ロック処理に失敗した場合は、1秒間待った後、再度、ロック処理を実施します。
ロック処理のリトライを20回(初回と合わせて計21回)実施しても、ロックが取得できない場合は、処理を中断してコマンドを異常終了させます。
リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、複写元ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。また、この設定ファイルでは、複写元ボリュームの前処理に対して、以下の動作を指示することもできます。
ロック処理のリトライを行う前に、そのボリューム内の全てのファイルハンドルを無効にすることを指定する(強制ロック機能)。
複写元前処理において、ロック/ロック解除の代わりにファイルシステムバッファのフラッシュを行うことを指定する(Xflushオプションと同等の機能)。
複写元ボリュームロック動作指定ファイルは以下のファイル名で複写元ボリュームが存在するサーバ上に作成してください。
ファイル名 |
[クラスタ運用でない場合] 環境設定ディレクトリ\etc\repl\data\SRCLOCK.INI [クラスタ運用の場合] <共用ディスク>:\etc\opt\swstorage\etc\repl\data\SRCLOCK.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 =バッファフラッシュを実施する(ロックを実施しない) swsrpmake、swsrpbackup_exchangeにXflushオプションが指定され、かつ、BufferFlushOnly=offの場合は、Xflushオプションが優先されます。 また、BufferFlushOnlyがonに指定されている場合は、他のパラメーター(LockForceMode、LockRetryNumber、LockRetryInterval)は全て無効となります。 本設定項目をonに指定する場合、複写元ボリュームに対する書き込み処理を事前に全て停止する必要があります(書き込み処理を停止しない状態で複製作成を実施した場合、複写元ボリュームのデータ内容は保証されません)。 |
LockForceMode |
複写元ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。 off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない on =ロックのリトライ前にマウント解除を実施する ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。 ※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。 BufferFlushOnlyがonに指定されている場合は、本パラメーターは無効となります。 |
LockRetryNumber |
複写元ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。 デフォルトの設定値は20(回)です。 指定されたリトライ回数、リトライを実施しても複写元ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。 BufferFlushOnlyがonに指定されている場合は、本パラメーターは無効となります。 |
LockRetryInterval |
複写元ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。 BufferFlushOnlyがonに指定されている場合は、本パラメーターは無効となります。 |
複写先ボリュームのレプリケーション前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライが実施されます。
標準のリトライ動作は以下の通りです。
ロック処理に失敗した場合は、1秒間待った後、再度、ロック処理を実施します。
ロック処理のリトライを20回(初回と合わせて計21回)実施しても、ロックが取得できない場合は、処理を中断してコマンドを異常終了させます。
リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、複写先ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。
また、この設定ファイルでは、複写先ボリュームの前処理に対して、以下の動作を指示することもできます。
ロック処理のリトライを行う前に、そのボリューム内の全てのファイルハンドルを無効にすることを指定する(強制ロック機能)。
複写先ボリュームロック動作指定ファイルは以下のファイル名で複写先ボリュームが存在するサーバ上に作成してください。
ファイル名 |
[クラスタ運用でない場合] 環境設定ディレクトリ\etc\repl\data\DSTLOCK.INI [クラスタ運用の場合] <共用ディスク>:\etc\opt\swstorage\etc\repl\data\DSTLOCK.INI |
複写先ボリュームロック動作指定ファイルの設定例を以下に示します。
[g1d1p1] LockForceMode=on LockRetryNumber=10 LockRetryInterval=10 [ANY] LockForceMode=off LockRetryNumber=20 LockRetryInterval=100 |
複写先ボリュームロック動作指定ファイルの作成方法は以下の通りです。
ロック動作を変更するボリュームのセクションを作成し、パラメーターを記述します(上記の例ではg1d1p1のセクションが作成されています)。変更可能なパラメーターは下表に示された3つのパラメーターですが、3つ全てを記述する必要はなく、変更したいパラメーターのみを記述してください。記述しなかったパラメーターについては、デフォルト値が使用されます。
また、デフォルトのロック動作を変更するためには「ANY」というセクションを作成し、パラメーターを記述します。これにより、複写先ボリュームロック動作指定ファイルに明示的に記述されているボリューム以外の全てのボリュームのロック動作を変更することができます(上記の例ではg1d1p1以外の全てのボリュームのロック動作は「ANY」セクションの値にしたがって動作します)。
キー |
説明 |
---|---|
LockForceMode |
複写先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。 off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。 ※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。 |
LockRetryNumber |
複写先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。 指定可能な数値は、1から10000までです。 デフォルトの設定値は20(回)です。 指定されたリトライ回数、リトライを実施しても複写先ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。 |
LockRetryInterval |
複写先ボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。 指定可能な数値は、1から600000(10分)までです。 デフォルトの設定値は1000(1秒)です。 |
目次
索引
![]() ![]() |