7 移行ジョブのカスタマイズ

指定した移行ジョブ・フェーズの最初または最後に実行できるスクリプトを使用して、Zero Downtime Migrationワークフローをカスタマイズできます。Zero Downtime Migrationでは、これらのカスタマイズはユーザー・アクションを含むカスタム・プラグインと呼ばれます。

次の各トピックでは、移行ジョブをカスタマイズする方法について説明します。

7.1 ユーザー・アクションを含むカスタム・プラグインについて

Zero Downtime Migrationでは、プラグインして移行ジョブの一部として実行するカスタム・スクリプトまたはスクリプトのバンドルは、ユーザー・アクションを含むカスタム・プラグインと呼ばれます。

ユーザー・アクションを含むカスタム・プラグインは、ユーザー・アクションとも呼ばれ、移行ジョブの操作フェーズに関連付けて、フェーズの前または後に実行できます。

事前アクションは、関連付けられたフェーズの開始時に実行されるユーザー・アクションです。同様に、事後アクションは、関連付けられたフェーズの終了時に実行されます。

ユーザー・アクションが移行フェーズに関連付けられると、Zero Downtime Migrationはそれを各ノードにコピーし(Autonomous Database以外の場合)、ユーザー・アクションをローカルで実行します。Zero Downtime Migrationは、開発者がDBNAME、DBHOME、DB SCANおよびZDMログの場所を使用するための一連のパラメータと、その他の多数のパラメータをユーザー・アクション・スクリプトの実行に提供します。

Autonomous Databaseの場合、Zero Downtime Migrationを使用すると、SQLをユーザー・アクションとして登録し、JDBC接続を介してZero Downtime MigrationサーバーからAutonomous DatabaseインスタンスでSQLを実行できます。

7.2 シェル・スクリプト・ユーザー・アクションを含むカスタム・プラグインに提供されるパラメータ

Zero Downtime Migrationは、実行時にユーザー・アクション・スクリプトを起動し、ロジックのプログラミングに使用できる自動移入される環境変数のセットをそれに提供します。

これらの変数は環境変数として値とともに提供されるため、これらの値を使用してカスタム・プラグインをプログラミングできます。

たとえば、ZDM_SRCDBHOMEの値は、現在の移行ジョブのソース・データベースに関連付けられたデータベース・ホームを指定し、同様にSRC_SCAN_NAMEは、データベースへの接続に使用できるソース・データベースのスキャン・リスナー情報を示します。

次に、ユーザー・アクション・パラメータと予想される値のリストを示します。詳細は、脚注を参照してください。

ZDM_OPTYPE=MIGRATE_DATABASE ZDM_PHASE=PRE ZDM_SRCDB=src_db_name ZDM_SRCDBHOME=src_db_home ZDM_TARGETDB=tgt_db_name ZDM_TARGETDBHOME=tgt_db_home ZDM_PROGRESSLISTENERHOST=zdm_node_name ZDM_PROGRESSLISTENERPORT=zdm_progress_listener_port SRC_SCAN_NAME=src_scan_name SRC_SCAN_PORT=src_scan_port TGT_SCAN_NAME=tgt_scan_name TGT_SCAN_PORT=tgt_scan_port ZDM_USERACTIONDATA=user_action_data1 ZDM_OP_PHASE=current_job_phase2 RHP_UA_CHAIN_LIST=list_of_useractions3 ZDM_SRCDBSID=src_db_sid ZDM_TGTDBSID=tgt_db_sid ZDM_VERSION=zdm_version ZDM_CLI=zdm_command TGT_LOG_PATH= tgt_log_path4 SRC_LOG_PATH=src_log_path5 TGT_DB_SERVICE=tgt_db_service SRC_DB_SERVICE=src_db_service ZDM_DATAPUMP_EXPORT_DIR_NAME=DATA_PUMP_DIR_NAME ZDM_DATAPUMP_EXPORT_DIR_PATH=data_pump_dir_path ZDM_DATAPUMP_DUMP_PREFIX=data_pump_prefix ZDM_SRCDBPDB= <the pdb name of the source database> ZDM_TGTDBPDB=<the pdb name of the target database> Note: This is populated using: SQL> 'SELECT * FROM DBA_PDBS' 

