Migration des champs non référencés vers les champs de référence

  • Rversion finale: Yokohama
  • Mis à jour 30 janv. 2025
  • 2 minutes de lecture
  • Conservez manuellement les sys_ids dans les champs de référence au lieu de stocker le nom d’affichage sous forme de chaîne.

    Détermination des tables à migrer

    Pour commencer le processus de migration des données, exécutez le script en arrière-plan suivant. Ce script crée des enregistrements de migration pour les extensions de table directes et les enregistrements archivés connexes dans la table Migration de référence de règle d’archivage [sys_archive_ref_migration], en veillant à ce que seules les tables valides soient traitées.
    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();
                }
            }
        }

    Copie des références d’archives

    Pour chaque table soumise au processus de migration, la tâche Copie de référence d’archivage (RefCopyJob) identifie le sys_id des champs de référence et met à jour la valeur d’affichage pour qu’elle soit la bonne sys_id. La tâche configure 10 000 enregistrements à la fois, sauf s’il existe plus de 10 000 enregistrements avec le même horodatage. La progression de la migration repose sur l’horodatage archivé.

    Changement des types de champs de chaîne en référence

    Une fois que les tables associées à une règle d’archivage sont complètement migrées, la tâche ArchiveRefJob s’exécute. Cette tâche modifie les types de sys_dictionary de la table d’archivage de la chaîne à la référence.

    Correction des défaillances des nœuds pour RefCopyJob et ArchiveRefJob

    Si une défaillance de nœud se produit pendant l’exécution de ces tâches, cela laisse l’état de la migration de données dans un état incorrect. En cas d’échec RefCopyJob , une table peut être placée dans un état de migration. Vous pouvez vérifier cette condition en vérifiant si les lignes du sys_archive_ref_migration sont bloquées dans l’état de migration pendant une durée exceptionnelle. Mettez à jour l’état d’une ligne spécifique de migrationà attente , puis RefCopyJob la migration de données sur la table se poursuit lorsque la tâche s’exécute à nouveau.

    Le nœud peut également tomber en panne lorsque le ArchiveRefJob se termine prématurément. Vérifiez si les tables contiennent des champs de référence et d’autres encore des champs de type chaîne. La tâche peut avoir été interrompue au milieu de la modification des types de champs. Vous pouvez résoudre cette condition en configurant une tâche de déclenchement à exécuter dans un script en arrière-plan, ce qui redémarre le processus :
    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();