非参照フィールドから参照フィールドへの移行
表示名を文字列として格納する代わりに、参照フィールドの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();