réplication Oracle et traitement de masse ...

réplication Oracle et traitement de masse ... - SQL/NoSQL - Programmation

Marsh Posté le 12-12-2005 à 16:10:05    

Bonjour,
J'ai une base source et une base répliquée (en Oracle 9i toutes les deux); il a été décidé récemment qu'une purge allait avoir lieu dans la base source, sur les tables d'archive (environ 50M de lignes par table, soit 50% des tables).
J'aimerais savoir s'il existe une procedure rapide pour répercuter ces modifications dans ma base répliquée.
 
Merci d'avance,
Bell !

Reply

Marsh Posté le 12-12-2005 à 16:10:05   

Reply

Marsh Posté le 12-12-2005 à 16:20:45    

Salut Déesse du Présent :love: (sans le S normalement... on va dire que c'est pour "sama" )
 
Alors...
 
Normalement, dans Oracle, il doit y avoir un moyen de gérer la réplication de bases en automatique.
 
Sinon, il reste la solution du "annule et remplace" avec extract au format SQL Loader.

Reply

Marsh Posté le 12-12-2005 à 16:28:37    

Le probleme c'est que faire un "bête" refresh (fast ou complete) n'est pas envisageable (beaucoup trop long)...
 

Reply

Marsh Posté le 12-12-2005 à 16:31:15    

pourquoi ne pas faire la purge et appliquer un refresh COMPLETE ? Normalement ça devrait être rapide suite à la purge non ?

Reply

Marsh Posté le 12-12-2005 à 16:35:46    

Un refresh complete sur 50 millions de lignes, c'est trop long.
N'y a t il pas une procedure du genre (deco des journaux, purge base source, purge base repliquée, reco des journaux....) ?

Reply

Marsh Posté le 12-12-2005 à 17:20:50    

sql loader, c'est ce qu'il fait tout seul comme un grand.


Message édité par Arjuna le 12-12-2005 à 17:21:04
Reply

Marsh Posté le 12-12-2005 à 17:44:00    

Non SQL Loader il fait (deco des journaux, purge base source, reco des journaux....) ? La meme chose qu'a la main... et donc trop long :'(....
 

Reply

Marsh Posté le 12-12-2005 à 17:45:24    

:??:
 
comment ça "c'est trop long" ?

Reply

Marsh Posté le 12-12-2005 à 17:46:11    

je vois pas comment tu veux faire plus rapide que de l'import raw... hors c'est ce que fait ce dernier (avec juste une vérification des types)

Reply

Marsh Posté le 12-12-2005 à 18:00:36    

Je ne vois moi non plus pas de solution plus rapide (50 millions de lignes en refresh complete, ca me prend aujourd'hui 25 minutes ... Papa noel, apporte moi un nouveau serveur stp ....) si j'incorpore la destruction partielle de ma base a cause de la suppression du snapshot, j'en prends pour 1 heure... Bien sur, comparé à une refresh fast avec un journal de 50 millions de lignes, c'est mieux (c'est surtout mes amis de la base source qui sont heureux ....). C'etait juste pour savoir si quelqu'un avait trouver une astuce plus rapide.... (je sais pas pourquoi, je suis presque certaine que ca existe...)
 
Bell !

Reply

Marsh Posté le 12-12-2005 à 18:00:36   

Reply

Marsh Posté le 12-12-2005 à 19:03:22    

En fait, ta base destination, elle contient quoi ?
 
Comment se fait-il que tu as d'un coup 50 millions de lignes à synchroniser ?

Reply

Marsh Posté le 13-12-2005 à 09:45:03    

Bon je reprends, j'ai l'impression de ne pas avoir été très claire....
J'ai une table de 100 M de lignes dans une base source, je dois purger 50 M de lignes... Aujourd'hui la réplication se fait en differentiel (un refresh fast) , ce qui est inimaginable dans mon cas, car un journal avec autant de lignes plante les perfs de la base source. Je vais donc sans doute recreer cette réplication (soit 50M de lignes)... En somme dans tous les cas, c'est un travail très lourd, et je me disais qu'il existait sans doute une solution pour faire le travail sur les 2 bases et reconnecter les journaux ensuite (ce qui serait fantastique!!)...


Message édité par belldandys le 13-12-2005 à 09:59:48
Reply

Marsh Posté le 13-12-2005 à 10:43:02    

Bon pour se distraire en attendant, voila un petit jeu:
"J'ai une table dans laquelle ctr_id représente un identifiant de contrat, qte la quantité du produit restante sur ce contrat et datesys la date d'enregistrement. Je souhaite avoir pour chaque contrat les lignes pour lesquelles qte=0 ou s'il n'en existe aucune la dernière ligne (selon datesys)... Sous Oracle (9i pour moi), quelle est la meilleure requete ?
 
Exemple de table :
ctr_id     qte         datesys
1           0           18/07/2005
1           976        23/07/2005
1           194        16/08/2005
2           812        01/08/2005
2           59         23/08/2005
2           52         01/09/2005
3           709        08/08/2005
3           0           13/08/2005
3           0           16/08/2005
 
le résultat attendu :
ctr_id     qte        datesys
1           0           18/07/2005
2           52          01/09/2005
3           0           13/08/2005
3           0           16/08/2005
 
Bisous doux,  
Bell !


Message édité par belldandys le 13-12-2005 à 10:45:47
Reply

Marsh Posté le 13-12-2005 à 14:52:19    

je trouvais plus ton truc :)
 
bon, à j'ai rien à foutre pour les 10 prochaines minutes...
 
alors...
=> Si une ligne = 0 alors tu veux la liste des dates associées
=> Si pas 0, alors tu veux le min et la date associée
si on a deux fois le même min ? on va dire à nouveau que tu veux la liste
 
DONC, après simplification :
 
Tu veux la liste des datesys où qte est minimum pour un ctr_id donné. y'a plus d'histoire de 0 qui tiens :)

Reply

Marsh Posté le 13-12-2005 à 15:00:41    

hmmmm... pas une bonne idée de tester ça dans l'historique des commandes... y'a un peu trop de lignes, ça ramme :D

Reply

Marsh Posté le 13-12-2005 à 15:04:03    

Nan, c'est pas bien, j'ai mis un exemple pourtant ...
Je recopie donc, normalement l'exemple ne laisse aucun doute... :
 
"Je souhaite avoir pour chaque contrat les lignes pour lesquelles qte=0 ou s'il n'en existe aucune, la dernière ligne (selon datesys)... "

Reply

Marsh Posté le 13-12-2005 à 15:06:00    

J'ai du bugger quelquepart :D
 


The following error has occurred:
 
ORA-01652: impossible d'étendre le segment temporaire de 128 dans l'espace table TMPGNX


:sol:


Message édité par Arjuna le 13-12-2005 à 15:06:21
Reply

Marsh Posté le 13-12-2005 à 15:07:34    

belldandys a écrit :

Nan, c'est pas bien, j'ai mis un exemple pourtant ...
Je recopie donc, normalement l'exemple ne laisse aucun doute... :
 
"Je souhaite avoir pour chaque contrat les lignes pour lesquelles qte=0 ou s'il n'en existe aucune, la dernière ligne (selon datesys)... "


ok pour la dernière ligne si <> 0
l'exemple n'était pas explicite, ça correspondait aussi à la plus petite valeur ;)

Reply

Marsh Posté le 13-12-2005 à 15:12:11    

C'est pour ca qui y a un enoncé .. :p
ra la la, les hommes, ca ecoute jamais rien ... :)

