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

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

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

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

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を実行できます。

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

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

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

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

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

RHP_OPTYPE=MIGRATE_DATABASE
RHP_PHASE=PRE
ZDM_SRCDB=src_db_name
ZDM_SRCDBHOME=src_db_home
ZDM_TARGETDB=tgt_db_name
ZDM_TARGETDBHOME=tgt_db_home
RHP_PROGRESSLISTENERHOST=zdm_node_name
RHP_PROGRESSLISTENERPORT=zdm_progress_listener_port
LOG_PATH=src/tgt_zdm_log_path1
SRC_SCAN_NAME=src_scan_name
SRC_SCAN_PORT=src_scan_port
TGT_SCAN_NAME=tgt_scan_name
TGT_SCAN_PORT=tgt_scan_port
RHP_USERACTIONDATA=user_action_data2
RHP_OP_PHASE=current_job_phase3
RHP_UA_CHAIN_LIST=list_of_useractions4

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

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

3RHP_OP_PHASEは、移行ジョブの現在のフェーズを指定します(例: ZDM_VALIDATE_SRC)。

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

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

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

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

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

例6-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 == *"RHP_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

例6-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 == *"RHP_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

例6-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;

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

ユーザー・アクションを特定の操作フェーズのカスタマイズとしてプラグインするには、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 (カスタム・プラグインがエラーで終了した場合でも移行ジョブを続行する場合)のいずれかに設定できます。

次の例は、ユーザー・アクション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

zdmuser> $ZDM_HOME/bin/zdmcli add useraction
 -useraction zdmvalsrc
 -actionscript /home/zdmuser/useract1.sh
 -optype MIGRATE_DATABASE 
 -phase ZDM_VALIDATE_SRC
 -pre
 -onerror CONTINUE

前述のコマンドでは、-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を参照してください

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

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

アクション・テンプレートは、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

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

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

例として、前述の例で作成したアクション・テンプレート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

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

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

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

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

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

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

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

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

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

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

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

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

ユーザー・アクション・スクリプトをローカルで編集し、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

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

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;