非参照フィールドから参照フィールドへの移行

  • リリースバージョン: Yokohama
  • 更新日 2025年01月30日
  • 所要時間:5分
  • 表示名を文字列として格納する代わりに、参照フィールドのsys_idsを手動で保持します。

    移行するテーブルの決定

    データ移行プロセスを開始するには、次のバックグラウンドスクリプトを実行します。このスクリプトは、直接テーブル拡張と関連するアーカイブ済みレコードの両方の移行レコードをアーカイブルール参照移行 [sys_archive_ref_migration] テーブルに作成し、有効なテーブルのみが処理されるようにします。
    var tables = GlideDBObjectManager.get().getAllExtensions(current.table);
        for (i = 0; i < tables.size(); i++) {
            var gr = new GlideRecord('sys_archive_ref_migration');
            gr.addQuery('table', 'ar_' + tables.get(i));
            gr.query();
            if (!gr.next()) {
                if (GlideTableDescriptor.isValid('ar_' + tables.get(i))) {
                    var gr2 = new GlideRecord("sys_archive_ref_migration");
                    gr2.initialize();
                    gr2.setValue('rule', current.sys_id);
                    gr2.setValue('table', 'ar_' + tables.get(i));
                    gr2.setValue('reference_migration_progress', 'waiting');
                    gr2.insert();
                }
            }
        }
        //Also get insert related records tables as well
        var map = new GlideRecord('sys_archive');
        map.addQuery('table', current.table);
        map.query();
        if (map.next()) {
            var id = map.getValue('sys_id');
            if (!(id === undefined)) {
                var related = new GlideRecord('sys_archive_related');
                related.addQuery('archive_map', id);
                related.addQuery('action', 'archive');
                related.query();
                while (related.next()) {
                    if (!GlideTableDescriptor.isValid('ar_' + related.getValue('table'))) {
                        gs.log('Related Record table: ' + related.getValue('table') + ' not created yet');
                        continue;
                    }
     
                    var gr3 = new GlideRecord("sys_archive_ref_migration");
                    gr3.initialize();
                    gr3.setValue('rule', current.sys_id);
                    gr3.setValue('table', 'ar_' + related.getValue('table'));
                    gr3.setValue('reference_migration_progress', 'waiting');
                    gr3.insert();
                }
            }
        }

    アーカイブ参照のコピー

    移行プロセスが実行されるテーブルごとに、アーカイブ参照コピー (RefCopyJob) ジョブによって参照フィールドのsys_idが識別され、表示値が正しいsys_idに更新されます。同じタイムスタンプのレコードが 1 万件を超える場合を除き、ジョブは一度に 1 万件のレコードを設定します。移行の進行状況は、アーカイブされたタイムスタンプに依存します。

    フィールドタイプを文字列から参照に変更

    アーカイブルールに関連付けられたテーブルが完全に移行された後、ArchiveRefJob ジョブが実行されます。このジョブは、アーカイブテーブルのsys_dictionaryタイプを文字列から参照に変更します。

    RefCopyJob および ArchiveRefJob のノードエラーの修正

    これらのジョブの実行中にノード障害が発生すると、データ移行のステータスが不適切な状態のままになります。RefCopyJob が失敗した場合、テーブルが移行ステータスのままになる可能性があります。この条件は、sys_archive_ref_migrationの行が非常に長い時間 移行 ステータスでスタックしているかどうかを確認することで確認できます。特定の行のステータスを [移行中] から [待機中] に更新し、ジョブが再度実行されたときに RefCopyJob がテーブルのデータ移行を続行します。

    ArchiveRefJob が途中で終了すると、ノードにも障害が発生する可能性があります。テーブルに参照フィールドであるフィールドと、まだ文字列タイプのフィールドがあるかどうかを確認します。フィールドタイプの変更中にジョブが停止した可能性があります。この条件を解決するには、プロセスを再度開始するための、バックグラウンドスクリプトで実行するトリガージョブを設定します。
    GlideRecord trigger = new GlideRecord('sys_trigger');
    trigger.initialize();
    trigger.setValue('state', 0);
    trigger.setValue('trigger_type', 0);
    trigger.setValue('next_action', new GlideDateTime());
    trigger.setValue('job_context', 'fcRuleId=' + ruleId);
    trigger.setValue('name', 'Job Reference Migration' + ' Node - ' + new GlideClusterSynchronizer().getSystemID());
    trigger.setValue('trigger_class', 'com.glide.db.auxiliary.job.ArchiveRefJob');
    trigger.insert();