Reply

Marsh Posté le 13-12-2005 à 15:16:35    


select codpro, c01, sigdep
from dsk
where dsk.codsoc = 2
and (
 (c01 = 0)  
 or
 (not exists (select null from dsk dsk2 where dsk2.codsoc = dsk.codsoc and dsk2.codpro = dsk.codpro and dsk2.c01 = 0 and dsk2.sigdep in ('DPT', 'DPT1'))
 and dsk.sigdep = (select max(sigdep) from dsk dsk2 where dsk2.codsoc = dsk.codsoc and dsk2.codpro = dsk.codpro and dsk2.sigdep in ('DPT', 'DPT1')))
 )
and dsk.sigdep in ('DPT', 'DPT1')


 
Wouala.
 
C'est pas du tout les mêmes donnés, mais je fais le même traîtement :
 
-> Je rammène la liste des dépôt parmis DPT et DPT1 où j'ai 0 en stock pour chaque produit suivit en stock de ma base.
-> Si aucun stock n'est à 0, je rammène me MAX() de mes dépot pour mon produit (y'a pas de date dans mes dépôts alors on fait avec les moyens du bords :D)

Reply

Marsh Posté le 13-12-2005 à 15:18:35    

belldandys a écrit :

C'est pour ca qui y a un enoncé .. :p
ra la la, les hommes, ca ecoute jamais rien ... :)


bah c pas ça, c'est surtout que je suis tout naze et que j'ai un gros problème là, et je ne peux pas le résoudre...
 
le client est radin.
 
pour ça, il a pris la version la moins chère de l'ERP.
 
et y'a un truc qui marche pas.
 
en creusant la doc, on s'apperçoit que c'est une limiation de la version "pas chère" de l'ERP.
 
et ma société s'est engagée en TMA pour résoudre ce problème... sans savoir que c'était pas pris en charge par l'ERP...
 
du coup là je suis comme un con, je sais pas quoi faire.
 
donc j'ai pas la tête à lire des énnoncés ;)

Reply

Marsh Posté le 13-12-2005 à 15:19:52    

ps: malgré la tronche de ma requête, elle est très rapide (bon, ok, la table n'est pas très grosse)
 
Oralce 8i

Reply

Marsh Posté le 13-12-2005 à 15:24:10    

ma requete est beaucoup mieux :) (c'est cool tu pourras l'utiliser après)... je vous laisse chercher encore un peu....
par mieux j'entends:
- plus performante
- plus claire

Reply

Marsh Posté le 13-12-2005 à 15:26:40    

bon tout ca, ca n'a pas résolu mon probleme de réplication, et après beaucoup de recherche, il semble que je sois obligée de faire un refresh complete.. :'(... la vie est vraiment trop injuste !

Reply

Marsh Posté le 14-12-2005 à 16:14:33    

Bon ca n'interesse personne, mais je mets quand meme ma solution pour fermer le thread...
select ctr_id, qte, datesys from
(select t.*,  
          max(case when qte=0 then 1 end) over (partition by ctr_id) existe_qte_0,  
          max(datesys) over (partition by ctr_id) maxdatesys
 from some_data t)
where
(existe_qte_0=1 and qte=0)
or
(existe_qte_0 is null and datesys=maxdatesys)
 
Dans ce cas, c'est environ 30% plus rapide et economique que l'auto-jointure, mais dans des cas plus complexes j'arrive à 10 fois plus rapide (par exemple quand il sagit de calculer des moyennes ou des intervalles)....


Message édité par belldandys le 14-12-2005 à 16:15:06
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed