Preparazione tabelle per l'elaborazione
Gli attributi delle tabelle nelle sezioni seguenti devono essere risolti nell'ambiente Oracle GoldenGate.
Considerazioni Replicat per colonne, trigger e vincoli di identità di destinazione
Quando si replicano i dati in un database di destinazione di SQL Server con colonne di identità, trigger e vincoli di cascata e controllo, tenere presente quanto riportato di seguito.
-
Per le colonne con una colonna di identità, Replicat imposta
IDENTITY_INSERT ONper la tabella, il che può ridurre le prestazioni di consegna. -
Per le tabelle con trigger o vincoli in cascata, l'esecuzione del trigger o dell'operazione in cascata può generare un errore Replicat se Replicat è configurato per fornire gli stessi dati che un trigger inserirà o applicherà un vincolo in cascata che verrà aggiornato o eliminato.
Ad esempio,
TableAnell'origine dispone di un trigger che inserisce un record inTableB. Extract è configurato per acquisire i record sia perTableAche perTableB. Sulla destinazione, Replicat inserirà prima un record perTableA, quindi il trigger perTableAviene attivato e inserito inTableB, seguito dal Replicat che tenta di inserire lo stesso record inTableB, il che comporterà un errore Replicat. -
Controllare che vengano applicati anche eventuali vincoli di chiave esterna, il che potrebbe ridurre le prestazioni di consegna.
-
Per le tabelle del database di destinazione con trigger, impostare il parametro
SET XACT_ABORTsu off. Ciò garantisce che l'esecuzione dell'operazione di trigger non comporti transazioni mancanti.
Per superare queste situazioni, sono disponibili diverse opzioni che possono essere implementate in base al caso d'uso della replica.
-
Per le implementazioni unidirezionali in cui Replicat è l'unico processo che scrive i dati nelle tabelle di destinazione, prendere in considerazione le opzioni riportate di seguito per le colonne di identità, i trigger e i vincoli nelle tabelle di destinazione.
-
Disabilitare o eliminare la proprietà Identity, i trigger e i vincoli nelle tabelle di destinazione.
-
Modificare la proprietà di identità, i trigger e i vincoli e impostare l'opzione
NOT FOR REPLICATIONper ciascun driver e assicurarsi che il driver Microsoft ODBC sia almeno la versione 17.8.1.
-
-
Per le implementazioni multidirezionali in cui sia un Replicat che un'applicazione scrivono dati nelle tabelle di destinazione e i trigger e i vincoli sono abilitati, modificare la proprietà Identity, i trigger e i vincoli e impostare l'opzione
NOT FOR REPLICATIONper ciascuna e assicurarsi che il driver Microsoft ODBC sia almeno la versione 17.8.1.Inoltre, per utilizzare le colonne
IDENTITYin una configurazione di replica multidirezionale, definire le colonneIDENTITYin modo che abbiano un valore di incremento uguale al numero di server nella configurazione, con un valore iniziale diverso per ciascuno di essi.Ad esempio, una configurazione a tre database potrebbe essere la seguente:
Database1 imposta il valore iniziale su 0 con un incremento di 3.
Database2 imposta il valore iniziale su 1 con un incremento di 3.
Database3 imposta il valore iniziale su 2 con un incremento di 3.
Miglioramento della replica di IDENTITY con l'elaborazione degli array
Poiché solo una tabella per sessione può avere IDENTITY_INSERT impostato su ON, Replicat deve attivare o disattivare continuamente IDENTITY_INSERT quando applica i dati IDENTITY a più tabelle in una sessione. Per migliorare le prestazioni di Replicat in questa situazione, utilizzare il parametro BATCHSQL. BATCHSQL fa sì che Replicat utilizzi l'elaborazione dell'array invece di applicare istruzioni SQL una alla volta.
Come garantire l'univocità delle righe nella tabella di origine e di destinazione
Oracle GoldenGate richiede una forma di identificativo di riga univoco nelle tabelle di origine e di destinazione per individuare le righe di destinazione corrette per gli aggiornamenti e le eliminazioni replicati.
A meno che non venga utilizzata una clausola KEYCOLS nell'istruzione TABLE o MAP, Oracle GoldenGate seleziona un identificativo di riga da utilizzare nel seguente ordine di priorità:
-
Chiave primaria
-
Prima chiave univoca in modo alfanumerico che non contiene un indicatore orario o una colonna calcolata non materializzata.
-
Se non esiste alcun tipo di chiave precedente (anche se nella tabella potrebbero essere definiti altri tipi di chiavi), Oracle GoldenGate costruisce una pseudo chiave di tutte le colonne che il database consente di essere utilizzato in una chiave univoca, esclusi quelli non supportati da Oracle GoldenGate in una chiave o quelli esclusi dalla configurazione di Oracle GoldenGate. Nota: se sono presenti altre chiavi non utilizzabili in una tabella o se non sono presenti chiavi nella tabella, Oracle GoldenGate registra un messaggio appropriato nel file di report. La creazione di una chiave da tutte le colonne impedisce le prestazioni di Oracle GoldenGate nel sistema di origine. Nella destinazione, questa chiave fa sì che Replicat utilizzi una clausola
WHEREpiù grande e meno efficiente.
- Se una tabella non dispone di una chiave appropriata o se si preferisce che non vengano utilizzate le chiavi esistenti, è possibile definire una chiave sostitutiva se la tabella contiene colonne che contengono sempre valori univoci. Per definire questa chiave sostitutiva, includere una clausola
KEYCOLSnel parametro ExtractTABLEe nel parametro ReplicatMAP. La chiave specificata sostituirà qualsiasi chiave primaria o univoca esistente trovata da Oracle GoldenGate. Vedere TABLE | MAP in Reference for Oracle GoldenGate.
Utilizzo di KEYCOLS per specificare una chiave personalizzata
Se una tabella non dispone di un identificativo di riga applicabile o se si preferisce che gli identificativi non vengano utilizzati, è possibile definire una chiave sostitutiva, a condizione che la tabella contenga sempre colonne contenenti valori univoci. Per definire questa chiave sostitutiva, includere una clausola KEYCOLS nel parametro Extract TABLE e nel parametro Replicat MAP. La chiave specificata sostituisce qualsiasi chiave primaria o univoca esistente trovata da Oracle GoldenGate.