Oracle Streams : Paramètrer la réplication mono-directionelle d’une table
Si vous cherchez un moyen pour démarrer rapidement avec Oracle Streams, cet article et ceux qui suivront est pour vous ! Dans ce premier article, vous trouverez un exemple complet que vous pourrez mettre en oeuvre en moins de 30 minutes. C’est probablement la configuration la plus simple que vous trouverez : elle utilise une base de données, une table est répliquée dans un sens uniquement et vous utiliserez plusieurs raccourcis pour arriver à un résultat qui fonctionne sur Oracle 10g et 11g. Le fait de mettre en oeuvre une configuration complète d’Oracle Streams vous permettra de mettre le doigt sur une bonne partie des composants associés et vous mettra le pied à l’étrier, je vous le souhaite, pour des configurations plus riches. Alors surtout, laissez vos commentaires et vos idées pour les prochains articles…
Mais pourquoi un tel sujet ? D’abord, parce que j’ai eu la chance (ou la malchance) de travailler avec Streams sur de nombreux cas, parfois assez compliqués et sur des thèmes aussi variés que des migrations, la constitution d’environnements décisionnels ou d’architectures très distribuées. D’autre part, parce qu’Oracle a annoncé avant-hier le rachat de GoldenGate Software et que vous entendrez donc de plus en plus parler de BI temps réel, de rolling upgrades, y compris de vos applications, de très hautes disponibilité, de réplication hétérogène et d’une multitude d’autre sujets sur lesquels vous aurez sans doute l’opportunité de travailler avec Easyteam.Dans l’exemple qui suit, nous maintiendrons donc à jour une copié d’une table T1 située dans un schéma SOURCE dans une second schéma de la même base de données. Ce second schéma est nommé DESTINATION. Pour arriver à ce résultat, nous passerons par l’ensemble des étapes qui suivent:
- Construire un schéma et une table exemple
- Configurer les logs et le dictionnaire multi-versions de votre base de données
- Configurer l’administrateur et une file d’attente Streams
- Créer le process de capture et définir les règles associées
- Créer un process d’apply
- Transformer le SQL pour que les changements capturés sur le schéma
SOURCEsoient appliqués àDESTINATION - Instancier la table dans le schéma
DESTINATION - Démarrer les process de capture et d’apply
- Tester la réplication
- Arrêter et supprimer la configuration Oracle Streams
Note:
Cet article a été testé avec Oracle 11.1.0.7 et 10.2.0.4 Enterprise Edition sur Linux 32 bits.
Etape 1: Construire un schéma et une table exemple
Pour commencer, nous allons créer un schéma SOURCE et une table T1. Voici le script que vous pourrez lancer avec SQL*Plus ou SQL*Developer et qui permet d’effectuer ces opérations:
connect / as sysdba
create user source
identified by source
default tablespace users
temporary tablespace temp;
grant connect,resource to source;
connect source/source
create table t1(
id number primary key,
text varchar2(80));
insert into t1(id, text)
values (1,'Text 1');
insert into t1(id, text)
values (2,'Text 2');
commit;
Etape 2: Configurer les logs et le dictionnaire multi-versions de votre base de données
Les process de capture Oracle Streams utilisent le contenu des redologs et archivelogs pour construire un "Logical Change Records (LCR)", qui est un vecteur de changement encapsulé dans un type objet. Le LCR est ensuite propagé jusqu’à la destination grâce à des files d’attentes non-persistentes et qui résident en mémoire appelées "buffered queues". Une fois propagés, les LCR sont appliqués sur la base de données destination grace aux process d’apply qui les transforment en ordres SQL.
Comme vous le savez les redologs ne contiennent pas les ordres SQL mais des données binaires qui permettent aux process de "recover" de reconstruire les changements effectués sur la base de données à partir d’une sauvegarde. De plus, ces redologs ne contiennent pas, par défaut, les informations nécessaires pour appliquer les changements sur une autre base de données que la base de données d’origine. Voici certaines des conséquences de ces 2 points:
- Les fichiers redologs ne permettent pas de reconstituer le SQL qui a été exécuté sur la base de données. Par exemple, pour les ordres DML, les informations contenues dans ces logs sont les rowid et les vecteurs de changement avec les images avant et après pour chacune des lignes impactées. Ainsi, si un unique ordre UPDATE modifie les valeurs d’une colonne pour plusieurs lignes sur le système source, Streams NE répliquera PAS cet ordre. A la place, les process de capture vont générer un LCR par ligne modifiée sur la source. Pour le dire autrement, un UPDATE sur la base de données source peut générer plusieurs millions de LCR et donc d’ordres UPDATE sur la base de données destination.
- Les rowid sont utilisés pour identifier de manière unique les lignes modifiées et ainsi permettre le recover des archivelogs et des redologs. Toutefois, les rowid sont différents entre la base de données source et la base de données destination, même si la seconde base de données a été créée, au départ, à partir d’une copie physique de la base de données source. Pour identifier de manière unique les lignes modifiées il faut donc s’appuyer sur un identifiant de chaque ligne comme une clé unique ou une clé primaire. Pour ajouter ces informations aux LCR, il faut les ajouter aux redologs; vous utiliserez les informations complémentaires dans les redologs avec les "supplemental logs".
- Les schémas et les noms des objets modifiés ne sont pas stockés non plus dans les fichiers de redologs. A la place, l’information stockée est l’identifiant de l’objet associé. Ces identifiants sont stockés dans les LCRs et il faut donc une copie du dictionnaire de données sur la base de données destination pour transformer les LCRs en SQL sur la destination. La copie de ce dictionnaire est stocké dans le "Multi Version Data Dictionary (MVDD)". Il doit être capturé sur la base de données source et envoyé sur la base de données destination. C’est le cas, même si la source et la destination sont la même base de données puisque dans le cas d’une commande DROP par exemple, l’objet sera supprimé du dictionnaire d’origine lorsque le LCR correspondant est transformé en SQL, d’où l’importance du MVDD.
Pour l’ensemble des raisons ci-dessus, vous devez préparer la base de données source avant de mettre en place les process de capture. En particulier, cette base de données doit être en mode ARCHIVELOG. Suivant la manière dont vous préparerez les objets, vous pouvez également ajouter le "supplemental logging" pour toute la base de données ou vous l’activerez au niveau de chaque objet répliqué. Comme nous voulons simplifier la mise en oeuvre, nous allons l’activer au niveau de la base de données. Ci-dessous le script qui active le supplemental logging:
connect / as sysdba
alter database add supplemental log
data (primary key, unique index) columns;
select SUPPLEMENTAL_LOG_DATA_MIN,
SUPPLEMENTAL_LOG_DATA_PK,
SUPPLEMENTAL_LOG_DATA_UI
from gv$database;
SUPPLEME SUP SUP
-------- --- ---
IMPLICIT YES YES
Vous pouvez ensuite capturer le dictionaire de données sur la source et le pousser sur la destination par l’intermédiaire des redologs grace à la procédure DBMS_CAPTURE_ADM.BUILD:
connect / as sysdba
var first_scn number;
set serveroutput on
DECLARE
scn NUMBER;
BEGIN
DBMS_CAPTURE_ADM.BUILD(
first_scn => scn);
DBMS_OUTPUT.PUT_LINE('First SCN Value = ' || scn);
:first_scn := scn;
END;
/
First SCN Value = 49042254018
Il est important que noter le SCN retourné par la procédure DBMS_CAPTURE_ADM.BUILD. Vous utiliserez ce SCN comme "first SCN" du process de capture de sorte que les meta-données de la source puisse être poussé dans le MVDD de la destination. Il faut noter que seul les informations minimum pour démarrer Streams sont enregistrées dans le MVDD. Il faut également ajouter les méta-données pour chacun des objets que vous voulez répliquer un objet. Pour cela, vous utiliserez les procédures prepare_xxxx_instantiation du package dbms_capture_adm comme ci-dessous :
exec dbms_capture_adm.prepare_table_instantiation(-
table_name=>'source.t1');
Note:
dbms_capture_adm.prepare_table_instantiationpermet également de valider qu’il n’y a pas de modifications en cours sur la tableSOURCE.T1. Un verrou partagé est donc posé sur la table ce qui peut impacter significativement votre application au moment de l’utilisation de la procédure.
Etape 3: Configurer l’administrateur et une file d’attente Streams
Pour utiliser Streams, vous devez créer un administrateur Streams dans toutes les bases de données impliquées dans la réplication et tous les process de capture, propagation et apply associés; le script qui suit crée cet administrateur. Il est recommandé de créer un tablespace séparé pour stocker les files d’attente car l’utilisation d’une file d’attente dans un tablespace empêche la procédure de tablespace "point in time recovery". Ensuite, créez un utilisateur STRMADMIN, affectez-lui les privilèges, les roles ainsi que les files d’attentes qui permettront aux process de capture et d’apply de partager les LCR:
connect / as sysdba
CREATE TABLESPACE streams_tbs DATAFILE
'/u01/app/oracle/oradata/BLACK/streams_tbs.dbf'
size 25M AUTOEXTEND ON MAXSIZE 256M;
CREATE USER strmadmin IDENTIFIED BY strmadmin
DEFAULT TABLESPACE streams_tbs
QUOTA UNLIMITED ON streams_tbs;
grant dba to strmadmin;
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_table => 'strmadmin.streams_queue_table',
queue_name => 'strmadmin.streams_queue');
END;
/
Etape 4: Créer le process de capture et définir les règles associées
Une fois les bases de données source et destination paramétrées, vous pouvez créer un process de capture et ajouter la table source à ce process. Le paramètre first_scn doit correspondre à la valeur retournée par la procédure DBMS_CAPTURE_ADM.BUILD; le paramètre source_database doit correspondre au paramètre db_unique_name de la base de données source ou db_name, si db_unique_name n’est pas utilisé; voici le script qui créé le process de capture:
accept first_scn prompt "Enter the First SCN of the Capture: "
connect strmadmin/strmadmin
Enter the First SCN of the Capture: 49042254018
var first_scn number;
exec :first_scn:=&&first_scn
BEGIN
DBMS_CAPTURE_ADM.CREATE_CAPTURE(
queue_name => 'strmadmin.streams_queue',
capture_name => 'streams_capture',
rule_set_name => NULL,
source_database => 'BLACK',
use_database_link => false,
first_scn => :first_scn,
logfile_assignment => 'implicit');
END;
/
col capture_name format a15
col queue_name format a13
col first_scn format 999999999999
col start_scn format 999999999999
col rule_set_name format a11
select capture_name,
queue_name,
first_scn,
start_scn,
rule_set_name
from dba_capture;
CAPTURE_NAME QUEUE_NAME FIRST_SCN START_SCN RULE_SET_N
--------------- ------------- ------------- ------------- ----------
STREAMS_CAPTURE STREAMS_QUEUE 49042254018 49042254018
BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_RULES(
table_name => 'source.t1',
streams_type => 'capture',
streams_name => 'streams_capture',
queue_name => 'strmadmin.streams_queue',
include_dml => true,
include_ddl => false,
include_tagged_lcr => true,
source_database => 'BLACK',
inclusion_rule => true);
END;
/
set lines 120
col streams_name format a16
col streams_type format a9
col table_owner format a10
col table_name format a15
col rule_type format a8
col rule_name format a15
select rule_owner,
STREAMS_NAME,
STREAMS_TYPE,
TABLE_OWNER,
TABLE_NAME,
RULE_TYPE,
RULE_NAME
from DBA_STREAMS_TABLE_RULES;
STREAMS_NAME STREAMS_T TABLE_OWNE TABLE_NAME RULE_TYP RULE_NAME
--------------- --------- ---------- ---------- -------- ---------
STREAMS_CAPTURE CAPTURE SOURCE T1 DML T16
Etape 5: Créer un process d’apply
Vous devez ensuite créer un process d’apply qui va souscrire à la file d’attente utilisée par le process de capture et appliquer les changements de la table SOURCE.T1:
connect strmadmin/strmadmin
BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_RULES(
table_name => 'source.t1',
streams_type => 'apply',
streams_name => 'streams_apply',
queue_name => 'strmadmin.streams_queue',
include_dml => true,
include_ddl => false,
include_tagged_lcr => true,
source_database => 'BLACK',
inclusion_rule => true);
END;
/
col apply_name format a13
col queue_name format a13
col rule_set_name format a11
select apply_name,
queue_name,
rule_set_name,
status,
message_delivery_mode
from dba_apply;
APPLY_NAME QUEUE_NAME RULE_SET_NA STATUS MESSAGE_DE
------------- ------------- ----------- -------- ----------
STREAMS_APPLY STREAMS_QUEUE RULESET$_10 DISABLED CAPTURED
Etape 6: Transformer le SQL pour que les changements capturés sur le schéma SOURCE soient appliqués à DESTINATION
Dans cet exemple, les bases de données source et destination sont la même base de données; les tables source et destination ne peuvent donc pas avoir le même nom et le même schéma. Vous allez ajouter une règle de transformation pour renommer le nom du schéma de l’objet que vous répliquez et trasnformer SOURCE en DESTINATION. Le script ci-dessous ajoute une régle de transformation au process d’apply:
connect strmadmin/strmadmin
col rule_name format a20 new_value rulename
select rule_owner,
STREAMS_NAME,
STREAMS_TYPE,
TABLE_OWNER,
TABLE_NAME,
RULE_TYPE,
RULE_NAME
from DBA_STREAMS_TABLE_RULES
where streams_name='STREAMS_APPLY'
and streams_type='APPLY'
and rule_type='DML';
prompt &&rulename
T16
begin
dbms_streams_adm.rename_schema(
rule_name => '&&rulename' ,
from_schema_name => 'SOURCE',
to_schema_name => 'DESTINATION',
step_number => 0,
operation => 'add');
end;
/
col rule_name format A6
col from_schema_name format a6
col to_schema_name format a12
select rule_name,
transform_type,
from_schema_name,
to_schema_name,
declarative_type
from dba_streams_transformations;
RULE_N TRANSFORM_TYPE FROM_S TO_SCHEMA_NA DECLARATIVE_T
------ -------------------------- ------ ------------ -------------
T16 DECLARATIVE TRANSFORMATION SOURCE DESTINATION RENAME SCHEMA
Etape 7: Instancier la table dans le schéma DESTINATION
Streams est désormais configuré. Avant de démarrer les différents process, vous devez instancier la table dans le schéma DESTINATION et stocker le SCN d’instanciation de sorte que le processus d’apply connaisse avec précision les changements appliqués sur cette table répliquée. Pour instancier la table, vous pouvez utiliser la méthode de votre choix et notamment RMAN, Datapump, exp ou Flashback query. Dans l’exemple qui suit, nous allons utiliser une flashback query. Comme la table destination réside dans la même base que la source, nous n’avons pas besoin de database link:
connect / as sysdba
create user destination
identified by destination
default tablespace users
temporary tablespace temp;
grant connect,resource to destination;
create table destination.t1(
id number primary key,
text varchar2(80));
col apply_scn format 999999999999 new_value instantiation_scn
select dbms_flashback.get_system_change_number apply_scn
from dual;
APPLY_SCN
-----------
49042261443
prompt Enter the Instantiation: &&instantiation_scn
Enter the Instantiation: 49042261443
insert into destination.t1
(select * from source.t1 as of scn &&instantiation_scn);
commit;
Une fois la table instanciée, utilisez la procédure dbms_apply_adm.set_table_instantiation_scn pour enregistrer le SCN d’instanciation et que le process d’apply n’applique les changements qu’à partir de ce point:
begin
dbms_apply_adm.set_table_instantiation_scn(
source_object_name => 'source.t1',
source_database_name => 'BLACK',
instantiation_scn => &&instantiation_scn);
end;
/
col SOURCE_DATABASE format a6
col OBJECT format a10
col INSTANTIATION_SCN format 999999999999
select source_database,
source_object_owner||'.'||source_object_name object,
instantiation_scn
from dba_apply_instantiated_objects;
SOURCE OBJECT INSTANTIATION_SCN
------ ---------- -----------------
BLACK SOURCE.T1 49042261443
Etape 8: Démarrer les process de capture et d’apply
Vous pouvez démarrer les process de capture et d’apply :
exec dbms_capture_adm.start_capture('streams_capture');
exec dbms_apply_adm.start_apply('streams_apply');
Etape 9: Tester la réplication
Pour tester la réplication, mettez à jour la table source et validez que les changements sont propagés sur la table destination. Voici un test simple qui montre que la réplication fonctionne comme il doit:
insert into source.t1(id, text)
values (3,'Text 3');
commit;
pause
col id format 99
col text format a6
select id,
text
from destination.t1;
ID TEXT
--- ------
1 Text 1
2 Text 2
3 Text 3
Déboguer la configuration Streams est au delà de ce premier article. Cependant, vous pouvez interroger les vues du dictionnaire des données pour connaître la configuration Streams et son statut.
Etape 10: Arrêter et supprimer la configuration Oracle Streams
Dans cette dernière étape, vous pouvez nettoyer l’environnement et le laisser tel qu’il était lorsque vous avez démarré. Pour ce faire, arrêtez et supprimez les process de capture et d’apply. Supprimez la file d’attente, l’administrateur Streams et le tablespace associé; supprimez également les 2 schémas et désactivez le "supplemental logging":
exec dbms_capture_adm.stop_capture('streams_capture');
exec dbms_apply_adm.stop_apply('streams_apply');
exec dbms_capture_adm.drop_capture('streams_capture',true);
exec dbms_apply_adm.drop_apply('streams_apply',true);
exec dbms_streams_adm.remove_queue('strmadmin.streams_queue',true,true);
drop user strmadmin cascade;
drop tablespace streams_tbs
including contents and datafiles;
drop user destination cascade;
drop user source cascade;
begin
for i in (select source_schema name
from dba_apply_instantiated_schemas
where source_schema in ('SOURCE','DESTINATION'))
loop
dbms_apply_adm.set_schema_instantiation_scn(
source_schema_name => i.name,
source_database_name => 'BLACK',
instantiation_scn => null);
end loop;
for i in (select source_object_owner||'.'||
source_object_name name
from dba_apply_instantiated_objects
where source_object_owner in ('SOURCE','DESTINATION'))
loop
dbms_apply_adm.set_table_instantiation_scn(
source_object_name => i.name,
source_database_name => 'BLACK',
instantiation_scn => null);
end loop;
end;
/
alter database drop supplemental log
data (primary key, unique index) columns;
select SUPPLEMENTAL_LOG_DATA_MIN,
SUPPLEMENTAL_LOG_DATA_PK,
SUPPLEMENTAL_LOG_DATA_UI
from gv$database;
SUPPLEME SUP SUP
-------- --- ---
NO NO NO





