IBM Software Group © 2009 IBM Corporation © 2007 IBM Corporation " # $% & ' () *( $( - & # ./) 0 (), ) ' - # 1 () 0 (3 %4" +, # ./) 0 () ' ./) 0 () ' 2 ". 1 ! ' ) 0 () $% & ' / ( (' '- ' ) # *()+, 1 ' # ' ' (' '6 02 & */ 7 ' # '' 09 : 0<2 ' # ' # 1 #/ /' 1 #/ ' '#: 3 # ' ># ? # ' 1 ' #2 # @ ! 8' 0 ;# + '= # 6 # 5 > 2' B B B B B ! # () B '1 C 7 9 D EB ' 7 75 '1 *7 5 4 + E ) #' F # % ' 0 GH=. 2 ) '1 * 5+ E ( ' # #= # ' = = # F # ) !? = ' I0 > ' '=J ' 1 B* A+ E ()9 ./) ' K = 3# #' ' '= 3# / ' 3'= 3 ' # =( # ' ' 1 B* + E: '=" '=) '0 =) ' ' '=)& ' 2#< '1 B* + E /0 0 # () = %?"# " A $( - # ./) 0 (), HDR Consta de un único servidor primario y uno o varios secundarios (11.50 +). ER Permite configurar varias fuentes y destinos Tanto el servidor primario como el secundario La fuente y el destino no tienen por que ser deben correr los mismos ejecutables y con idénticas. la misma disposición de discos. El secundario puede está restringido a solo lectura o puede escribirse en él (11.50 +). Permite el uso total de la fuente y el destino. Simple de configurar y administrar La configuración y la admon. es más compleja. El servidor secundario es espejo del primario La fuente y el destino pueden ser diferentes. No soporta blobs que esten en blobspace´s Soporta blobs que esten en blobspace´s La replication puede ser síncrona o asíncrona. La replication es asíncrona Su propósito es Alta Disponibilidad ! Su propósito es el de Distribución de Datos. ./) L $ 1 , Prueba Logical Log Buffer drsecapply Logical Logs Escritos a Disco Primario ! LogRecvr Prueba HDR Buffer Reception Buffer DRINTERVAL Establece el máximo lapso en segundos entre transmisiones del buffer de HDR Configure a ‘-1’ para Rep. síncrona. Recovery Buffer Logical Logs Escritos a Disco Secundario D () L $ 1 , Fuente Destino á ) ' ' '0 M '0' # / ' > : 2 #' / 0 M M ? % ! / / 00 2 2 " % N # ? 0 ) % NIF > : ' ': : ’' ' # '' ' 7 ' ? '-2 ' :0 !" Group Name > " ! # # ' '2 # ' ' > '2 ' > '2 '2 # ' ' > '2 " # '> ' > '2 2 ' '2 2 ' ' $ "$ ' > '2 %!" ! > # '> () # # ' > '2 !" CDRID – Cualquier número entre 1 y 32768 Asegurese de que el alias TCP/IP que use rep sea el siguiente a la definición del grupo $% "$ %!" "$ %!" El CDRID debe ser único dentro del esquema de replicación. NO!!! Los grupos de ER solo deben tener conexiones TCP. O ' ? '-2 ' :0 !" > " # '2# > #< ' 2 %!" '2 " ! ' ' # '> ' > '2 # 2 ' '2 ! # # 2 ' ./) * A 8+ Configure el par de servidores de HDR como miembros del mismo grupo de ER > '2# > ' > '2 () ' $ "$ !" "$ !" ' > '2 # # ' > '2 $% "$ %!" 2 * G# ( / * 2 #/'N ' > #' ' #0 &&*) 0+ # 0+ 0 & & # 0+ Comunicación HDR Comunicación SMX producción sds1 Co m un ica ció n SM X rss1 ! 2"> hdr1 Co m un ica ció n SM X sds2 () 0 ". RSS HDR SDS ER SDS RSS ! ER ER HDR ' ? :0 !" > " () > # # # '2# > #< ' 2 ' '.# > '2 '' '2 # > ' ' >5 '2 ' > '2 '2 # ' > '2 ' > '2 " '2 2 * Configure el conjunto de servidores de Mach-11 como miembros del mismo grupo de ER '2# > ' >%!" ! '-2 ' ' 2 # ' ## 2 ' '# > '2 ! ' $ "$ !" "$ !" "$ !" $% "$ %!" 8+ (3 ! Primario HDR %oninit -ivy %onspaces -c -S replsbs -p ./replsbs -o 0 -s 10000 -Mo 0 -Ms 100 %onmode -wf LOG_INDEX_BUILDS=1 %dbaccessdemo7 –log %ontape –s -L 0 %cdr define server -c g_erp1 –A /tmp -R /tmp -I g_erp1 %onmode -d primary test3_tcp %onmode -d add RSS test4_tcp ! %! Participante de ER sin HDR '! Secundario HDR (! Secundario RSS %ontape –r %onmode –m %cdr define server -A /tmp -R /tmp –I –S g_erp1 g_erp2 %cdr define repl –C "ignore" -S tran -R –A er2 \ "stores_demo@g_erp1:informix.customer"\ "select * from customer"\ "stores_demo@g_erp2:informix.customer"\ "select * from customer” %cdr start repl er2 %ontape –p %onmode -d secondary test1_tcp %ontape –p %onmode -d RSS test1_tcp 5 (3 ! C A (3 ! C (3 ! C D (3 ! C 7 ! O ! ! ! > # 0 >' > ' C ! # ) ./) # 0 > # 0 >' > ' C ! # ) ./) # 0 5 > # 0 >' > ' C ! # ) ./) # 0 A > # 0 >' > ' C ! # ) ./) # 0 / L (' ') # # '=$ 1 , ?' '# ' * G ():=;/ ":(0 /(? (:(+ ' K # #' # = ' >P ' ' #' ' '# ' ( 2- # '0 ' '' P # ' ' ! # =0 # # # ./)=) 0 9 / ' > > = #' ' '' K # #' > D / L (' ' ;' ') # / ? = ' P # > '1 ' # ' #' =$ 1 # , ' =6 # ' = # ' = ' ' 6 ' > 6 ' C # # ;/:' ' # ' ?! ' ?! '' ! ' '# # ' ? # ' ' ' 7 # ( ' # > K )* ; > # ; > ' > 9 * !& # 1 > 6 # +# '2 '8 ' Q!G !GHM -. '# '' '' M ' # 'C / 1 0# ' 2 # ' ' P ' # # ' ' 6 ' '# '# '' ' # # ' (3C E ; /":" ?(T ( !G/")U 5 ' P / + , R '" P P# ' ' 1 S A 2 #'' '#9 ' > 2 #'* 5 1 # ". + El valor de UPDATABLE_SECONDARY no debe ser mayor al doble de los CPU VPs de la instancia. ! O ;' # ) < B ' + ) # P 1 # .+ #0 - . -0 3 & " 1 2 & 1 3 4 2 " (' ' 5% 6 ' 7 V " 8 1 0 '6 #' 2 6 2 7 9 ! : 8 2 "F # # ) < B ' ; 6 " 1 ##> * 6 > 1 ' W 6 E "0 * X X X E +< 2> ! ' W "0 # * 0 T T T # # # 0 = 0 = 0 ' W 5 # ' P - # # 7 - # P 1 '# ' ' >L' ' P '' # ! ! 6' 8 0 / (' ( '4 '# # '* #' - 20 2 0 '# 1 # # >' 2' # ' P 1 ' P# ' Y '# ' Z# '< ' + 0 # ''1 ' - ' 5 # & 7A & ' P " < = : -.B +8 1 '4 ! 5 4 1 6' #>'?@ 2 5 6 2 & 5 " < = 0 ?(G:! 0 ! 0 ' # #[ [ [ [ 5 (3 # 1 - ' ) <B ' 0! ' 0 • Se pueden usar las vercols explícitamente para revisar que tan “fresca” es la data: /* Añade las version columns */ $alter table T1 add vercols; /* declara y abre un cursor con row version */ $declare cur1 cursor for select *, ifx_row_id from T1; $open cur1; /* Busca la data */ $fetch cur1 into :my_id, :my_name, :row_id; /* Procesa la data y toma una decisión decision */ do_update = get_user_input(my_id, my_name); /* Actualiza la data si se requiere*/ if (do_update) { /* compara ifx_row_id actual con el leído anteriormente*/ $update T1 set name = :my_name where id = :my_id and ifx_row_id = :row_id; /*revisa si se puede actualizar exitosamente o devuleve un error */ if (sqlca.sqlerrd[2] < 1 ) raise_warning(“trying to update stale data”); } ! 55 ! 5A ! 5 ! 5D ! 57 ! 5O ! 5 ! A ! A ! A ! A5 / ! L ". "# ' 1 !": AA / ! L ()"# ' 1 !": A ' K'C 0' "# 2 C9 9 <<< ' 9 #> < N'9 O '9 9 # 2 C9 9 <<< 9 #> > < N'9 '9 "> 0 2 C9 9 <<< '<2 P ". ". : 2 C9 9 <<< P /0 2 C9 9 # /0 2 C9 9 ! ] /0 9 '9 <2 ^:2 9 2 > "# 9 > ( # 9 9 9#' # /0 O2 > , \/ > ^:2 '9 2 T<2 _ # _ > >< ' `' ) '9#9 577A # ' ) M # '9#9 577 # AD . " )C0 http://www.iiug.org/ ! A7 ! AO 2 ! A