1 ZDM_USERACTIONDATAは、zdmcli migrate databaseコマンドのオプション-useractiondata user_action_dataで指定されたuseraction引数を指定します

2 ZDM_OP_PHASEは、移行ジョブの現在のフェーズを指定します(たとえば、ZDM_VALIDATE_SRC)。

3 ZDM_UA_CHAIN_LISTは、すべてのユーザー・アクション実行コールに渡されます。このパラメータは、実行中のユーザー・アクションに連鎖されたユーザー・アクションのリストを保持します。連鎖されたユーザー・アクションは、実行中のユーザー・アクションに出力が提供されるユーザー・アクションです。

4 TGT_LOG_PATHは、将来の参照用にログ・ファイルを格納するカスタム・プラグインのターゲット・ノードのZero Downtime Migrationログ・パスを指定します。

5 SRC_LOG_PATHは、将来の参照用にログ・ファイルを格納するカスタム・プラグインのソース・ノードのZero Downtime Migrationログ・パスを指定します。

7.3 SQLベースのユーザー・アクションを含むカスタム・プラグインに提供される変数

SQLベースのユーザー・アクションは、Oracle Autonomous Database (ADB)など、データベース・ノードにアクセスできないデータベースに使用されます。

SQLベースのユーザー・アクションの場合、次の変数が提供されます:
  • AS_USER: ユーザー・アクションは、このデータベース・ユーザーによって実行されます。このユーザーは、-asuserオプションを使用してユーザー・アクションを作成する際に設定されます。
  • ORACLE_HOME: データベースのホーム・パス。
  • ACTION_OUTPUT_DIR: 進行中の移行について、すべてのユーザー・アクションの出力が格納されるディレクトリ。
  • OUTPUT_FILE - これは、ユーザー・アクションの出力が次の形式の変数値で格納される出力ファイルへのフルパスを示します: <ACTION_OUTPUT_DIR>/<USER_ACTION_NAME>.out
前述の変数にSQLユーザー・アクションでアクセスするには、変数の前に:を付けて指定します。たとえば、SQLの:ACTION_OUTPUT_DIRは実際のACTION_OUTPUT_DIRに置き換えられます。

7.4 ユーザー・アクション・スクリプト

次のユーザー・アクション・スクリプトの例を使用して、独自のスクリプトを作成できます。

オンプレミス・ソースおよびノード・アクセスのあるクラウド・ターゲットの場合、Zero Downtime Migrationではユーザー・アクションがスクリプトである必要があります。スクリプト・ファイルがそれぞれのノードにコピーされ、ローカルで実行されます。

特定のユーザー・アクションの実行に使用するサービス名別名を指定できます。サービス名別名を指定しなかった場合、ZDMは、レスポンス・パラメータ・ファイル内で指定されているサービスに接続します。次のように、ユーザー・アクション・スクリプトでの先頭行コメントとして、必要なサービス別名を指定できます。
--USERACTION_SERVICE=<SERVICE NAME ALIAS from tnsnames for example TP or TP_TLS>
次に例を示します:
--USERACTION_SERVICE=TP or --USERACTION_SERVICE=LOW
この後に実際のSQLが続きます。

Autonomous Databaseターゲットの場合、Zero Downtime Migrationでは、ユーザー・アクション・スクリプトがSQLファイル(.sql)である必要があり、これはJDBC接続を使用してAutonomous Databaseターゲットで実行されます。

例7-1 action.sh

指定されたパラメータを検出するユーザー・アクション・スクリプトの例を次に示します。

 #!/bin/sh for var in $@ do if [[ ${var} == *"ZDM_SRCDB="* ]] then IFS='=' read -ra DBARR <<< "${var}" SRCDBNAME=${DBARR[1]} fi if [[ ${var} == *"ZDM_TARGETDB="* ]] then IFS='=' read -ra DBARR <<< "${var}" TARGETDBNAME=${DBARR[1]} fi if [[ $var == *"ZDM_SRCDBHOME="* ]] then IFS='=' read -ra PATHARR <<< "$var" SRCDBHOME=${PATHARR[1]} fi if [[ $var == *"ZDM_TARGETDBHOME="* ]] then IFS='=' read -ra PATHARR <<< "$var" TARGETDBHOME=${PATHARR[1]} fi if [[ $var == *"ZDM_OP_PHASE="* ]] then IFS='=' read -ra PHASEARR <<< "$var" ZDMPHASE=${PHASEARR[1]} fi if [[ $var == *"eval"* ]] then IFS='=' read -ra PATHARR <<< "$var" EVALRUN=${PATHARR[1]} fi if [[ $var == *"LOG_PATH"* ]] then IFS='=' read -ra PATHARR <<< "$var" LOGPATH=${PATHARR[1]} fi done echo "`date` Starting CUSTOM_USERACTION" >> $LOG_PATH/CUSTOM_USERACTION.log echo $@ >> $LOG_PATH/CUSTOM_USERACTION.log

例7-2 ユーザー・アクションでのSQL*Plusの実行

#!/bin/sh for var in $@ do if [[ ${var} == *"ZDM_SRCDB="* ]] then IFS='=' read -ra DBARR <<< "${var}" SRCDBNAME=${DBARR[1]} fi if [[ ${var} == *"ZDM_TARGETDB="* ]] then IFS='=' read -ra DBARR <<< "${var}" TARGETDBNAME=${DBARR[1]} fi if [[ $var == *"ZDM_SRCDBHOME="* ]] then IFS='=' read -ra PATHARR <<< "$var" SRCDBHOME=${PATHARR[1]} fi if [[ $var == *"ZDM_TARGETDBHOME="* ]] then IFS='=' read -ra PATHARR <<< "$var" TARGETDBHOME=${PATHARR[1]} fi if [[ $var == *"ZDM_OP_PHASE="* ]] then IFS='=' read -ra PHASEARR <<< "$var" ZDMPHASE=${PHASEARR[1]} fi if [[ $var == *"eval"* ]] then IFS='=' read -ra PATHARR <<< "$var" EVALRUN=${PATHARR[1]} fi if [[ $var == *"LOG_PATH"* ]] then IFS='=' read -ra PATHARR <<< "$var" LOGPATH=${PATHARR[1]} fi done check_dv_staus() { export ORACLE_HOME=${2} export PATH=$ORACLE_HOME/bin:$PATH export LOGFILE=$3 export currenthostname=`hostname -a` >> $LOGFILE echo "Current DB Host=$currenthostname" >> $LOGFILE CURRENTNODE=`srvctl status database -db ${1} | grep $currenthostname | cut -d" " -f2` >> $LOGFILE SQLRETURN=$? echo "Curent DB Node=${CURRENTNODE}" >> $LOGFILE if [ "$SQLRETURN" -ne "0" ]; then return 1 fi export ORACLE_SID=${CURRENTNODE} echo "`date` Checking Database Vault Status" >> $LOGFILE $ORACLE_HOME/bin/sqlplus -s / as sysdba 2>> $LOGFILE << EOF > /dev/null whenever sqlerror exit 1 SET PAGESIZE 60 SET LINESIZE 1300 SET VERIFY OFF TRIMSPOOL ON HEADING OFF TERMOUT OFF FEEDBACK OFF spool ${LOGFILE} append; SELECT 'Check Status : '||PARAMETER FROM V\$OPTION WHERE PARAMETER = 'Oracle Database Vault' AND VALUE='TRUE'; SELECT 'Check Grant : '||GRANTED_ROLE from dba_role_privs where GRANTED_ROLE in ('DV_PATCH_ADMIN') and grantee='SYS'; select distinct ('Check TDE enabled ' || ENCRYPTED) from dba_tablespaces where ENCRYPTED='YES'; spool off EOF SQLRETURN=$? if [ "$SQLRETURN" -ne "0" ]; then return 1 fi if grep -q "Check Status : Oracle Database Vault" $LOGFILE; then echo "`date`:$ORACLE_SID:Database Vault is enabled " >> $LOGFILE if grep -q "Check Grant : DV_PATCH_ADMIN" $LOGFILE; then return 3 # sys privs already granted else return 4 # sys privs are not granted fi else echo "`date`:$ORACLE_SID: DV is not enabled" >> $LOGFILE return 2 fi } if [[ $ZDMPHASE == "ZDM_VALIDATE_SRC" || $ZDMPHASE == "ZDM_VALIDATE_TGT" ]] then export LOGFILE=$LOG_PATH/${SRCDBNAME}_${ZDMPHASE}_datavault.log echo "`date` Start User Action for Phase: $ZDMPHASE " > $LOGFILE echo $@ >> $LOGFILE check_dv_staus $SRCDBNAME $SRCDBHOME $LOGFILE CHECKDV_STATUS_RETURN_CODE=$? if [ "$CHECKDV_STATUS_RETURN_CODE" -eq "1" ]; then echo "`date`:${SRCDBNAME}:Unable to check DataVault status" >> $LOGFILE exit 1 fi if [ "$CHECKDV_STATUS_RETURN_CODE" -eq "2" ]; then echo "`date`:${SRCDBNAME}:DataVault is not enabled " >> $LOGFILE exit 0 fi if [ "$CHECKDV_STATUS_RETURN_CODE" -eq "3" ]; then echo "`date`:${SRCDBNAME}:Database Vault SYS privileges granted" >> $LOGFILE exit 0 fi

