Préparer les tables pour traitement
Vous devez effectuer les tâches suivantes pour préparer vos tables en vue de leur utilisation dans un environnement Oracle GoldenGate pour Db2 LUW.
Désactivation des déclencheurs et des contraintes en cascade
Désactivez les déclencheurs, les contraintes de suppression en cascade et les contraintes de mise à jour en cascade sur les tables LUW Db2 cible. Oracle GoldenGate réplique les instructions LMD résultant d'un déclencheur ou d'une contrainte en cascade. Si le même déclencheur ou la même contrainte est activé sur la table cible, il devient redondant en raison de la version répliquée et la base de données renvoie une erreur. Prenons l'exemple suivant, où les tables source sont emp_src et salary_src, et les tables cible emp_targ et salary_targ.
-
Une suppression est émise pour
emp_src. -
Il met en cascade une suppression dans
salary_src. -
Oracle GoldenGate envoie les deux suppressions à la cible.
-
La suppression parent arrive en premier et est appliquée à
emp_targ. -
La suppression parent met en cascade une suppression vers
salary_targ. -
La suppression en cascade de
salary_srcest appliquée àsalary_targ. -
Impossible de localiser la ligne car elle a déjà été supprimée à l'étape 5.
Garantir l'unicité des lignes pour les tables
Oracle GoldenGate requiert une forme d'identificateur de ligne unique sur les tables source et cible afin de localiser les lignes cible appropriées pour les mises à jour et les suppressions répliquées.
Sauf si une clause KEYCOLS est utilisée dans l'instruction TABLE ou MAP, Oracle GoldenGate sélectionne un identificateur de ligne à utiliser dans l'ordre de priorité suivant :
-
Clé primaire
-
Première clé unique alphanumérique ne contenant pas d'horodatage ni de colonne calculée non matérialisée.
-
S'il n'existe aucun des types de clé précédents (même si d'autres types de clé peuvent être définis dans la table), Oracle GoldenGate construit une pseudo-clé de toutes les colonnes. que la base de données permet d'être utilisée dans une clé unique, à l'exclusion de celles qui ne sont pas prises en charge par Oracle GoldenGate dans une clé ou de celles qui sont exclues de la configuration Oracle GoldenGate.
Remarque : s'il existe d'autres clés non utilisables sur une table ou s'il n'y a aucune clé dans la table, Oracle GoldenGate consigne un message approprié dans le fichier de rapport. La création d'une clé à partir de toutes les colonnes entrave les performances d'Oracle GoldenGate sur le système source. Sur la cible, cette clé entraîne l'utilisation par le processus Replicat d'une clause
WHEREplus grande et moins efficace. -
Si une table n'a pas de clé appropriée ou si vous préférez que les clés existantes ne soient pas utilisées, vous pouvez définir une clé de substitution si la table comporte des colonnes qui contiennent toujours des valeurs uniques. Vous définissez cette clé de substitution en incluant une clause
KEYCOLSdans le paramètre d'extractionTABLEet le paramètre de réplicationMAP. La clé indiquée remplacera toute clé primaire ou unique existante détectée par Oracle GoldenGate. Reportez-vous àTABLE \| MAPdans Référence des paramètres et des fonctions pour Oracle GoldenGate.
Utilisation de KEYCOLS pour spécifier une clé personnalisée
Si une table n'a pas l'un des types d'identificateur de ligne précédents, ou si vous préférez que ces identificateurs ne soient pas utilisés, vous pouvez définir une clé de substitution si la table contient des colonnes qui contiennent toujours des valeurs uniques. Vous définissez cette clé de substitution en incluant une clause KEYCOLS dans le paramètre d'extraction TABLE et le paramètre de réplication MAP. La clé indiquée remplacera toute clé primaire ou unique existante détectée par Oracle GoldenGate.
Empêcher les modifications clés
N'ajoutez pas de colonnes à une clé une fois qu'Oracle GoldenGate a commencé à extraire des données de la table. Cette règle s'applique à une clé primaire, à une clé unique, à une clé KEYCOLS ou à une clé colonne entière. Db2 LUW ne fournit pas d'image before pour les colonnes ajoutées à une table. Si des colonnes d'une clé sont mises à jour sur la source, Oracle GoldenGate a besoin d'une image "avant" pour effectuer une comparaison avec les valeurs en cours dans la table cible lors de la réplication de la mise à jour.
Tenir à jour les tables de requêtes matérialisées
Pour maintenir la parité entre les tables de requêtes matérialisées (MQT) source et cible, vous répliquez les tables de base, mais pas les tables MQT. La base de données cible gère les MQT en fonction des modifications que le processus Replicat applique aux tables de base.
Les règles de configuration de ces tables sont les suivantes :
-
Incluez les tables de base dans vos instructions
TABLEetMAP. -
N'incluez pas de MQT dans les instructions
TABLEetMAP. -
Les caractères génériques peuvent être utilisés dans les instructions
TABLEetMAP, même s'ils peuvent résoudre des noms MQT avec des noms de table standard. Oracle GoldenGate exclut automatiquement les MQT des listes de tables avec caractères génériques. Cependant, tout MQT explicitement répertorié dans une instructionTABLEExtract par son nom entraînera l'abandon du processus Extract.
Créer une table temporelle
Une table temporelle est une table qui gère l'historique de ses données et la période de validité de ses données. Les tables temporelles sont utilisées dans Oracle GoldenGate pour assurer le suivi de toutes les anciennes lignes qui sont supprimées ou mises à jour dans la table. Les tables temporelles sont également utilisées pour maintenir la validité de ses lignes et de ses données. Par exemple, Oracle GoldenGate assure le suivi de la période pendant laquelle une ligne est valide. Il existe trois types de table temporelle : table system-period, table application-period et table bitemporale.
Convertir en table temporelle
Vous pouvez convertir une table existante en une table temporelle, ce qui modifie la structure de la table. Cette section décrit les modifications apportées à la structure des tables. L'exemple de table existante suivant est converti en trois types de table temporelle dans les exemples de cette section :
Table policy_info
(
Policy_id char[4] not null primary key,
Coverage int not null
)
And the tables contains the following initial rows
POLICY_ID COVERAGE
------------- -----------
ABC 12000
DEF 13000
ERT 14000
Exemple 1 : conversion d'une table existante en table temporelle de période système
Vous convertissez l'exemple de table existante en une table temporelle de période système en ajoutant les colonnes SYSTEM_PERIOD, transaction id et SYSTEM_TIME comme suit :
ALTER TABLE policy_info
ADD COLUMN sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN;
ALTER TABLE policy_info
ADD COLUMN sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END;
ALTER TABLE policy_info
ADD COLUMN ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID;
ALTER TABLE policy_info ADD PERIOD SYSTEM_TIME(sys_start, sys_end);
Vous créez ensuite une table d'historique pour la nouvelle table temporelle à l'aide de l'une des deux méthodes suivantes :
CREATE TABLE hist_policy_info
(
policy_id CHAR(4) NOT NULL,
coverage INT NOT NULL,
sys_start TIMESTAMP(12) NOT NULL ,
sys_end TIMESTAMP(12) NOT NULL,
ts_id TIMESTAMP(12) NOT NULL
);
ALTER TABLE hist_policy_info ADD RESTRICT ON DROP;
CREATE TABLE hist_policy_info LIKE policy_info with RESTRICT ON DROP;
La clause RESTRICT ON DROP ne permet pas à la table d'historique d'être supprimée lors de la suppression de la table temporelle de période système. Sinon, la table d'historique est implicitement supprimée lors de la suppression de la table temporelle associée. Vous pouvez créer une table d'historique sans RESTRICT ON DROP. Une table d'historique ne peut pas être supprimée explicitement.
Vous ne devez pas utiliser la clause GENERATED ALWAYS lors de la création d'une table d'historique. La clé primaire de la table temporelle système-période ne s'applique pas non plus ici car il peut y avoir de nombreuses mises à jour pour une ligne particulière de la table de base, ce qui déclenche de nombreuses insertions dans la table d'historique pour le même ensemble de clés primaires. En dehors de cela, la structure d'une table d'historique doit être exactement la même que celle de sa table temporelle de période système associée. La table d'historique doit avoir le même nombre et le même ordre de colonnes que la table temporelle de période système. Les colonnes de la table d'historique ne peuvent pas être explicitement ajoutées, supprimées ou modifiées. Vous devez associer une table temporelle système-période à sa table d'historique avec l'instruction suivante :
ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info.
Les colonnes GENERATED ALWAYS de la table sont celles qui sont toujours alimentées par le gestionnaire de base de données. Vous n'avez donc aucun contrôle sur ces colonnes. Le gestionnaire de base de données renseigne ces colonnes en fonction de l'heure système.
Les colonnes SYSTEM_PERIOD et transaction id supplémentaires ont des valeurs par défaut pour les lignes existantes, comme dans les cas suivants :
POLICY_ID COVERAGE SYS_START SYS_END TS_ID
--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC 12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
DEF 13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
ERT 14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
La table d'historique associée est renseignée avec les images "avant" une fois que vous avez commencé à mettre à jour la table temporelle.
Exemple 2 : conversion d'une table existante en table temporelle de période d'application
Vous pouvez convertir l'exemple de table existante en table temporelle de période d'application en ajoutant des colonnes de temps et une période BUSINESS_TIME comme suit :
ALTER TABLE policy_info ADD COLUMN bus_start DATE NOT NULL DEFAULT '10/10/2001'"
ALTER TABLE policy_info ADD COLUMN bus_end DATE NOT NULL DEFAULT '10/10/2002'
ALTER TABLE policy_info ADD PERIOD BUSINESS_TIME(bus_start, bus_end)
Lors de l'ajout de colonnes de temps, vous devez vous assurer que lors de la saisie des valeurs de temps de validité métier des colonnes de temps existantes, la colonne bus_start a toujours une valeur inférieure à bus_end car ces colonnes indiquent la validité métier des lignes.
La nouvelle table temporelle application-period ressemblera à :
POLICY_ID COVERAGE BUS_START BUS_END
--------- ----------- ---------- -------------------------------
ERT 14000 10/10/2001 10/10/2002
DEF 13000 10/10/2001 10/10/2002
ABC 12000 10/10/2001 10/10/2002
Exemple 3 : conversion d'une table existante en table bitemporale
Vous pouvez convertir l'exemple de table existante en table bitemporale en ajoutant SYSTEM_PERIOD, des colonnes de temps avec la période SYSTEM_TIME et BUSINESS_TIME comme suit :
ALTER TABLE policy_info
ADD COLUMN sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN;
ALTER TABLE policy_info
ADD COLUMN sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END;
ALTER TABLE policy_info
ADD COLUMN ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID;
ALTER TABLE policy_info ADD PERIOD SYSTEM_TIME(sys_start, sys_end);
ALTER TABLE policy_info ADD COLUMN bus_start DATE NOT NULL DEFAULT '10/10/2001'"
ALTER TABLE policy_info ADD COLUMN bus_end DATE NOT NULL DEFAULT '10/10/2002'
ALTER TABLE policy_info ADD PERIOD BUSINESS_TIME(bus_start, bus_end)
Lors de l'ajout des colonnes d'heure, vous devez vous assurer que lors de la saisie des valeurs d'heure de validité métier de colonnes d'heure existantes, la colonne bus_start a toujours une valeur inférieure à bus_end car ces colonnes indiquent la validité métier des lignes.
Vous créez ensuite une table d'historique pour la nouvelle table temporelle à l'aide de l'une des deux méthodes suivantes :
CREATE TABLE hist_policy_info
(
policy_id CHAR(4) NOT NULL,
coverage INT NOT NULL,
sys_start TIMESTAMP(12) NOT NULL ,
sys_end TIMESTAMP(12) NOT NULL,
ts_id TIMESTAMP(12) NOT NULL
);
ALTER TABLE hist_policy_info ADD RESTRICT ON DROP;
CREATE TABLE hist_policy_info LIKE policy_info with RESTRICT ON DROP;
-
La clause
RESTRICT ON DROPne permet pas à la table d'historique d'être supprimée lors de la suppression de la table temporelle de période système. Sinon, la table d'historique est implicitement supprimée lors de la suppression de la table temporelle associée. Vous pouvez créer une table d'historique sansRESTRICT ON DROP.Une table d'historique ne peut pas être supprimée explicitement.Vous ne devez pas utiliser la clause
GENERATED ALWAYSlors de la création d'une table d'historique. La clé primaire de la table temporelle système-période ne s'applique pas non plus ici car il peut y avoir de nombreuses mises à jour pour une ligne particulière de la table de base, ce qui déclenche de nombreuses insertions dans la table d'historique pour le même ensemble de clés primaires. En dehors de cela, la structure d'une table d'historique doit être exactement la même que celle de sa table temporelle de période système associée. La table d'historique doit avoir le même nombre et le même ordre de colonnes que la table temporelle de période système. Les colonnes de la table d'historique ne peuvent pas être explicitement ajoutées, supprimées ou modifiées. Vous devez associer une table temporelle système-période à sa table d'historique avec l'instruction suivante :
ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info.
Les colonnes GENERATED ALWAYS de la table sont celles qui sont toujours alimentées par le gestionnaire de base de données. Vous n'avez donc aucun contrôle sur ces colonnes. Le gestionnaire de base de données renseigne ces colonnes en fonction de l'heure système.
Les colonnes SYSTEM_PERIOD et transaction id supplémentaires ont des valeurs par défaut pour les lignes existantes, comme dans les cas suivants :
POLICY_ID COVERAGE SYS_START SYS_END TS_ID
--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC 12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
DEF 13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
ERT 14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
La table d'historique associée est renseignée avec les images "avant" une fois que vous avez commencé à mettre à jour la table temporelle.
Les colonnes de période, d'ID de transaction et d'heure SYSTEM_TIME supplémentaires ont des valeurs par défaut pour les lignes existantes, comme suit :
POLICY_ID COVERAGE SYS_START SYS_END TS_ID BUS_START BUS_END
--------- ----------- -------------------------------- -------------------------------- -------------------------------- ---------- -------------------------------------
ABC 12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002
DEF 13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002
ERT 14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002
La table d'historique est renseignée avec les images "avant" une fois que l'utilisateur commence à mettre à jour la table temporelle.
Exemple 4 : réplication dans un environnement hétérogène.
Dans une configuration hétérogène dans laquelle vous n'avez pas de tables temporelles côté application, vous pouvez uniquement répliquer les tables système-période et bitemporelles, mais pas les tables d'historique associées. Lors de la réplication dans ce cas, vous devez prendre en charge la valeur des colonnes d'ID de transaction et SYSTEM_PERIOD. Ces colonnes contiennent des valeurs que la base de données cible peut ne pas prendre en charge. Vous devez d'abord utiliser les fonctions de conversion de mapping pour convertir ces valeurs au format pris en charge par la base de données cible, puis mapper les colonnes en conséquence.
Par exemple, MySQL a une plage DATETIME comprise entre 1000-01-01 00:00:00.000000 et 9999-12-31 23:59:59.999999. Vous ne pouvez pas répliquer une valeur d'horodatage de 0001-01-01-00.00.00.000000000000 vers MySQL. Pour répliquer de telles valeurs, vous devez convertir cette valeur en valeur MySQL DATETIME 1000-01-01 00:00:00.000000, puis mettre en correspondance les colonnes. Si la table system-period policy_info contient la ligne suivante :
POLICY_ID COVERAGE SYS_START SYS_END TS_ID
--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC 12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
Pour répliquer la ligne dans MySQL, vous devez utiliser la fonction colmap() :
map *source_schema*.policy_info, target *target_schema*.policy_info colmap
(policy_id=policy_id, coverage=coverage, sys_start= @IF( ( @NUMSTR( @STREXT(sys_
start,1,4))) > 1000, sys_start, '1000-01-01 00.00.00.000000'), sys_end=sys_end,
ts_id= @IF( ( @NUMSTR( @STREXT(ts_id,1,4))) > 1000, ts_id, '1000-01-01
00.00.00.000000'));
Répliquer avec des tables temporelles
Vous pouvez choisir l'une des méthodes suivantes pour répliquer une période système ou une table temporelle bitemporale comme suit :
-
Vous pouvez répliquer une table temporelle vers une autre table temporelle uniquement. Il s'agit du comportement par défaut. Oracle GoldenGate ne répliquera pas les colonnes de période et d'ID de transaction
SYSTEM_TIMEcar ces colonnes sont générées automatiquement côté application. Le gestionnaire de base de données renseigne les colonnes de la table temporelle cible à l'aide de l'heure de l'horloge système et des valeurs par défaut. Vous pouvez conserver les valeurs d'origine de ces colonnes, puis utiliser l'une des options suivantes :-
Ajoutez des colonnes d'horodatage supplémentaires dans la table temporelle cible et mettez en correspondance les colonnes en conséquence. Les colonnes supplémentaires sont automatiquement ajoutées à la table d'historique associée.
-
Utilisez une table non temporelle côté application et mappez les colonnes de façon appropriée. Dans ce scénario, vous ne pourrez pas gérer la table d'historique.
-
Dans une configuration hétérogène où la source est Db2 LUW et où la cible est une base de données différente, vous pouvez ignorer les colonnes générées automatiquement ou utiliser une fonction de conversion de colonne appropriée pour convertir la valeur des colonnes au format pris en charge par la base de données cible et les mettre en correspondance avec les colonnes cible en conséquence.
Ou
-
-
Vous pouvez répliquer une table temporelle, avec la table d'historique associée, vers une table temporelle et une table d'historique, respectivement. Vous devez alors indiquer le paramètre de réplication,
DBOPTIONS SUPPRESSTEMPORALUPDATES. Vous devez indiquer à la fois la table temporelle et la table d'historique à capturer dans le fichier de paramètres Extract. Oracle GoldenGate réplique la valeur des colonnes d'ID de transaction et de périodeSYSTEM_TIME. Vous devez vous assurer que l'instance de base de données dispose des droits d'exécution nécessaires pour exécuter la procédure stockée côté application.
Oracle GoldenGate ne peut pas détecter et résoudre les conflits lors de l'utilisation de la réplication par défaut car la période SYSTEM_TIME et les colonnes transactionstart id restent générées automatiquement. Ces colonnes ne peuvent pas être indiquées dans les clauses set et where. Si vous utilisez le paramètre SUPPRESSTEMPORALUPDATES, Oracle GoldenGate prend en charge la fonction CDR.