La procédure fonctionne bien en 10.2.0.4 mais juste un détail, la colonne ‘message_delivery_mode’ n’existe pas dans la vue dba_apply.
Merci pour cette initiation.
Olivier
Bonjour
La démarche est franchement géniale.
Un code claire et bien commenté.
Cepandant juste une question.
Le code se déroule étape par étape sans aucune err ora mais au final Rien; les modif de source reste en source.
Alors ou chercher ?
D’avance merci
C’est vraiment génant!
1) Quel est le statut de la capture
* qu’affiche la vue v$streams_capture; le process de capture peut mettre plusieurs minutes pour démarrer !
* qu’affiche la colonne status dans dba_capture ?
2) Y a-t-il une erreur dans dba_apply_error ? Quel est le status dans dba_apply
3) Je vous conseille pour en savoir plus (1) soit d’utiliser les scripts de Healthcheck de Streams ou maintenant le RDA comme décrit dans la note 273674.1 , soit (2) d’utiliser la fonctionnalité de tracking des messages comme décrit dans mon blog en anglais sur "Streams Tracking Streams Changes with V$STREAMS_MESSAGE_TRACKING"
N’hésitez pas à entrer en contact sur Twitter @Easyblogs ou @arkzoyd.
En réponse a vos questions
vue v$streams_capture
SID SERIAL#
106 510
CAPTURE# CAPTURE_NAME
1 STREAMS_CAPTURE
LOGMINER_ID STARTUP_TIME STATE
2 09.12.09 WAITING FOR DICTIONARY REDO: SCN 5119568
colonne status dans dba_capture =ENABLED
dba_apply_error = 0 Rows
le status dans dba_apply
STATUS
——–
ENABLED
ENABLED
ENABLED
3 rows selected
En espérant pouvoir y parvenir et en vous remerciant par avance
Hello guys,
I do confirm. It’s worked pretty well for me. Straight from the example, I’ve been able to configure a replication in less than 30 minutes.
Thank you so much for this tutorial. It rates 5 stars for me.
Cheers
Bonjour,
La procedure fonctionne parfaitement.
Merci pour l’explication claire et précise qui m’a permis de découvrir le processus de réplication.
Cependant, je voudrais savoir comment mettre en place la réplication en partant de la procédure si le user DESTINATION est sur une autre instance ?
Merci de votre réponse.
Bonjour,
merci pour cette article qui va beaucoup m’aider.
Concernant l’étape 7: j’ai ma base source qui est sur le serveur S1 et ma base destination qui est sur un serveur S2 que dois je utiliser comme méthode?
merci d’avance
Bonjour,
Pour l’étape 7 j’ai essayé datapump avec un dblink.
Malheureusement lorsque je fais:
$ impdp \"/as sysdba\" schemas=source \ remap_schema=source:mysource \ nologifle=y network_link=source_dbl. (mon dblink est crée sur ma base destination) j’ai ce message d’erreur : ORA-39001: valeur d’argument non valide
ORA-39169: La version locale de 10.2.0.1.0 ne peut pas fonctionner avec la version distante de 11.2.0.1.0.
est ce que le problème sera pareil pour les autres méthodes?
merci d’avance pour toutes informations
chris
Regarde : "Export/Import DataPump Parameter VERSION – Compatibility of Data Pump Between Different Oracle Versions [ID 553337.1]", la section "8.9. ORA-39022 (Database version xx.yy.zz is not supported).". C’est un des cas non supporté. En revanche c’est possible d’importer depuis la 11.2 des données de la 10.2.
Dans ton cas, exporte les données de la 11g avec le paramètre VERSION puis importe dans la 10g avec Datapump et mais sans le DBLink. Mais tu le sais probablement déjà.
Bonjour, merci pour votre réponse.
enfaite je souhaite faire une synchro de ma base de prod qui est sur oracle 11g vers ma base de dev construite mais plus à jour qui est sur oracle 10g. pour cela streams est parfait. Au vu de la procédure que vous décrivez il n’y à, je crois ,que la partie 7 qui serait différent car je dois utiliser un dblink. j’ai voulu tester datapump mais pour l’import cela fonctionne pas donc j’ai essayé d’utiliser expdp de ma base de données de prod vers la dev mais la aussi cela ne fonctionne pas,j’ai des erreurs.
Donc je me demandais si je peux utiliser flashback querie avec un dblink et comment le configurer?
j’ai vu que dans la partie 4 avec la procédure DBMS_CAPTURE_ADM.CREATE_CAPTURE on peut spécifie qu’on utilise un dblink mais comment lui dire quel dblink utiliser?
merci d’avance pour vos informations.
chris
Bonjour,
1) L’export datapump d’une base 11.2 vers une base 10.2 est censé fonctionner si tu utilises correctement le paramètre version ; ci-dessous mon test :
- Export d’une base 11.2 :
- Import dans une base 10.2 :
2- Flashback query est également une solution; il faut se connecter dans la base de dev et faire :
insert into T (select * from T@PROD) après avoir créé un DB Link Prod
3- Le DB Link dans DBMS_CAPTURE_ADM.CREATE_CAPTURE permet de générer les informations dans la base source en cas de downstream capture. Ce n’est possible dans ton cas car downstream capture n’est pas supporté de 11g vers 10g; seulement dans l’autre sens.
Cordialement
Re, merci pour votre réponse.
voila mon expdp: expdp \" / as sysdba \" tables=ma table network_link=dbldev version=10.20.1.0
et voici les erreurs (que je ne comprends pas):
Connected to: Oracle Database 11g Release 11.2.0.1.0 – 64bit Production
ORA-39006: internal error
ORA-39065: unexpected master process exception in DISPATCH
ORA-04052: error occurred when looking up remote object SYS.KUPM$MCP@DBLDEV
ORA-00604: error occurred at recursive SQL level 3
ORA-06544: PL/SQL: internal error, arguments: [55916], [], [], [], [], [], [], []
ORA-06553: PLS-801: internal error [55916]
ORA-02063: preceding 2 lines from DBLDEV
ORA-39097: Data Pump job encountered unexpected error -4052
j’ai testé mon dblink et il fonctionne.
chris
Par rapport à votre réponse le mieux serai de faire ceci:
"2- Flashback query est également une solution; il faut se connecter dans la base de dev et faire :
insert into T (select * from T@PROD) après avoir créé un DB Link Prod".
Mais j’ai une cinquantaine de table importante à synchroniser donc je vais devoir faire insert into … pour les 50!?
C’est de nouveau moi!
j’ai fait comme dans l’article pour l’étape 7 seulement j’ai un souci. j’ai crée l’utilisateur destination, la table t1 ensuite je récupère le scn, je fais le prompt et pour fini l’insertion:
insert into destination.t1(select * from source.t1@link as of scn 29338815059);
mais j’ai une erreur: ERREUR à la ligne 1 :
ORA-01031: privilèges insuffisants
ORA-02063: précédant line de LINK
la petite * se situe sous le 2 du scn. pourtant je suis connecté en tant que sysdba.
est ce que j’ai loupé quelque chose?!
merci d’avance.
1- La note que j’ai cité auparavant indique que l’import 11.2 via un DB Link depuis 10.2 nécessite 10.2.0.3+
2- Le test case que tu réalises fonctionne bien dans mon cas :
col owner format a6 col user format a6 col db_link format a6 trunc col username format a6 col value format a10 select user, owner, db_link, username, x.value from all_db_links, v$parameter x where x.name='compatible'; USER OWNER DB_LIN USERNA VALUE ------ ------ ------ ------ ---------- SYSTEM SYSTEM BLACK. SYSTEM 10.2.0.1.0 col scn format 99999999 new_value scn col value format a10 select dbms_flashback.GET_SYSTEM_CHANGE_NUMBER@black scn, b.value from v$parameter@black b where b.name='compatible'; SCN VALUE --------- ---------- 11021724 11.2.0.0.0 prompt &&scn 11021724 drop table arkzoyd purge; create table arkzoyd as (select * from X@black as of scn &&scn); Table created. drop table arkzoyd purge;Bonjour,
merci enfaite c’est moi qui écrit que des bêtises, j’utilisai pas le bon dblink donc cela n’allait jamais marcher.
une dernière question après je pense que tout sera ok:
pr l’etape 6 ma base de dev et de prod sont pareil a tout point de vu c’est a dire que ma base de prod (pour exemple) s’appelle source et ma base de dev aussi. que puis je écris à ce niveau la:
from_schema_name=
to_schema_name=
merci d’avance.
Si source=destination, pas la peine d’appeler la règle de transformation créée par dbms_streams_adm.rename_schema. Il suffit d’enlever cet appel.
Bonjour,
merci beaucoup pour votre aide.
bonne fêtes de fin d’année.
chris
Bonjour et bonne année, c’est de nouveau moi.
j’ai un petit souci avec ceci:
exec DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(-
> table_name=>’bdd.maison’);
j’obtiens cette erreur:
ERROR at line 1:
ORA-00439: feature NOT enabled: Streams Capture
ORA-06512: at "SYS.DBMS_CAPTURE_ADM_INTERNAL", line 336
ORA-06512: at "SYS.DBMS_CAPTURE_ADM", line 434
ORA-06512: at line 1
D’ou peut provenir mon probléme?
merci d’avance
chris
Il faut être en version Enterprise Edition, pas en Standard Edition ni en SE1
voila ma version d’oracle:
BANNER
——————————————————————————–
Oracle Database 11g Release 11.2.0.1.0 – 64bit Production
PL/SQL Release 11.2.0.1.0 – Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 – Production
NLSRTL Version 11.2.0.1.0 – Production
comment savoir si c’est entreprise ou standard
C’est une version Standard ou Standard One. En EE, c’est marqué dans la banner ou dans v$version:
Ce qui signifie que je ne peux pas utiliser streams?!!
C’est plus subtil que ça : on ne peut pas utiliser la capture asynchrone de Streams sur une SE/SE1 mais on peut appliquer des données capturées en asynchrone sur une EE ou utiliser la capture synchrone (cf mon article d’il y a quelques années http://wedostreams.blogspot.com/2009/01/streams-synchronous-capture-101.html quand j’y connaissais encore quelque-chose à Oracle).
On pourrait discuter de la pertinence d’utiliser Streams de toute façon… L’avenir de la réplication chez Oracle c’est de toute façon GoldenGate (regarde le Statement of Direction de Streams). GG ne souffre pas des mêmes limitations ; juste de limitations différentes.
ok. j’ai lu ton article. donc en faisant comme tu le décris la ca devrai mieux fonctionner. je vais tester cela.
ce qui me semble bizarre c’est que ça:
DBMS_CAPTURE_ADM.BUILD( first_scn => scn);
DBMS_OUTPUT.PUT_LINE(‘First SCN Value = ‘ || scn);
ca a fonctionné
ce qui me semble bizarre c’est que ça:
DBMS_CAPTURE_ADM.BUILD( first_scn => scn);
DBMS_OUTPUT.PUT_LINE(‘First SCN Value = ‘ || scn);
ca a fonctionné.
je sais pas si ca a interet mais bon
j’ai trouve une version en français de ton article http://blog.arkzoyd.com/2008/07/nouveaut-streams-11g-la-capture.html ce qui est mieux pour moi. bref.
j’ai suivi dans l’ordre les étapes et je me suis pas fait jeter lorsque j’écrivais les lignes donc je me disais que c’était bon signe.
malheureusement je tombe sur cette erreur lorsque je souhaite insérer:
ORA-26694: error while enqueueing into queue STRMADMIN.STREAMS_QUEUE ORA-24033: no recipients for message in
pourtant j’ai vraiment suivi une a une les étapes.
Bonjour, j’ai trouvé pourquoi j’avais cette erreur.
A présent tout fonctionne.
toutefois quand je teste si streams fonctionne donc en créant une entre dans demo.t1 cela la créer bien dans copy.t1 donc jusqu’à la c’est parfait mais au final quand je fais select * from copy.t1 je n’ai que cette ligne et pas les 2 précédente! l’instanciation (etape7) n’a pas l’air de s’effectuer.
Bon la synchro entre demo et copy fonctionne. j’ai toute les lignes. apparemment l’erreur que j’avais venait de ceci insert into.. (select…). Sans les parenthèses toutes les lignes existantes sont crée.
A présent je souhaite faire pareil entre ma base de prod et ma base de dev qui sont distantes.
mais quelque chose m’échappe a quel moment je spécifie a ma base de prod que c’est vers ma base de dev qu’il faut appliquer les modifications?!
après pour les différentes étapes est ce bien cela?:
etape 3 Créer l’administrateur Oracle Streams sur les 2 bases
Etape 4 : Créer le process d’apply sur la base de prod
Etape 6 : Créer le process de capture sur la base de prod
Etape 7 : Instancier la table sur la base de dev et cette partie dbms_apply_adm.set_table_instantiation_scn sur la base de prod
Etape 8 : Démarrer un process d’apply sur la base de prod
Etape 9 : Tester Streams sur la base de prod
merci d’avance.
dans le cas ou la réplication est entre deux base distant qu’est ce qu’il faut ajouter à ce code pour qu’elle marche??