例7-3 アクション・ファイル・アーカイブ展開プログラムaction_extract.sh

ユーザー・アクションの登録の説明に従って複数のユーザー・アクションをアクション・ファイルにバンドルする場合は、この例に示すように、アクション・ファイルを解凍するスクリプトも指定する必要があります。

#!/bin/sh MKDIR=/bin/mkdir DATE=/bin/date UNZIP=/usr/bin/unzip #get the current location, extract path from it and then from the same directory perform unzip to /tmp directory script_path=$0 script_dir=${script_path%/*} timestamp=$($DATE +%s) unzip_dir=/tmp/rhp_${timestamp} $MKDIR $unzip_dir $UNZIP ${script_dir}/pack.zip -d $unzip_dir echo "/bin/sh ${unzip_dir}/pack/main.sh $@" /bin/sh ${unzip_dir}/pack/main.sh "$@"

アーカイブが抽出されると、action_extract.shによってmain.shが実行され、ユーザー・アクション・スクリプトが実行されます。

 #!/bin/sh script_path=$0 script_dir=${script_path%/*} #extract args and execute all scripts echo "/bin/sh ${script_dir}/wc_add_pre.sh $@" /bin/sh ${script_dir}/wc_add_pre.sh "$@"

action_phase_pre.sh

#!/bin/sh touch /tmp/SAMPLE_PRE_OUT.txt; echo $* >> /tmp/SAMPLE_PRE_OUT.txt;

7.5 Oracle Autonomous DatabaseターゲットおよびAmazon Web Services RDSソースのユーザー・アクション

ソース・データベースがAmazon Web Services (AWS) RDSのOracle Databaseで、ターゲット・データベースがOracle Autonomous Database (ADB)の場合、SQLコマンドを使用してユーザー・アクション・スクリプトを作成できます。

Amazon Web Services (AWS) RDSソースおよびOracle Autonomous Database (ADB)ターゲットのOracle Databaseは、シェル・スクリプト・ユーザー・アクションをサポートしていません。SQLのみのユーザー・アクションをサポートしています。

SQLアクションは、Amazon Web Services RDSソースにアクセスするために指定されたユーザーとして実行されます。

7.6 ユーザー・アクションの登録

ユーザー・アクションを特定の操作フェーズのカスタマイズとしてプラグインするには、Zero Downtime Migrationサービス・ホストに登録する必要があります。

Zero Downtime Migrationソフトウェア・インストール・ユーザー(zmduserなど)を使用してデータベース移行ジョブにユーザー・アクションを追加します。

ZDMCLIコマンドadd useractionは、カスタム・アクション・スクリプトを登録します。ユーザー・アクション・スクリプト、およびその実行時期に指定されたワークフロー・オプションは、Zero Downtime Migrationメタデータにコピーされます。

