Anleitung zum Aufsetzen einer Multi-Master-Replikation anhand eines Beispiels (Oracle9i)1 Johann Murauer, 6.August 2004 Umgebung und DBServer Version Es werden zwei Rechner verwendet: der T-JMU-1 (Windows XP, engl.) und ENTRUST (Win 2000, deutsch). Diese beiden Rechner müssen sich selbstverständlich pingen können. Auf beiden Rechnern ist Oracle9i (Enterprise Edition) installiert. Die Replikation funktioniert nur mit der Enterprise Edition. Wie bestimmt man, ob man die richtige Oracle-Version installiert hat? Man verbindet sich als SYS zur einer bestehenden DB und sieht sich den Inhalt der Tabelle v$version an. Dort findet man die Antwort: conn sys/oracle as sysdba select * from v$version BANNER ---------------------------------------------------------------Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production PL/SQL Release 9.2.0.1.0 - Production CORE 9.2.0.1.0 Production TNS for 32-bit Windows: Version 9.2.0.1.0 - Production NLSRTL Version 9.2.0.1.0 - Production 5 rows selected. Datenbanken erzeugen Ehe man replizieren kann, braucht man die entsprechenden Datenbanken. Wenn man nicht bestehende verwenden will, muss man neue erzeugen. Da es dabei einiges zu beachten gibt, führe ich es hier durch. Ich nehme an, der Rechner T-JMU-1 steht in Bamako und der Rechner ENTRUST steht in Mopti2. Entsprechend vergebe ich die Datenbanknamen: T-JMU-1 erhält die Datenbank BAM, ENTRUST erhält die Datenbank MOP. Neue Datenbanken werden mit dem Database Configuration Assistant erzeugt. Schritt 1 Create Database. Im Schritt 2 wird die Art der zu erzeugenden DB ausgewählt. Dabei werden nur einige Parameter in den Oracle – INI – Files gesetzt und diese Eintstellungen können auch 1 Ein anderer Titel wäre: „Oracle Replikation für Dummies – gezeigt an einem Beispiel aus Mali“ Diese Städte wurden deshalb gewählt, um der Vorliebe gewisser Personen für malische Städte gerecht zu werden. Allerdings erlaube ich mir eine Abweichung von Lieblingsort Timbuktu da mir das schon ziemlich langweilig erscheint und auch Geographiekenntnisse erweiterungswürdig sind. 2 Seite 1 von 31 später wieder geändert werden (sofern man weiß, welcher Parameter was bedeutet und welcher Werte er annehmen kann). Hier ist es wichtig „Transaction Processing“ auszuwählen, da ansonsten Parameter gesetzt werden, die dann später einer Replikation im Wege stehen (also nicht „General Purpose“ wie man vielleicht vermuten könnte). Seite 2 von 31 Im Schritt 3 muss der DB Name eingeben werden. Hierbei ist es ganz wichtig, eine Extension anzugeben (hier: WORLD). Die SID ist üblicherweise der Global Database Name ohne Extension. Zwar sollte es auch möglich sein, ohne diese Extension zu arbeiten. Aber hier traten dann Probleme auf (es wurde an einigen Stellen immer eine unbrauchbare DefaultExtension angehängt, was wir nicht abstellen konnten). Im Schritt 4 hat man einen Dedicated Server auszuwählen. Im nächsten Schritt wird die Shared Pool Size auf 100 MByte geändert. Dann wird „All Initialization Parameters“ gewählt – es müssen ein paar Einstellungen kontrolliert bzw. manuell angepasst werden. Die wichtigste Einstellung ist „global_names“ – sie ist von FALSE auf TRUE zu ändern und das Häckchen ist zu setzen. Dann sind noch diese Parameter zu prüfen: distributed_transaction db_domain open_links parallel_max_server replication_dependency_tracking 10 hier darf kein Häckchen sein !!! WORLD 4 10 TRUE Die numerischen Werte hängen von der CPU – Anzahl u.a. ab. Sie dürfen / sollten aber nicht 0 oder riesig groß sein. WORLD ist die vorhin eingegebene Extension. Seite 3 von 31 Seite 4 von 31 Seite 5 von 31 Nach ein paar „OK-Buttons“ kommen wir zum abschließenden Schritt: Sollte es aussehen, als würde die Applikation hängen, dann kann das einen dummen Grund haben: es ist ein Fehler (etwa aufgrund falsch gesetzter Parameter), es wird dies in einer Dialogbox ausgegeben aber diese ist nicht an der Oberfläche sichtbar sondern wartet unter dem anderen Fenster auf OK / Abbrechen. Seite 6 von 31 Diesen Fehler kann man nicht ignorieren. Bei den Parameter würde das entsprechende Häckchen nicht entfernt. Also: ein paar Schritte zurück, Häckchen entfernen und alles nochmal durchführen. Wenn die DB erzeugt werden konnte, muss man die Passwörter für SYS und SYSTEM eingeben. Randbemerkung: der SYS ist mächtiger als der SYSTEM, die Rolle SYSDBA ist mächtiger als die Rolle SYSOPER. Eigentlich braucht man als den SYSTEM gar nicht wenn man die Sicherheit einmal außer Acht lässt. Randbemerkung: Wir hier in Linz stellten fest, dass wir auf bestimmten Rechner unter Win 2000 Oracle nicht problemlos installieren und betreiben konnten. Mögliche Erklärung: Unter Win 2000 gibt es bei bestimmten Pentium Prozessoren Probleme – aber auch entsprechende Patches. Nachdem nun die DB erzeugt wurde vergessen wir den Database Configuration Assistant und gehen zur Oracle Enterprise Manager Console. Seite 7 von 31 Wir binden die neue Datenbank BAM ein (man beachte, dass die SID richtig eingegeben wird). Unter bestimmten Vorraussetzungen wir die DB automatisch erkannt und eingebunden. Dennoch ist das Wissen um die manuelle Einbindung nützlich (wir brauchen es später). Und wir prüfen gleich, ob wir uns als SYS (dieser hat nur die Rollen SYSDBA und SYSOPER) einloggen könne. Wir sind nun einmal auf der einen Seite T-JMU-1 / BAM fertig. Wir gehen zum Rechner ENTRUST und erzeugen dort die Datenbank MOP (Globaler Datenbank Name: MOP.WORLD, SID: MOP) ganz analog. Randbemerkung: Bei dieser Form der Erzeugung wird der Replikationssupport bei den jeweiligen DBs gleich mit installiert. Wenn das nicht der Fall sein sollte, kann dies nachträglich durch das Skript (hier in meiner Umgebung) E:\oracle\ora92\rdbms\admin\catrep.sql erledigt werden. Das habe ich aber nicht getestet. Man kann überprüfen, ob die Replikation installiert ist, indem man in der DB (als SYS) im Schema SYS die Views aufmacht und kontrolliert, ob die DEFxxx Views vorhanden sind. Seite 8 von 31 Randbemerkung: In E:\oracle\admin\BAM (BAM oder ein anderer DB-Name) findet man log und trace files, die bei administrativen Tätigkeiten erstellt werden. So findet man auch ein init.ora.75200492652. Das ist ein Binärfile mit den vorgenommen Einstellungen und kann mit WordPad gelesen werden. In E:\oracle\ora92\database findet man SPxxxx.ORA Files für jede Datenbank (SP Server Paramter). Auch diese Files sind Binär aber können mit WordPad gelesen und analysiert werden. Datenbanken verbinden Wenn wir damit fertig sind, habe wir also zwei „nackte“ Datenbanken an zwei Orten. Wir wollen diese nun verbinden. In E:\oracle\ora92\network\admin findet man wichtige Dateien für die Netzwerkkommunikation und Konfiguration. Für uns geht es darum, dass a) T-JMU-1 auf seine „gegenüberliegende“ Datenbank MOP zugreifen kann und dass b) ENTRUST auf seine „gegenüberliegende“ Datenbank BAM zugreifen kann. Wir öffnen auf T-JMU-1 im Verzeichnis E:\oracle\ora92\network\admin das File tnsnames.ora und kopieren die Sektion BAM = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = t-jmu-1)(PORT = 1521)) Seite 9 von 31 ) (CONNECT_DATA = (SID = BAM) (SERVER = DEDICATED) ) ) Nun öffnen wir auf ENTRUST in D:\oracle\ora92\network\admin auch die Datei tnsnames.ora und fügen die obige Sektion BAM = ein. Aus dieser Datei kopieren wir die Sektion MOP = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = t-entrust-1)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = MOP.WORLD) ) ) und fügen diese in tnsnames.ora von T-JMU-1 ein. Jeder der beiden Rechner weiß nun, wo die andere DB sich befindet. Wir überprüfen dass, indem wir bei jedem Rechner im Oracle Enterprise Managager die „gegenüberliegende“ Datenbank einbinden und uns bei ihr als SYS anmelden. Im Prinzip könnten wir nun vom Enterprise Manager eines einziges Rechners alles erledigen – da dass aber ein paar Probleme aufwerfen kann (und schnelle unübersichtlich wird), verzichten wir einstweilen darauf und arbeiten weiterhin auf beiden Rechnern. REPADMIN einrichten Seite 10 von 31 Der nächste Schritt besteht darin, auf in beiden Datenbanken eine Benutzer REPADMIN mit bestimmten Rechten einzurichten. Hier der Rechner T-JMU-1 mit der Datenbank BAM: Bei BAM als SYS angemeldet, Security, Users, Create, den Namen REPADMIN und das Passwort eingeben. Der Tablespace sollte USER bzw. TEMP sein. Dann zu den Role wechseln. REPADMIN muss die Rollen CONNECT und RESOURCE erhalten. Das Häckchen bei Admin Option braucht nicht gesetzt sein, es würde nur ermöglichen, dass REPADMIN diese Rolle weiter geben kann. Nun zu System wechseln und diese Rechte noch vergeben: COMMENT ANY TABLE CREATE ANY SYNONYM (eventuell überflüssig) EXECUTE ANY PROCEDURE LOCK ANY TABLE SELECT ANY DICTIONARY Seite 11 von 31 Nachdem REPADMIN erfolgreich erzeugt wurde, braucht er noch etwas „finetuning“. Dies wird entweder mit sqlplus oder mit dem SQL *Pluss Worksheet vorgenommen (SQL scratchpad geht hier nicht). Anmelden an die DB als SYS mit Seite 12 von 31 conn sys@bam/oracle as sysdba (ja, ja, mein Passwort in dieser Testumgebung ist immer und überall oracle). Das Statement execute dbms_repcat_admin.grant_admin_schema('REPADMIN') eintippen und mit F5 ausführen. REPADMIN muss noch als Propagator eingerichtet werden. Das geschieht durch: execute dbms_defer_sys.register_propagator('REPADMIN') In beiden Fällen muss die Ausgabe „PL/SQL procedure successfully completed.“ lauten. Genau das gleiche muss nun noch auf den zweiten Rechner ENTRUST, Datenbank MOP durchgeführt werden. Wichtig: auch dort muss der Name REPADMIN sein und dann das finetuning nicht vergessen: conn sys@mop/oracle as sysdba execute dbms_repcat_admin.grant_admin_schema('REPADMIN') execute dbms_defer_sys.register_propagator('REPADMIN') So, dass war die Theorie. Die Praxis zeigte, dass ein solcher REPADMIN zu wenige Rechte hat. Daher geht später beim Erzeugen der Master-Gruppen das Generieren der rep-Daten schief. Man kann entweder später oder jetzt gleich die erforderlichen Rechte hinzufügen. Jeder REPADMIN weist daher folgende Konfiguration auf (das sind sicher mehr als die benötigten Rechte, das minimale Set ist mir im Moment nicht bekannt): Roles: CONNECT / RESOURCE / SELECT_CATALOG_ROLE System Privileges: ALTER ANY CLUSTER ALTER ANY INDEX ALTER ANY PROCEDURE ALTER ANY SEQUENCE ALTER ANY SNAPSHOT ALTER ANY TABLE ALTER ANY TRIGGER ALTER ANY TYPE ALTER SESSION COMMENT ANY TABLE CREATE ANY CLUSTER CREATE ANY INDEX CREATE ANY INDEXTYPE CREATE ANY OPERATOR CREATE ANY PROCEDURE CREATE ANY SEQUENCE CREATE ANY SNAPSHOT CREATE ANY SYNONYM CREATE ANY TABLE CREATE ANY TRIGGER Seite 13 von 31 CREATE ANY TYPE CREATE ANY VIEW CREATE DATABASE LINK CREATE PROCEDURE CREATE PUBLIC SYNONYM CREATE SESSION DELETE ANY TABLE DROP ANY CLUSTER DROP ANY INDEX DROP ANY INDEXTYPE DROP ANY OPERATOR DROP ANY PROCEDURE DROP ANY SEQUENCE DROP ANY SNAPSHOT DROP ANY SYNONYM DROP ANY TABLE DROP ANY TRIGGER DROP ANY TYPE DROP ANY VIEW DROP PUBLIC SYNONYM EXECUTE ANY PROCEDURE INSERT ANY TABLE LOCK ANY TABLE SELECT ANY DICTIONARY SELECT ANY TABLE UNLIMITED TABLESPACE UPDATE ANY TABLE Object Privileges (in Security, ... sichtbar) EXECUTE ON SYS.DBMSOBJGWRAPPER EXECUTE ON SYS.DBMS_DEFER_INTERNAL_QUERY EXECUTE ON SYS.DBMS_DEFER_INTERNAL_SYS EXECUTE ON SYS.DBMS_DEFER_QUERY EXECUTE ON SYS.DBMS_DEFER_SYS EXECUTE ON SYS.DBMS_INTERNAL_REPCAT EXECUTE ON SYS.DBMS_OFFLINE_OG EXECUTE ON SYS.DBMS_OFFLINE_SNAPSHOT EXECUTE ON SYS.DBMS_RECTIFIER_DIFF EXECUTE ON SYS.DBMS_REPCAT EXECUTE ON SYS.DBMS_REPCAT_DECL EXECUTE ON SYS.DBMS_REPCAT_RGT EXECUTE ON SYS.DBMS_REPCAT_UTL EXECUTE ON SYS.DBMS_SNAPSHOT EXECUTE ON SYS.DBMS_SAAP_REPAPI SELECT ON SYS.DEFLOB SELECT ON SYSTEM.DEF$_LOB Consumer Groups Granted kein Eintrag Seite 14 von 31 Datenbanklinks erstellen Als nächsten müsse die beiden Datenbank für den Benutzer REPADMIN verbunden werden (die Verbindung via tnsnames.ora war nur der erste Schritt). Wiederum muss dies auf beiden Seiten vorgenommen werden. Wir beginnen mit T-JMU-1 und BAM. Auf jeder Seite brauchen wir zwei Links, einen öffentlichen und einen privaten (der REPADMIN gehört). Der öffentliche Link von BAM zu MOP: Man muss als SYS an BAM angemeldete sein, man wählt den Menüpunkt Distributed – Database Links aus Create und gibt den vollständigen Namen der remote DB (MOP.WORLD) ein. Als Benutzer wird Connected User gewählt und als Service Name aben MOP. Die Checkbox „public“ wird noch angekreuzt. Der private Link von BAM zu MOP: Dafür melden wir uns als REPADMIN an BAM an. Der Link erhält den gleichen Namen (MOP.WORLD), auch der Service ist identisch. Aber: public darf nicht gewählt werden und es wird ein Fixed User (REPADMIN mit Passwort) verwendet. Seite 15 von 31 Seite 16 von 31 Bei Erfolg sieht man dann einen Link unter Public und einen unter REPADMIN. Nun gehen wir zum Rechner ENTRUST und der Datenbank MOP und erzeugen dort Links auf T-JMU-1 mit seiner Datenbank BAM. Seite 17 von 31 Testen der Links Ich gehe zu T-JMU-1 (die DB MOP braucht nicht im Enterprise Manager eingebunden sein), öffne ein SQL *Plus Worksheet und melde mich an MOP an. Dann setze ich ein SELECT Statement an auf die Tabelle dual über den Link mop.world. Dass muss funktionieren. conn sys@mop/oracle as sysdba select * from [email protected] Ich melde mich an BAM als REPADMIN an und setze ein SELECT auf den Link zu MOP ab. conn repadmin@bam/oracle select * from [email protected] Diese Tests kann man analog auf der anderen Seite durchführen. Ich verwende die Tabelle DUAL, weil es sie immer und überall gibt. Auch eine andere Tabelle wäre natürlich möglich. Benutzer anlegen Das Replizieren geht am einfachsten, wenn es auf beiden Seiten (BAM bzw. MOP) den gleichen Benutzer gibt. Ich wähle hier den Benutzer TRAORE3. 3 Da wir nun schon einmal in Mali sind verwende ich diesen Namen, da er eben in Mali häufig vorkommt. Man denke nur an den Ex-Präsidenten Moussa Traoré oder an den berühmten Traoré Boubacar (Musiker) genannt Kar Kar und seinem wunderbaren Mali Blues. Seite 18 von 31 Also, zu T-JMU-1, als SYS bei BAM angemeldet, Security Users Create: Diese Rollen braucht er (wir geben ihm sehr wenig, es ist ja nur ein ganz normaler Anwender): Seite 19 von 31 Und dieses eine System-Recht braucht er: Voilà, der Benutzer ist fertig angelegt. Nun sollte der Benutzer natürlich auch zu replizierende Objekte haben. Wir halten es ganz einfach und wollen ihm dazu nur eine einzige Tabelle geben. Dieser erzeugen wir (auf beiden Seiten), indem wir uns als TRAORE anmelden (SQL *Plus Worksheet) und ein CREATE absetzen: conn traore/oracle create table repdata (myid number, field_a varchar2(100), field_b varchar2(100)) So, nun ab zum Rechner ENTRUST, als SYS bei MOP angemeldet, Security Users Create einen identischen Benutzer TRAORE anlegen. Erzeugen der Master-Gruppen Nun müssen wir uns für einen Rechner (bzw. DB) entscheiden, der wir den Vorrang geben. Das, was wir nun machen, kann auf den anderen Rechner nicht mehr verändert werden. Wir entscheiden uns für T-JMU-1 und die Datenbank BAM4. Also gehen wir zu T-JMU-1, binden BAM und MOP ein und melden uns an BAM als REPADMIN an. 4 Entsprechend der in Mali vorhanden französicher Tradition entscheiden auch wir uns für den Zentralismus, d.h. wir bleiben in Bamako und nicht in diesem Provinznest Mopti – die geschichtliche Bedeutung von Mopti hin oder her. Seite 20 von 31 Wir erzeugen eine neue Master Gruppe mit dem Namen REPGRP. Als Objekt geben wir die Tabelle von TRAORE hinzu. Man sieht hier übrigens, dass man nicht alles replizieren kann – z.B. keine Sequences! Nun sehen wir diese Dlg-Box: Seite 21 von 31 Der Grund dafür dürfte sein, dass wir bei der Erstellung der Tabelle keine Primary Key angegen habe (wir wählen MYID aus). Wenn wir das alles so hinzugefügt habe, sehen wir uns einmal unter Adminstration die Topologie an. Da sehen wir unsere zwei Rechner. Seite 22 von 31 Nun müssen wir unser Replikation noch aktivieren und mit einem Zeitplan versehen. Dazu gehen wir wieder zurück zur Mastergruppe, Objects und betätigen den Button Generate Replication Support (das Bild zeigt den Zustand nach erfolgreicher Ausführung). Wenn es hierbei zu einem Fehler kommt, dann hat der REPADMIN eventuell nicht die erforderlichen Rechte bzw. es hat was mit der zu replizierenden Tabelle (z.B. Unterschiede). Fortgeschrittene Anwender können auch die Tabelledefinition replizieren, d.h. die Tabelle auf der anderen Seite braucht nicht zu existieren sondern sie wird durch den Replikationsmechanismus erzeugt. Seite 23 von 31 Wenn es hierbei zu einem Fehler gekommen ist, gibt es einen nützlichen Button unter General. Unter View Administrative Request sieht man eine Art von Error – Log. Nach dem erfolgreichen letzten Schritt muss die Replikation auch noch gestartet werden bzw. eine gestartete Replikation kann angehalten werden. Dazu gibt es unter General den Button Submit Start / Stop Request. Seite 24 von 31 Wir haben noch eine Zeitplan für die Ausführung festzulegen bzw. die Default-Einstellungen anzupassen. Dazu gibt es mehrere Möglichkeiten. Eine ist unter Administration – Schedule zu finden. (Eine andere Möglichkeit besteht darin, den Zeitplan gleich bei der Erstellung des Objektes / Master Gruppe anzugeben. SQL und ORACLE Gurus können das auch via SQL machen.). Im unten stehenden Beispiel habe ich eine Minute eingegeben. Das ist natürlich ein unrealistisch kurzes Intervall aber für unsere Testzwecke genau richtig. Seite 25 von 31 Das ist aber erst die halbe Sache. Man muss auch bei der gegenüberliegenden Datenbank(en) dein Schedule konfigurieren bzw. einschalten. Ansonsten geht der Datentransfer nur in eine Richtung. Test der Datenübertragung Wir gehen in der Datenbank BAM, Schema TRAORE, Tabelle REPDATA und fügen eine Satz ein: (Apply nicht vergessen) Dann gehen wir zur Datenbank MOP, Schema TRAORE, Tabelle REPDATA und nach ca. einer Minute sehen wir das da: Seite 26 von 31 Weil es so viel Spaß macht und wir auch ein Erfolgserlebnis verspüren wollen, testen wir auch den den umgekehrten Weg – von MOP zu BAM. Sollten die Daten nur in eine Richtung übertragen werden, dann ist möglicherweise nur ein Schedule aktiviert (nur OK aber nicht Apply gedrückt?). In Prinzip ist aber die Datenübertragung in beiden Richtungen fertig konfiguriert. Wenn wir eine Satz in einer Tabelle löschen, dann wird er auch in der anderen Tabelle entfernt – die beiden Tabellen werden also immer auf den gleichen Stand gehalten.5 Replikationskonflikte Ich will ich einen Replikationskonflikt provozieren. Zuerst lösche ich einemal alle Einträge auf einer Seite (z.B. BAM) inder Tabelle REPDATA. Nach kurzer Zeit verschwinden auch die Einträge in der gegenüberliegenden Datenbank. Nun geht es los: Zuerst wird bei beiden Tabellen auf MYID ein UINIQUE Constraint gelegt. Dann auf beiden Seiten einen Satz mit der gleichen MYID eingefügen, schnell hintereinander Apply drücken und die Replikation abwarten. 5 Und in Mali würde man dazu vielleicht sagen: Bolo fila bè nyògòn ko ka jè (Bambara, eine wichtige Umgangssprache in Mali: „Zwei Hände waschen einander um rein zu werden“ eine Hand wäscht die andere.) Seite 27 von 31 Auch nach einiger Zeit tauchen die Daten nicht auf der gegenüberliegenden Seite auf – sondern in jeder DB steht nur der eigene Datensatz. Auf jeder Seite findet man unter Administration – Error die entsprechenden Error – Einträge. Seite 28 von 31 conn repadmin@bam/oracle select * from deferror Das liefert auch eine Fehlerbeschreibung: DEFERRED_TRAN_ID ORIGIN_TRAN_ID START_TIM ERROR_NUMBER ERROR_MSG ORIGIN_TRAN_DB CALLNO DESTINATION RECEIVER -----------------------------5.3.666 MOP.WORLD 6.14.663 0 BAM.WORLD 05-AUG-04 100 ORA-01403: no data found REPADMIN 10.5.640 MOP.WORLD 9.16.657 0 BAM.WORLD 05-AUG-04 100 ORA-01403: no data found REPADMIN 5.12.667 MOP.WORLD 3.13.639 0 BAM.WORLD 05-AUG-04 -1 ORA-00001: unique constraint (TRAORE.REPDATA_UK11091718022153) violated ORA-02063: preceding line from BAM Seite 29 von 31 REPADMIN 3 rows selected. Das kann man auch auf der anderen Seite machen, dort sieht man es umgekehrt: DEFERRED_TRAN_ID ORIGIN_TRAN_DB ORIGIN_TRAN_ID CALLNO DESTINATION START_TIM ERROR_NUMBER ERROR_MSG RECEIVER -----------------------------8.16.661 BAM.WORLD 6.3.653 0 MOP.WORLD 05-AUG-04 100 ORA-01403: no data found REPADMIN 5.5.685 BAM.WORLD 8.14.637 0 MOP.WORLD 05-AUG-04 100 ORA-01403: no data found REPADMIN 6.9.665 BAM.WORLD 1.21.648 0 MOP.WORLD 05-AUG-04 -1 ORA-00001: unique constraint (TRAORE.REPDATA_UK11091718071054) violated ORA-02063: preceding line from MOP REPADMIN 3 rows selected. Die Replikationsfehler stehen also in der Tabelle DEFERROR (dafür gibt es angeblich auch noch eine View, aber welche?) Vermischtes Wenn die Replikation überhaupt nicht funktionieren will, dann hat das vermutlich einen ganz schwerwiegenden Grund: Irgendwo tief drinnen im System ist ein Parameter falsch gesetzt oder es fehlen irgendwelche Rechte. Ohne tiefere Oracle Kenntnisse ist es sehr schwer, da etwas herauszufinden. Da hilft oft nur probieren (oder man gibt auf und lässt die Replikation bleiben – sie ruhe in Frieden6 – was aber für uns keine Option darstellt). Ein paar Tricks, abgeschaut bei der Vorführung (auch die lief nicht auf anhieb), welche vielleicht nützlich sein können: # select * from v$version DB Version feststellen 6 In Mali und anderen afrikanischen Ländern würde man da sagen: Die Erde möge ihr (gemeint ist die Replikation) leicht sein. Seite 30 von 31 # eventuelle sind die Tabellen minimal unterschiedlich (NULL erlaubt / nicht erlaubt, VARCHAR-Länge, ...) # Im alert_xxx.log File nachsehen (in E:\oracle\admin\BAM\bdump) # falls eventuell immer ein unerwünschte Postfix bei den Namen angehängt wird (etwa bei den Links): dann passt vermutlich GLOBAL_NAME nicht, in E:\oracle\ora92\network\admin\sqlnet.ora kann man das prüfen und einen eventuell störenden Eintrag auskommentieren, wie z.B. diesen da: NAMES.DEFAULT_DOMAIN = entrust.utimaco.at # angeblich darf distributed_transaction nicht aufgenommen werden (Eine Systemvariable, kein Hackerln geben. Auf beiden (!!!) Rechnern) # select * from global_name; globaler DB Name feststellen / überprüfen (z.B. BAM.WORLD) # alter database rename global_name to xxx.yyy Datenbanknamen ändern # was man nicht machen darf: auf einem Rechner eine Master-Gruppe anlegen und auch eine Namensgleiche Master-Gruppe auf den anderen Rechner erstellen. # desc traore.repdata Tabellenbeschreibung ermitteln # select * from v$instance wichtige DB Informationen # show user angemeldeter Benutzer # select * from dual Tests; dual gibt es immer und überall # spool xxxx.txt eine Log – Datei wird mitgeführt spool off Logging ausschalten Datei ist in E:\oracle\ora92\bin # select privilege from dba_sys_privs where grantee='REPADMIN' Analyse der System Privilegien # select * from user_objects welche User gibt es Seite 31 von 31