add useractionコマンドで、次のオプションを指定します。

  • -useraction user_action_name (必須)

    ユーザー・アクションに名前を割り当てます。

  • -actionscript script_name (必須)

    フル・パスおよびスクリプト・ファイル名(/home/zdmuser/useract.shなど)を指定します。

  • -optype MIGRATE_DATABASE (必須)

    ユーザー・アクションが構成されている操作をMIGRATE_DATABASEとして定義します。

  • -phase

    移行ジョブ・ワークフローの適切なフェーズでスクリプトを実行するには、アクションを関連付ける必要のある移行ジョブ・フェーズを指定します。カスタム・プラグインは、移行ジョブ・ワークフローのZDM_SETUP_TGTの後のフェーズに登録できます。

    Zero Downtime Migrationプロセスのフェーズを参照してください

  • -preおよび-post

    ユーザー・アクションを、指定したフェーズの前または後のどちらで実行するかを示します。

  • -onerror

    実行時にユーザー・アクションでエラーが発生した場合の動作を指定できます。この動作は、ABORT (処理を終了する場合)またはCONTINUE (カスタム・プラグインがエラーで終了した場合でも移行ジョブを続行する場合)のいずれかに設定できます。

  • -asuser

    ユーザー・アクションでSQLコマンドを実行するデータベース・ユーザーを指定できます。

    「WALLET_USERACTION」を参照してください

次の例は、ユーザー・アクションzdmvaltgtおよびzdmvalsrcを追加する方法を示しています。

zdmuser> $ZDM_HOME/bin/zdmcli add useraction -useraction zdmvaltgt -actionscript /home/zdmuser/useract.sh -optype MIGRATE_DATABASE -phase ZDM_VALIDATE_TGT -pre -onerror ABORT -asuser dbuser zdmuser> $ZDM_HOME/bin/zdmcli add useraction -useraction zdmvalsrc -actionscript /home/zdmuser/useract1.sh -optype MIGRATE_DATABASE -phase ZDM_VALIDATE_SRC -pre -onerror CONTINUE -asuser dbuser 

前述のコマンドでは、-actionscriptオプションに指定されているスクリプトuseract.shおよびuseract1.shがZero Downtime Migrationサービス・ホストのリポジトリ・メタデータにコピーされ、アクション・テンプレートを使用して実行される移行ジョブに関連付けられている場合に実行されます。

1つのアクションでの複数のスクリプトの実行

複数のスクリプトを単一のユーザー・アクションとして実行する必要がある場合は、次の例に示すように、すべてのアクション・スクリプトをアクション・ファイル・アーカイブとしてバンドルし、アクション・スクリプトとともに指定できます。アクション・スクリプトは、アクション・ファイルを解凍し、その中のスクリプトを起動する必要があります。

zdmuser> $ZDM_HOME/bin/zdmcli add useraction -useraction reconfigure_services -actionscript /home/zdmuser/action_extract.sh -actionfile /home/zdmuser/pack.zip -optype MIGRATE_DATABASE -phase ZDM_RECOVER_TGT -post -onerror ABORT

スクリプトの例およびスクリプトの要件については、ユーザー・アクション・スクリプトを参照してください。

ZDMCLIコマンドadd useractionで使用できるその他のオプションの詳細は、add useractionを参照してください

7.7 アクション・テンプレートの作成

ユーザーアクション・プラグインを登録したら、移行ジョブに関連付けることができる一連のアクション・プラグインをまとめるアクション・テンプレートを作成します。

アクション・テンプレートは、ZDMCLIコマンドadd imagetypeを使用して作成します(イメージ・タイプimagetypeは、特定のタイプのデータベース移行に必要なすべてのユーザーアクションをまとめたものです)。データベースの移行に必要なすべてのユーザーアクション・プラグインを関連付けるイメージ・タイプを作成します。作成したイメージ・タイプは、同じプラグイン・セットを必要とするすべての移行操作で再利用できます。

ここで作成するイメージ・タイプの基本タイプは、次の例に示すようにCUSTOM_PLUGINである必要があります。

たとえば、前述の例で作成したユーザーアクションzdmvalsrcとzdmvaltgtの両方をまとめるイメージ・タイプACTION_ZDMを作成できます。

zdmuser> $ZDM_HOME/bin/zdmcli add imagetype -imagetype ACTION_ZDM -basetype CUSTOM_PLUGIN -useractions zdmvalsrc,zdmvaltgt

7.8 移行ジョブとのアクション・テンプレートの関連付け

移行ジョブを実行する際、移行ジョブの一環として実行するプラグインを指定するイメージ・タイプを指定できます。

例として、前述の例で作成したアクション・テンプレートACTION_ZDMを指定して(-imagetype ACTION_ZDM)移行コマンドを実行すると、イメージ・タイプが組み込まれて移行ジョブ・ワークフローの一環としてuseract.shスクリプトおよびuseract1.shスクリプトが実行されます。

デフォルトでは、アクション・プラグインは、クラスタのすべてのノードの指定された操作フェーズで実行されます。移行コマンド・オプション-tgtarg2で指定されたアクセス資格証明が指定のターゲット・ノードに対して一意である場合、追加のauth引数を組み込んで、他のクラスタ・ノードへのアクセスに必要な認証資格証明を指定する必要があります。たとえば、-tgtarg2 nataddrfile:auth_file_with_node_and_identity_file_mappingと指定します。

node1およびnode2で構成される2クラスタ・ノード用の一般的なnataddrfileを次に示します。

node1:node1:identity_file_path_available_on_zdmservice_node node2:node2:identity_file_path_available_on_zdmservice_node

7.9 アクション・プラグインの問合せ

Zero Downtime Migrationサービス・ホストに登録されたアクション・プラグインを問い合せることができます。

ユーザー・アクションの構成を表示するには:

zdmuser> $ZDM_HOME/bin/zdmcli query useraction -useraction user_action_name

使用方法の詳細は、query useractionを参照してください。

7.10 アクション・プラグインの更新

登録済のZero Downtime Migrationユーザー・アクション・プラグイン構成を更新できます。

次の例では、ユーザー・アクションzdmvalsrcを変更して、フェーズZDM_VALIDATE_SRCの前ではなく後でユーザー・アクション・スクリプトを実行する方法を示しています。

zdmuser> $ZDM_HOME/bin/zdmcli modify useraction -useraction zdmvalsrc -phase ZDM_VALIDATE_SRC -optype MIGRATE_DATABASE -post

この変更は、すべての関連するアクション・テンプレートに伝播されるため、アクション・テンプレートを更新する必要はありません。

ユーザー・アクション・スクリプトを変更し、ユーザー・アクションを更新するには、ユーザー・アクション・スクリプトの変更の手順に従います。

7.11 ユーザー・アクション・スクリプトの変更

ユーザー・アクション・スクリプトをローカルで編集し、ZDMCLIコマンドmodify useractionを使用してユーザー・アクション・メタデータのスクリプトを更新できます。

  1. スクリプトのローカル・コピーがない場合は、ZDMCLIコマンドquery useractionを使用して、キャッシュされたユーザー・アクション・スクリプトをユーザー・アクション・メタデータで見つけることができます。

    zdmuser> $ZDM_HOME/bin/zdmcli query useraction -useraction zdmvalsrc

    スクリプトへのフル・ベース・パスが表示されます。

    ノート:

    コマンド出力に示されている場所にあるスクリプトを直接変更しないでください。
  2. スクリプトを一時的な場所にコピーし、編集します。

  3. ZDMCLIコマンドmodify useractionを使用して、ユーザー・アクション・メタデータのスクリプトを更新します。

    zdmuser> $ZDM_HOME/bin/zdmcli modify useraction -useraction zdmvalsrc -actionscript /home/zdmuser/useract1.sh

7.12 アクション・テンプレートの変更

アクション・テンプレートを変更して、移行ジョブに関連付けられたアクション・プラグインのセットを変更できます。

アクション・テンプレートは、ZDMCLIコマンドのmodify imagetypeを使用して変更します。このコマンドは、新しいユーザー・アクション・スクリプトを登録し、それを既存のテンプレートに追加する場合に役立ちます。

たとえば、zdmclonetgtという名前の新しいユーザー・アクションをイメージ・タイプACTION_ZDMに追加するには、次のように、ユーザー・アクションをすべて示す新しいリストを指定してmodify imagetypeを実行します。

zdmuser> $ZDM_HOME/bin/zdmcli modify imagetype -imagetype ACTION_ZDM -useractions zdmvalsrc,zdmvaltgt,zdmclonetgt

7.13 連鎖ユーザー・アクション出力

1つ以上のユーザー・アクションからデータを取得し、そのデータを使用して別のユーザー・アクションを実行できます。たとえば、ソース・データベースでアクションを実行し、そのデータを使用してターゲット・データベースでアクションを実行できます。

ユーザー・アクションを追加する場合は、-outputfromオプションを使用して、追加されるユーザー・アクションに出力が提供されるユーザー・アクションのリストを指定できます。

次の例では、Zero Downtime Migrationにすでに登録されている2つのユーザー・アクション、USERAC1とUSERAC2があり、どちらもなんらかの出力を生成します。この出力は、次に示すように、-outputfromオプションで出力をリストすることによって、第3のユーザーアクション USERAC3で使用できます。

$ZDM_HOME/bin/zdmcli add useraction -useraction USERAC3 -actionscript useractionscript.sh -outputfrom USERAC1,USERAC2 

データへのアクセス

出力ファイルは、useractionファイルの実行元と同じ場所にコピーされるため、出力ファイルの内容は同じ場所からアクセスできます。

  • Autonomous Databaseシステムの場合:

    Autonomous Databaseシステムのユーザー・アクションSQLスクリプトの出力ファイルにアクセスするには、次を使用します

    @:ACTION_OUTPUT_DIR/useraction_name.out

    ACTION_OUTPUT_DIRは出力を格納するディレクトリを示し、@はこの変数を実際のディレクトリ・パスに置き換えます。

    たとえば、get_ddl1ユーザー・アクションからの出力を使用するには、次を指定します

    @:ACTION_OUTPUT_DIR/get_ddl1.out;

  • 共同管理データベース・システムの場合:

    共同管理データベース・システムで実行されるユーザー・アクション・スクリプトの出力ファイルにアクセスするには、次を使用します

    OUTPUTFILE=$CURR_DIR/useraction_name.out;

    ここで、CURR_DIRは、ターゲット・ユーザーのアクション・ファイルおよび他のユーザー・アクションからの出力が配置される現在のディレクトリです。

    たとえば、get_ddl1ユーザー・アクションからの出力を使用するには、次を指定します

    OUTPUTFILE=$CURR_DIR/get_ddl1.out;

    ユーザー・アクション・スクリプトには、連鎖ユーザー・アクション名のリストを提供するパラメータRHP_UA_CHAIN_LISTも含まれている必要があります。

Autonomous Database移行におけるユーザー・アクションの例

次の例は、ソース・データベースからDDL出力を取得し、ターゲット・データベースで実行する方法を示しています。

ユーザー・アクションget_ddl1はソース・データベースで実行され、DDL出力を生成します。

$ZDM_HOME/bin/zdmcli add useraction -useraction get_ddl1 -phase ZDM_VALIDATE_SRC -pre -optype MIGRATE_DATABASE -runscope ONENODE -onerror ABORT -actionscript /home/useraction1.sh

ユーザー・アクションtable_fromddlはターゲット・データベースで実行され、ユーザー・アクションget_ddl1からの出力を使用します。

$ZDM_HOME/bin/zdmcli add useraction -useraction table_fromddl -phase ZDM_VALIDATE_TGT -pre -optype MIGRATE_DATABASE -runscope ONENODE -onerror ABORT -actionscript /home/useraction2.sh -outputfrom get_ddl1

imagetypeへの両方のユーザー・アクションの追加:

$ZDM_HOME/bin/zdmcli add imagetype -imagetype OUTPUTIMG1 -basetype CUSTOM_PLUGIN -useractions get_ddl1,table_fromddl

useraction1.shの内容:

#!/bin/sh for var in $@ do if [[ $var == *"ZDM_SRCDBHOME="* ]] then IFS='=' read -ra PATHARR <<< "$var" SRCDBHOME=${PATHARR[1]} fi if [[ $var == *"LOG_PATH"* ]] then IFS='=' read -ra PATHARR <<< "$var" LOGPATH=${PATHARR[1]} fi done echo $SRCDBHOME; ORACLE_HOME=$SRCDBHOME; export ORACLE_HOME; ORACLE_SID=zdm1121; export ORACLE_SID; export TMPLOG=/tmp/tmptmp.log; true>$TMPLOG; export PATH=$ORACLE_HOME/bin:$PATH #echo "home is $ORACLE_HOME"; $ORACLE_HOME/bin/sqlplus -s / as sysdba 2>> $TMPLOG << EOF > /tmp/testlog whenever sqlerror exit 1 SET PAGESIZE 60 SET LINESIZE 1300 SET VERIFY OFF TRIMSPOOL ON HEADING OFF TERMOUT OFF FEEDBACK OFF spool ${TMPLOG} append; select dbms_metadata.get_ddl('TABLE', 'TEST1') from DUAL; spool off EOF SQLRETURN=$? if [ "$SQLRETURN" -ne "0" ]; then echo "Failed to run $SQLRETURN"; fi sed -i 's/PCTFREE 10 PCTU//g' $TMPLOG; echo "$(cat $TMPLOG)";

useraction2.shの内容:

select name from v$database; @:ACTION_OUTPUT_DIR/ZDM_VALIDATE_SRC_PRE_get_ddl1.out; select name from v$database;

共同管理データベース移行におけるユーザー・アクションの例

この例では、add useractionおよびadd imagetypeコマンドは、Autonomous Databaseのユースケースでの前述のコマンドと同じですが、スクリプトの内容は異なります。

useraction1.shの内容

#!/bin/sh for var in $@ do if [[ $var == *"ZDM_SRCDBHOME="* ]] then IFS='=' read -ra PATHARR <<< "$var" SRCDBHOME=${PATHARR[1]} fi done ORACLE_HOME=$SRCDBHOME; export ORACLE_HOME; ORACLE_SID=zdmsrc1; export ORACLE_SID; export TMPLOG=/tmp/tmptmp.log; true>$TMPLOG; export PATH=$ORACLE_HOME/bin:$PATH #echo "home is $ORACLE_HOME"; $ORACLE_HOME/bin/sqlplus -s / as sysdba 2>> $TMPLOG << EOF > /tmp/testlog whenever sqlerror exit 1 SET PAGESIZE 60 SET LINESIZE 1300 SET VERIFY OFF TRIMSPOOL ON HEADING OFF TERMOUT OFF FEEDBACK OFF spool ${TMPLOG} append; select dbms_metadata.get_ddl('TABLE', 'TEST1') from DUAL; spool off EOF SQLRETURN=$? if [ "$SQLRETURN" -ne "0" ]; then echo "Failed to run $SQLRETURN"; fi echo "$(cat $TMPLOG)";

useraction2.shの内容:

#!/bin/sh for var in $@ do if [[ $var == *"ZDM_TARGETDBHOME="* ]] then IFS='=' read -ra PATHARR <<< "$var" TARGETDBHOME=${PATHARR[1]} fi done CURR_DIR=$(dirname "$(readlink -f "$0")") export OUTPUTFILE=$CURR_DIR/get_ddl1.out; # export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1; ORACLE_HOME=$TARGETDBHOME; export ORACLE_HOME; ORACLE_SID=zdmnov19; export ORACLE_SID; export TMPLOG=/tmp/tmptmp.log; sed -i 's/PCTFREE 10 PCTUS//g' $OUTPUTFILE; export OUTPUT=$(cat $OUTPUTFILE); echo $OUTPUT; echo "">$TMPLOG; $ORACLE_HOME/bin/sqlplus -s / as sysdba 2>> $TMPLOG << EOF > /tmp/testlog whenever sqlerror exit 1 SET PAGESIZE 60 SET LINESIZE 1300 SET VERIFY OFF TRIMSPOOL ON HEADING OFF TERMOUT OFF FEEDBACK OFF spool ${TMPLOG} append; $OUTPUT; spool off EOF echo "$(cat $TMPLOG)"; #SELECT 'NAME: '|| NAME FROM V\$DATABASE;

7.14 スタンバイを設定するためのジョブのカスタマイズ

-stopafterオプションを使用して、クラウド上にスタンバイを作成し、ZDMフローを停止します。

-stopafterオプションにより、指定したフェーズでワークフローを切り捨てて、指定したフェーズの完了時に移行ジョブに完了ステータスでマークを付けます。

使用情報については、migrate databaseを参照してください。