root/traduc/trunk/slony/faq.xml

Revision 1173, 113.1 kB (checked in by gleu, 3 weeks ago)

Modifications pour permettre la génération du manuel.
Patch de Christophe Bouchet, avec quelques modifications supplémentaires de ma
part.
Cependant, il reste encore du travail pour avoir une génération parfaite.

Line 
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- DerniÚre modifications
3      le       $Date$
4      par      $Author$
5      révision $Revision$ -->
6
7 <qandaset>
8 <indexterm><primary>Foire Aux Questions de &slony1;</primary></indexterm>
9
10 <qandadiv id="faqcompiling"><title> &slony1; FAQ: Monter et Installer &slony1; </title>
11
12 <qandaentry>
13
14 <question><para> J'utilise <productname> Frotznik Freenix
15 4.5</productname>, avec son systÚme de gestion de paquetages <acronym>FFPM</acronym> (Frotznik Freenix Package Manager).  Il existe des paquets
16 <acronym>FFPM</acronym> pour &postgres; 7.4.7, que j'utilise actuellement
17 comme base de données, mais il n'y a pas encore de paquetages &slony1;.
18 Comment puis-je rajouter &slony1; à cette distribution ?  </para>
19 </question>
20
21
22 <answer><para> <productname>Frotznik Freenix</productname> c'est nouveau pour moi,
23 alors il est un peu dangereux, de donner une réponse définitive, concise et rapide.  </para>
24
25 <para> Les réponses différent légÚrement selon les diverses combinaisons de versions entre
26 &postgres; et &slony1; Il est légérement plus facile, avec les versions récentes, de faire face à ce genre de questions qu'avec les versions plus anciennes. En général, vous devez presque certainement recompiler &slony1; depuis les sources; selon les versions
27 des deux composants &slony1; et &postgres;, vous
28 <emphasis>devez</emphasis> également recompiler &postgres; à partir de zéro.
29 (Savoir si vous devez <emphasis> utilisez </emphasis> la version compilée de &postgres;
30 est un autre problÚme; en général ce n'est pas le cas...) </para>
31
32 <itemizedlist>
33
34 <listitem><para> &slony1; la version 1.0.5 et ultérieur nécessite d'avoir une version  complÚtement configurées des sources de &postgres;, afin de recompiler
35 &slony1;.</para>
36
37 <!-- TODO -->
38
39 <para> <emphasis>Si tout va bien </emphasis> vous pouvez refaire la configuration, 
40 ceci contre la configuration utilisée nativement par la paquetage d'origine, en utilisant la
41 version de &postgres; en utilisant la commande
42 <command> pg_config --configure</command>. </para> </listitem>
43
44 <listitem> <para> &slony1; La version 1.1 simplifie considérablement les choses;
45 dans la mesure où vous êtes dispensé d'avoir la version totale de &postgres; en sources, mais qui,
46 au lieu de cela, se réfÚre à l'endroit où &postgres; ses librairies,
47 les binaires, la configuration, ainsi que <command> les fichiers #include </command> sont déjà installés.
48 </para> </listitem>
49
50 <listitem><para> &postgres; 8.0 et supérieur est généralement plus facile voire idéal
51 car comprenant déjà une <quote>installation par défaut</quote> incluant la totalité des fichiers d'inclusion
52 <command> #include </command>.  </para>
53
54 <para> Si vous utilisez les versions antérieur de&postgres;, vous êtes sensé avoir trouvé
55 toutes les sources et de les installer, si le paquetage d'installation ne l'a pas fait pour vous <quote> sur le serveur,
56 les fichiers d'inclusions<command>#include</command></quote>, peuvent être réinstaller via la commande
57 <command> make install-all-headers </command>.</para>
58 </listitem>
59
60 </itemizedlist>
61
62 <para> En effet, le <quote>cas dérangeant </quote> est un scénario où
63 vous utilisez une version de &slony1; antérieur à 1.1 avec une
64 <quote>vieille</quote> version de &postgres;, dans ce cas vous pouvez comptez devoir compiler &postgres;
65 à partir de zéro afin d'avoir tout les pré requis de &slony1; Recompile sera un passage obligé même si 
66 vous utilisez un version<quote>paquetée</quote> de &postgres;.</para>
67
68 <para> Si vous employez une version récente de &postgres; et une version récente de &slony1;,
69 alors les dependences peuvent être assez petits, et vous ne pouvez pas avoir besoin
70 complémentaire des sources &postgres;.  Ces dispositions devraient soulager la mise en production de
71 paquetage de &slony1;  de sorte que vous pourriez même pouvoir espérer éviter la compilations
72 de &slony1;.</para>
73
74 </answer>
75
76 <answer><para> </para> </answer>
77
78 </qandaentry>
79
80 <qandaentry id="missingheaders">
81 <question><para> J'essaie d'installer &slony1; 1.1 et j'obtiens le message d'erreur suivant:
82 <screen>
83 configure: error: Headers for libpqserver are not found in the includeserverdir.
84    This is the path to postgres.h. Please specify the includeserverdir with
85    --with-pgincludeserverdir=&lt;dir&gt;
86 </screen>
87 </para></question>
88
89 <answer><para> Vous exécutez certainement une version &postgres; 7.4
90 ou ultérieur, où les en-têtes de serveur ne sont pas installé par défaut,
91 il vous suffi dans ce cas de lancer juste
92 une commande <command>make install</command> de &postgres;.</para>
93
94 <para> Vous avez besoin d'installer les en-têtes de serveur lors d'installation de &postgres;
95 via la commande <command>make install-all-headers</command>.
96
97 </para> </answer> </qandaentry>
98
99 <qandaentry id="threadsafety">
100
101 <question><para> &slony1; semble se compiler correctement; maintenant, lorsque j'exécute un
102 &lslon;, certain évÚnement démarrent autour, mais la réplication ne se met pas
103 route.</para>
104
105 <para> Slony logs might look like the following:
106
107 <screen>
108 DEBUG1 remoteListenThread_1: connected to 'host=host004 dbname=pgbenchrep user=postgres port=5432'
109 ERROR  remoteListenThread_1: "select ev_origin, ev_seqno, ev_timestamp,
110                   ev_minxid, ev_maxxid, ev_xip,
111                   ev_type,
112                   ev_data1, ev_data2,
113                   ev_data3, ev_data4,
114                   ev_data5, ev_data6,
115                   ev_data7, ev_data8 from "_pgbenchtest".sl_event e
116 where (e.ev_origin = '1' and e.ev_seqno > '1') order by e.ev_origin, e.ev_seqno" - could not receive data from server: Operation now in progress
117 </screen>
118 </para>
119
120 <para> Parfois il peut se manifester de maniÚres suivante ...
121
122 <screen>
123 ERROR  remoteListenThread_2: "select ev_origin, ev_seqno, ev_timestamp,
124 ev_minxid, ev_maxxid, ev_xip,        ev_type,        ev_data1, ev_data2,
125 ev_data3, ev_data4,        ev_data5, ev_data6,        ev_data7, ev_data8
126 from "_sl_p2t2".sl_event e where (e.ev_origin = '2' and e.ev_seqno >
127 '0') order by e.ev_origin, e.ev_seqno" - could not receive data from
128 server: Error 0
129 </screen>
130 </para>
131 </question>
132
133 <answer><para>Sur AIX et Solaris (et probablement sur d'autre OS), les deux
134 &slony1; <emphasis>et &postgres;</emphasis> doivent être compilés avec l'
135 <option>--enable-thread-safety</option> option.  Le message ci-dessus arrive lorsque la compilation
136 de &postgres; n'a pas fait appel à cette option.</para>
137
138 <para>Le disfonctionnement ici vient du fait que le libc (threadsafe) et libpq
139 (non-threadsafe) utilisent des emplacement de mémoire différente pour le code erreur, ainsi en
140 laissant la requête échouer.</para>
141
142 <para>Des problÚmes de ce genre sur AIX et sur Solaris, surviennent avec des régularités surprenantes.
143 ; l'erreur devrais prendre quelque choses ressemblant à un code <quote>objet ou à un code d'audit</quote> qui sont compilé
144 make sure that <emphasis>ALL</emphasis> of the necessary components have been
145 et linké avec l'option <option>--enable-thread-safety</option>.</para>
146
147 <para>Pour le moment, je me concentre sur le problÚme de
148 <envar>LD_LIBRARY_PATH</envar> si c'est défini, sur Solaris, pour pointer sur les
149 librairies depuis une version ancienne de &postgres; afin de recompiler. Cela signifie que même si
150 la base <emphasis>a été</emphasis> compilée avec l'
151 <option>--enable-thread-safety</option>, et que
152 <application>slon</application> a été recompilé à nouveau, avec l'édition de lien dynamique de
153 <application>slon</application> pointant sur un
154 <quote>ancienne mauvaise version de thread-unsafe,</quote> et alors slon n'a pas fonctionné.  Ceci n'était pas clair
155 que c'était le cas, jusqu'à ce que je rexécute <command>ldd</command>
156 à nouveau <application>slon</application>.</para> </answer>
157
158 <answer><para> A noter que la version   7.4.2 de libpq, sur Solaris exige, un nouveau patch
159 de <link linkend="threadpatch">  </link> ; Le requis est également demandé pour &postgres; version 8.0.
160 </para>
161 </answer>
162 </qandaentry>
163
164 <qandaentry id="pg81funs">
165
166 <question> <para> Je suis en train de migrer sur une nouvelle version de &slony1;
167 et je me débat avec un problÚme de<xref
168 linkend="stmtupdatefunctions"/>.  Lors d'exécution de<xref
169 linkend="stmtupdatefunctions"/>, mon
170 <application>postmaster</application> plante dessus avec un Signal 11.
171 Le fichier log ne contient aucune erreur, relatives à
172 &postgres; les logs indiquent que, yes indeed, the postmaster fell
173 over.</para>
174
175 <para> En scrutant le fichier core avec un débuguer, on constate que
176 l'incident survient lors de la validation d'une transaction. </para>
177
178 <para> Pour infos je suis sur &postgres; 8.1.[0-3]. </para>
179 </question>
180
181 <answer> <para> Désagréablement l'ancienne versions de &postgres; 8.1 avait un problÚme
182 où lorsque vous  aviez besoin de redéfinir une fonction (comme , say,
183 <function>upgradeSchema(text)</function>), et que aprÚs, dans la même session de transaction
184 , vous exécutiez la même fonction, le
185 <application>postmaster</application> tombait en erreur, et que la
186 transaction ne pouvait se valider.  </para>
187
188 <para> La commande &lslonik; <xref linkend="stmtupdatefunctions"/>
189 fonctionne de cette maniÚre; dans la même transaction, essayez ceci:
190
191 <itemizedlist>
192 <listitem><para> Charger les nouvelles fonctions (depuis <filename>slony1_funcs.sql</filename>), notamment comprenant <function>upgradeSchema(text)</function>.
193 </para> </listitem>
194 <listitem><para> Lancer <function>upgradeSchema(text)</function> pour effectuer la migration nécessaire des schémas de la base. </para> </listitem>
195 <listitem><para> Notifier au pro cesses &lslon; le fait de changement de la configuration.</para> </listitem>
196 </itemizedlist>
197 </para>
198
199 <para> Malheureusement, en &postgres; 8.1.0, 8.1.1, 8.1.2, et 8.1.3,
200 ceci est conflictuel avec un bug où l'utilisation et la modification d'une fonction plpgsql au sein de la même transaction
201 lié à un plantage. </para>
202
203 <para> Plusieurs contournements sont à envisager. </para>
204
205 </answer>
206
207 <answer> <para> La réponse privilégiée serais de dire migrer &postgres; en
208 version 8.1.4 ou supérieur. Les changements mineurs du noyau n'entraîne pas de
209 reconstruction de la base; ceci devrait simplement exiger d'installer un noyau 8.1.x
210 en redémarrant les <application>postmaster</application> avec cette nouvelle version.  </para>
211 </answer>
212
213 <answer><para> Si cette solution ne convient pas, il est possible d'effectuer une série de transaction  <quote>à la main</quote>,
214 l'équivalent de ce que &lslonik; aurait fait pour cette migration. </para>
215
216 <itemizedlist>
217 <listitem><para> Prendre <filename>slony1_funcs.sql</filename> et faire trois remplacement dans ce fichier: </para>
218
219 <itemizedlist>
220 <listitem><para> Remplacer <quote>@CLUSTERNAME@</quote>avec le nom du cluster</para> </listitem>
221 <listitem><para> Remplacer <quote>@MODULEVERSION@</quote> avec la version littérale de &slony1; comme <quote>1.2.10</quote> </para> </listitem>
222 <listitem><para> Remplacer <quote>@NAMESPACE@</quote> avec <quote>double-quoted</quote> nom du cluster, comme "_MyCluster" </para> </listitem>
223 </itemizedlist>
224 </listitem>
225 <listitem><para> Recharger cet<quote>remis à niveau</quote> de jeux de fonctions dans la base.</para> </listitem>
226 <listitem><para> Exécuter la fonction stockée via <command>select <function>upgradeSchema('1.2.7')</function>; </command>,
227 en supposant que la précédente version de &slony1; en cours était celle de 1.2.7. </para> </listitem>
228 <listitem><para> Rechargement total des processes &lslon; sera probablement une sage  décision aprÚs ce genre de <quote>chirurgie.</quote> </para> </listitem>
229 </itemizedlist>
230 </answer>
231 </qandaentry>
232
233 <qandaentry>
234 <question> <para> ProblÚme d'installation sur Fedora/x86-64 </para>
235
236 <para> Lorsqu'on essaie de configurer &slony1; sur systÚme Fedora x86-64,
237 où <application>yum</application> a été utilisé pour une installation du paquetage
238 <filename>postgresql-libs.x86_64</filename>, le message suivant se manifeste :
239
240 <screen>
241 configure: error: Your version of libpq doesn't have PQunescapeBytea
242  this means that your version of PostgreSQL is lower than 7.3
243  and thus not supported by Slony-I.
244 </screen></para>
245
246 <para> Ceci arrive avec &postgres; 8.2.5, ce qui est certainement un peu plus récent que
247 7.3. </para>
248 </question>
249
250 <answer> <para> <application>configure</application> est à la recherche de ce directif
251 en compilant un petit programme requis, pour lequel il est appelé, et
252 vérifie la compilation se passe bien. Avec la ligne de commande <command>gcc</command>
253 il utilise <command>-lpq</command> pour chercher la librairie. </para>
254
255
256 <para> Malheureusement, ce paquetage fait défaut depuis le lien symbolique, de
257 <filename>/usr/lib64/libpq.so</filename> à
258 <filename>libpq.so.5.0</filename>; c'est pourquoi il plante sur libpq. 
259 Le <emphasis>vrai</emphasis> problÚme c'est que le compilateur n'arrive pas à trouver une
260 librairie pour l'édition de lien, et non pas que libpq est absent et qui a manqué à l'appel.
261 </para>
262
263 <para> Eventuellement il faudra remonter ces informations vers ceux qui gÚrent le paquetage
264 <filename>postgresql-libs.x86_64</filename>. </para>
265 </answer>
266
267 <answer> <para> Notez que ce même symptÎme peut être révélateur des problÚmes semblables de ce genre
268 de configuration systÚme. Les mauvais liens symboliques, les mauvaises permissions, le mauvais comportement
269 de la part de votre compilateur C, tout peuvent potentiellement mener à ce même message d'erreur. </para>
270
271 <para> Ainsi si vous rencontrez cette erreur, vous aurez besoin de regarder le fichier log généré,
272  <filename>config.log</filename>.  Cherchez par la bas, et regarder quel est le souci <emphasis>récemment</emphasis> rencontré.
273 Ceci sera bénéfique, pour trouver la racine de l'épineux problÚme.</para>
274 </answer>
275
276 </qandaentry>
277
278 </qandadiv>
279
280 <qandadiv id="faqconnections"> <title> &slony1; FAQ: ProblÚmes relatifs aux connections</title>
281 <qandaentry>
282
283 <question><para>Je cherche le nom de<envar>_clustername</envar>, et
284 il est introuvable.</para></question>
285
286 <answer><para> Si le DNS sont erronés, alors l'instance &lslon;
287 ne pourra pas se connecter aux noeuds.</para>
288
289 <para>Ceci mÚne aux fait que les noeuds seront introuvables.</para>
290
291 <para>Revérifier la configuration des connexions. D'ailleurs depuis <xref
292 linkend="slon"/> le linkage avec libpq, vous devrez avoir le mot de passe généré
293  dans <filename> $HOME/.pgpass</filename>, partiellement reporté dans bonne/mauvais authentification ici.</para>
294 </answer>
295 </qandaentry>
296
297 <qandaentry id="morethansuper">
298 <question> <para> J'ai crée un compte <quote>super utilisateur</quote>,
299 <command>slony</command>, pour exécuter les activités de réplications. Comme suggéré,
300 je l'ai configuré comme super user, avec l'interrogation suivante :
301 <command>
302 update pg_shadow set usesuper = 't' where usename in ('slony',
303 'molly', 'dumpy');
304 </command>
305 (Cette même commande permet d'autoriser autres utilisateurs d'exécuter vacuums et
306 sauvegarde).</para>
307
308 <para> Malheureusement, je suis tombé en erreur, à chaque fois où je voulais souscrire à un nouveau ensemble.</para>
309
310 <programlisting>
311 DEBUG1 copy_set 28661
312 DEBUG1 remoteWorkerThread_1: connected to provider DB
313 DEBUG2 remoteWorkerThread_78: forward confirm 1,594436 received by 78
314 DEBUG2 remoteWorkerThread_1: copy table public.billing_discount
315 ERROR  remoteWorkerThread_1: "select "_mycluster".setAddTable_int(28661, 51, 'public.billing_discount', 'billing_discount_pkey', 'Table public.billing_discount with candidate primary key billing_discount_pkey'); " PGRES_FATAL_ERROR ERROR:  permission denied for relation pg_class
316 CONTEXT:  PL/pgSQL function "altertableforreplication" line 23 at select into variables
317 PL/pgSQL function "setaddtable_int" line 76 at perform
318 WARN   remoteWorkerThread_1: data copy for set 28661 failed - sleep 60 seconds
319 </programlisting>
320
321 <para> Celà a continué de se planter, à plusieurs reprise, juqsqu'à ce que
322 <application>slon</application> se connecte comme
323 <command>postgres</command> le faisait.</para>
324 </question>
325
326 <answer><para> Le problÚme est assez évident en soi; la permission sur la table de systÚme est ignorée, <envar>pg_class</envar>.</para></answer>
327
328 <answer><para> La <quote>solution</quote> est la suivante:</para>
329 <programlisting>
330 update pg_shadow set usesuper = 't', usecatupd='t' where usename = 'slony';
331 </programlisting>
332 </answer>
333
334 <answer><para> En version 8.1 et supérieur, vous avez aussi besoin de:</para>
335 <programlisting>
336 update pg_authid set rolcatupdate = 't', rolsuper='t' where rolname = 'slony';
337 </programlisting>
338 </answer>
339 </qandaentry>
340
341 <qandaentry>
342 <question><para> Au moment d'enregistrer un esclave,dans le log, j'obtiens le message
343 suivant :
344
345 <screen>
346 DEBUG1 copy_set 1
347 DEBUG1 remoteWorkerThread_1: connected to provider DB
348 WARN    remoteWorkerThread_1: transactions earlier than XID 127314958 are still in progress
349 WARN    remoteWorkerThread_1: data copy for set 1 failed - sleep 60 seconds
350 </screen></para></question>
351
352 <answer> <para> Il y a évidemment un certain nombre de vieilles transactions bloquantes,
353 de &slony1; restant depuis le traitement des synchros. Vous devriez jeter un coup d'oeil
354 à pg_locks to see what's up:</para>
355
356 <screen>
357 sampledb=# select * from pg_locks where transaction is not null order by transaction;
358  relation | database | transaction |  pid    |     mode      | granted
359 ----------+----------+-------------+---------+---------------+---------
360           |          |   127314921 | 2605100 | ExclusiveLock | t
361           |          |   127326504 | 5660904 | ExclusiveLock | t
362 (2 rows)
363 </screen>
364
365 <para>See?  127314921 est en effet plus vieux que 127314958, et il est toujours en cours d'exécution.</para>
366
367 <para> Un long traitement G/LA,  s'emballe durant une interrogation
368 <application>RT3</application>, avec
369 <application>pg_dump</application>, toute les transaction semblent s'exécuter pour une période interminable.
370 Jusqu'à ce que elles soient complétées ou bien interrompu, on verra alors le message d'erreur suivant:
371 <quote> data copy
372 for set 1 failed - sleep 60 seconds </quote>.</para>
373
374  
375 <para>D'ailleurs, s'il y a plus d'une base de données sur le cluster du &postgres;
376 , et que la charge se déporte sur une autre base, ce qui mÚne à procéder aux<quote>transactions plus tÎt que XID
377 quoi que</quote> s'avérant encore en marche.  Le fait est que la base de donnée dissociée
378 sur le cluster n'est pas pertinente; &slony1; attendra
379 jusqu'à ce que ces vieilles transactions se terminent.</para>
380 </answer>
381 </qandaentry>
382
383
384 <qandaentry>
385 <question><para>Même chose que ce qui précÚde.  Ce que j'ai oublié de mentionner, aussi bien,
386 était que j'essayais d'ajouter
387 <emphasis>DEUX</emphasis> abonnés, concurremment.</para></question>
388
389 <answer><para> Cela ne peut marcher: &slony1; ne peut employer la commande
390 <command>COPY</command> de maniÚre concurrente.  voir
391 <filename>src/slon/remote_worker.c</filename>, la fonction
392 <function>copy_set()</function></para>
393
394 <screen>
395 $ ps -aef | egrep '[2]605100'
396 postgres 2605100  205018        0 18:53:43  pts/3  3:13 postgres: postgres sampledb localhost COPY
397 </screen>
398  
399 <para>Ceci s'avÚre justement être une transaction de <command>COPY</command>
400 impliqué en installant l'abonnement pour un des noeuds. Tout a l'air bien;
401 le systÚme s'occupe de configurer le premier abonné; il ne veut pas démarrer sur le second
402 tant que le premier n'a pas fini son enregistrement.
403 Cela représente une cause possible.</para>
404
405 <para>Ceci a (peut-être malheureusement)comme conséquence que vous ne pouvez pas peupler
406 deux esclaves concurremment pour un simple fournisseur. Vous devez souscrire un et un seul abonné à la fois,
407 une fois qu'il a accompli l'abonnement,(copyant le contenu des table et autre) peut s'occuper de débuter l'enregistrement
408 du deuxiÚme.</para></answer>
409 </qandaentry>
410
411 <qandaentry id="missingoids"> <question> <para> Nous somme souciés par quelques choses
412 car ne pouvant envisager de désinstaller entiÚrement une réplication du cluster slony
413 entre un maître et un esclave.</para>
414
415 <warning> <para><emphasis>ASSUREZ-VOUS QUE VOUS ARRÊTEZ L'EXECUTION DE VOS APPLICATIONS
416 SUR VOTRE BASE DE DONNEES MAITRE, LORS DE L'ELIMINATION D'UN MEMBRE DU
417 CLUSTER</emphasis>, or at least re-cycle all your open connections
418 after the event!  </para></warning>
419
420 <para> Les connexions <quote>se renouvellent</quote> ou se rapportent à OIDs qui sont
421 tuées lors du lancement du script de désinstallation. Et vous obtiendrez
422 un bon nombre d'erreurs en conséquenceÂ
423
424 </para>
425
426 </question>
427
428 <answer><para> Il y a deux sections notables de
429 &postgres; qui sont la mise en cache des plans d'interrogation et les OIDs:</para>
430 <itemizedlist>
431 <listitem><para> Préparer la requête</para></listitem>
432 <listitem><para> Les fonctions pl/pgSQL </para></listitem>
433 </itemizedlist>
434
435 <para> En particulier le problÚme n'est pas que sous &slony1; en un;
436 se produirait quand de telles modifications importantes sont apportées aux fondements de base
437 de données. Il n'est pas imaginable que cela mÚne à perdre des données, mais de se voir confronté
438 à une vague d'erreur relatives à OID.
439 </para></answer>
440
441 <answer><para> Le problÚme arrive lorsque vous utilisez une sorte de
442 <quote>pool de connexion</quote> qui essaie de les reconnecter à la fin.
443 Si vous remettez l'application en route aprÚs ceci, des nouvelles connexions
444 sont générées avec un <emphasis>nouveau</emphasis>plan d'interrogation, et qui
445 font disparaître les erreurs. Si votre pool de connexion tue les sessions, et en recrée de nouvelle,
446 alors ces nouvelles session auront de <emphasis>nouveau</emphasis> plan d'exécution, et
447 que les erreurs vont disparaître. </para></answer>
448
449 En notre code nous laissons tomber le raccordement sur n'importe quelle
450 erreur nous ne peut pas tracer à un état prévu. Ceci réutiliserait par la
451 suite tous les raccordements sur de tels problÚmes inattendus aprÚs juste une
452 erreur par raccordement. Naturellement si l'erreur apprête car une violation de
453 contrainte qui est un état identifié, ce won' ; l'aide de t l'un ou l'autre, et
454 si le problÚme est persistant, les raccordements maintiendra réutiliser qui
455  laisseront tomber l'effet de la mise en commun, dans le dernier cas que
456  le code de mise en commun pourrait également annoncer un Admin. pour jeter
457  un coup d'oeilÂ
458
459  
460 <answer> <para> Dans notre code nous éliminons toutes connexions ayant des erreurs inattendues dans
461 le contexte. Ceci dit, les convexions devront être rétablis à la fin de chaque telle erreur
462 inattendues, à raison d'une erreur par connexion. Naturellement si l'erreur remonte une violation de contrainte,
463 qui est une condition reconnue, ne peut aider la situation,  et si le problÚme persiste, les connexions sont restaurées,
464 qui aura pour effet de casser l'effet de pool, dans ce dernier cas, l'administrateur aura à jeter 
465 un coup d'oeil sur le code. </para> </answer>
466
467 </qandaentry>
468
469 <qandaentry><question><para> J'ai migré mon  &slony1; en version
470 1.2.  J'ai maintenant cet avertissement dans les logs:</para>
471
472 <screen>NOTICE:  Slony-I: log switch to sl_log_2 still in progress - sl_log_1 not truncated</screen>
473
474 <para> Les deux <envar>sl_log_1</envar> et <envar>sl_log_2</envar> continue de prendre du volume,
475 et <envar>sl_log_1</envar> n'est jamais remis à zéro.
476 Quel est le souci?
477 </para> </question>
478
479 <answer><para> Ceci est un cas symptomatique et similaire au précÚdent,
480 relatif à la suppression de réplication : s'il y a des connexions établies, s'attardant à utiliser des plan d'exécutions
481 basés sur des vieilles fonctions stockées, donne par conséquence une écriture dans
482  <envar>sl_log_1</envar> </para>
483
484 <para> La fermeture des vieilles et l'ouverture des nouvelles connexions, résous ce problÚme.</para> </answer>
485
486 <answer> <para> En d'autre terme, la présence d'un ordre dans la liste d'attente de &postgres;
487 pour implémenter des dépendances, aura pour effet de descendre les plans d'exécution, lorsque cette dépendance
488 joue sur l'objet qui change.  </para> </answer>
489 </qandaentry>
490
491 <qandaentry>
492 <question><para>J'ai pointé un noeud de souscription à un fournisseur différent, et il a cessé
493 la réplication.</para></question>
494
495 <answer><para>
496 Nous rappelons que ceci arrive lorsque nous souhaitons initialiser un noeud où
497 nous avons la configuration suivante:
498
499 <itemizedlist>
500 <listitem><para> Node 1 - fournisseur</para></listitem>
501 <listitem><para> Node 2 - s'enregistrer au noeud 1 - le noeud que nous avons réinitialisé</para></listitem>
502 <listitem><para> Node 3 - s'enregistrer au noeud 3 - le noeud qui doit répliquer</para></listitem>
503 </itemizedlist></para>
504
505 <para>L'abonnement pour le noeud 3 a changé dans le sens d'avoir
506 le noeud 3 comme fournisseur, et on a fait<xref linkend="stmtdropset"/> /<xref
507 linkend="stmtsubscribeset"/> pour le noeud 2 pour qu'il soit rechargé.</para>
508
509 <para>Malencontreusement, la réplication a été arrêtée soudainement sur le noeud 3.</para>
510
511 <para>Le problÚme était qu'il n'y avait pas un ensemble approprié de
512 <quote>ports d'écoute</quote> dans <xref linkend="table.sl-listen"/> pour permettre aux évÚnements
513 depuis le noeud 1 de se propager sur le 3. Les événements vont se reporter aux noeuds 2 et bloquent ainsi
514 derriÚre l'évÚnement <xref linkend="stmtsubscribeset"/> que le noeud 2 est en train de traiter.</para>
515
516 <para>Le port d'écoute a lâché le script suivant de slonik où le noeud 3 aurait dû, en passant par le noeud 2
517 de l'ajouter directement en ports d'écoute entre  les deux noeuds 1 et 3.
518
519 <programlisting>
520 cluster name = oxrslive;
521  node 1 admin conninfo='host=32.85.68.220 dbname=oxrslive user=postgres port=5432';
522  node 2 admin conninfo='host=32.85.68.216 dbname=oxrslive user=postgres port=5432';
523  node 3 admin conninfo='host=32.85.68.244 dbname=oxrslive user=postgres port=5432';
524  node 4 admin conninfo='host=10.28.103.132 dbname=oxrslive user=postgres port=5432';
525 try {
526   store listen (origin = 1, receiver = 3, provider = 1);
527   store listen (origin = 3, receiver = 1, provider = 3);
528   drop listen (origin = 1, receiver = 3, provider = 2);
529   drop listen (origin = 3, receiver = 1, provider = 2);
530 }
531 </programlisting></para>
532
533 <para>Juste aprÚs que ce script a été terminé, les événements de  <command>SYNC</command> ont commencé à
534 propager encore sur le noeud 3.
535
536 Ceci précise deux principes:
537 <itemizedlist>
538 <listitem><para>
539 Si vous avez des noeuds multiples, et des abonnés en cascade,
540 vous devez faire attention en repeuplant les entrés <xref
541 linkend="stmtstorelisten"/>, et en modifiant leur structures de l'<quote>arbre</quote>de changement
542 de réplication.</para></listitem>
543
544 <listitem><para> La version 1.1 fourni des meilleurs outils pour gérer ce cas.</para>
545 </listitem>
546
547 </itemizedlist></para>
548
549 <para>Les problÚmes relatifs aux <quote>chemins d'écoute</quote> sont discutés
550 plus bas au <xref linkend="listenpaths"/> </para></answer>
551 </qandaentry>
552
553 <qandaentry id="multipleslonconnections">
554
555 <question><para> En redémarrant  &lslon;, j'obtiens
556 le message suivant <quote>FATAL</quote> dans le log. Que se passe-t-il??? </para>
557 <screen>
558 2006-03-29 16:01:34 UTC CONFIG main: slon version 1.2.0 starting up
559 2006-03-29 16:01:34 UTC DEBUG2 slon: watchdog process started
560 2006-03-29 16:01:34 UTC DEBUG2 slon: watchdog ready - pid = 28326
561 2006-03-29 16:01:34 UTC DEBUG2 slon: worker process created - pid = 28327
562 2006-03-29 16:01:34 UTC CONFIG main: local node id = 1
563 2006-03-29 16:01:34 UTC DEBUG2 main: main process started
564 2006-03-29 16:01:34 UTC CONFIG main: launching sched_start_mainloop
565 2006-03-29 16:01:34 UTC CONFIG main: loading current cluster configuration
566 2006-03-29 16:01:34 UTC CONFIG storeSet: set_id=1 set_origin=1 set_comment='test set'
567 2006-03-29 16:01:34 UTC DEBUG2 sched_wakeup_node(): no_id=1 (0 threads + worker signaled)
568 2006-03-29 16:01:34 UTC DEBUG2 main: last local event sequence = 7
569 2006-03-29 16:01:34 UTC CONFIG main: configuration complete - starting threads
570 2006-03-29 16:01:34 UTC DEBUG1 localListenThread: thread starts
571 2006-03-29 16:01:34 UTC FATAL  localListenThread: "select "_test1538".cleanupNodelock(); insert into "_test1538".sl_nodelock values (    1, 0, "pg_catalog".pg_backend_pid()); " - ERROR:  duplicate key violates unique constraint "sl_nodelock-pkey"
572
573 2006-03-29 16:01:34 UTC FATAL  Do you already have a slon running against this node?
574 2006-03-29 16:01:34 UTC FATAL  Or perhaps a residual idle backend connection from a dead slon?
575 </screen>
576
577 </question>
578
579 <answer><para> La table <envar>sl_nodelock</envar> est utilisée comme un
580 <quote>enclencheur</quote>pour prévenir que les deux process &lslon; essaient de prendre
581 la gestion du même noeud en même temps. Le &lslon; essais d'insérer
582 un enregistrement dans la table; seulement il peut le faire avec succÚs que
583 si il est le seul à gérer le noeud. </para></answer>
584
585 <answer><para> Ce message d'erreur est typiquement un signe que vous avez démarrez
586 un second process  &lslon;  pour un noeud donné.  Le &lslon;pose la question évidente qui est :
587  <quote>Avez vous déjà un a slon démarré pour gérer ce noeud?</quote> </para></answer>
588
589 Vous supposant éprouver une certaine sorte de panne de réseau, le raccordement
590 entre le &lslon; et la base de données peut échouer, et le &lslon; peut
591 figurer ceci dehors longtemps avant le &postgres; exemple il était relié fait.
592 Le résultat est qu'il y aura un certain nombre de les raccordements à vide sont partis sur
593 le serveur de base de données, qui won' ; t soit fermé jusqu'aux temps morts de TCP/IP complets,
594 qui semble prendre normalement environ deux heures. Pour cette période de deux heures, le &lslon;
595 essayera de se relier, à plusieurs reprises, et recevra le message mortel ci-dessus, plus d'et au-dessus de.
596
597 <answer><para> Vous supposant éprouver une certaine sorte de panne de réseau,
598 les connections entre &lslon; et la base de données peuvent échouer, et  &lslon;
599 peut avertir cela bien avant l'instance de &postgres;  il était connecté pour ce faire.
600 La conséquence en est qu'un certain nombre de connexion pré-établie vont s'ouvrir su la base de données
601 et qui ne vont pas se terminer jusqu'à ce que le timeout de TCP/IP arrive à échéance, chose qui n'arrive que
602 tous les deux heures. Durant cette période de deux heures, le &lslon; va essayer de se reconnecter,
603 encore et encore, et obtient le message d'erreur ci-dessous réputé Fatl. </para>
604
605 <para> Un administrateur peut mettre fin à cette situation en se connectant sur
606 le serveur et en lançant <command>kill -2</command> pour terminer les connexions mourantes.
607 Malheureusement , puisque le problÚme a eu lieu dans couche de gestion de réseau,ni &postgres; ni &slony1;
608 a le moyen direct de détecter ceci. </para>
609
610 <para> Vous pouvez <emphasis>la plupart</emphasis> des cas éviter ceci en s'assurant
611 que le process &lslon; est hébergé quelque part prÚs des serveurs qu'il gÚre. Si le &lslon;
612 est hébergé sur le même serveur que la base de donnée qu'il gÚre, alors
613 toute <quote>panne de réseau</quote> qui peut interrompre les connexions
614 seraient susceptibles d'être assez sérieux pour menacer le serveur entier. </para></answer>
615 </qandaentry>
616
617
618 <qandaentry>
619 <question><para> Quand est-ce que je peux arrêter les process &lslon;?</para></question>
620
621 <answer><para> Généralement ce n'est pas un grand compromis pour arrêter les processes &lslon;
622 Chacun d'eux est un <quote>simplement</quote> un client de &postgres;,
623 gérant chacun un noeud, qui engendre des fils pour gérer et recevoir des évÚnements
624 depuis d'autre noeud.  </para>
625
626 <para>L'<quote>évÚnement d'écoute</quote> des serveurs n'est pas un travail sorcier; ils n'ont
627 rien à faire que de temps en temps de tester le noeud distant pour déterminer si sur  le noeud en question,
628 il y a des tâches à faire. Si vous tuer le process &lslon; sa surveillance sera fermée, qui doit avoir peu
629 ou pas du tout d'impact sur rien peut-être. Les éventements générés pour un &lslon; en arrêt reprendront
630 lors de son redémarrage.</para>
631
632 <para> La<quote>gestion des noeuds</quote> est un peu plus intéressant;
633  la plupart du temps , vous pouvez prévoir, sur un abonné, pour son fil
634  d'exécuter l'évÚnement<command>SYNC</command>. Si vous arrêtez
635 le &lslon; durant un évÚnement, la transaction va échouer, et s'annuler, alors lorsque the &lslon;
636 redémarre, il aura de reprendre l'évÚnement pour l'exécuter.</para>
637
638 <para> L'unique situation où cela peut arriver est
639  <emphasis>particuliÚrement</emphasis> <quote>l'arrêt de coeur</quote> si
640 l'évÚnement qui vient de s'achever était un traitement de longue durée comme,
641 <command>COPY_SET</command> pour une large réplication.</para>
642
643 <para>L'autre chose qui <emphasis>pourrait</emphasis> causer l'ennui est
644 si &lslon; travaille sur un noeud distant auxquels il est connecté;
645 vous pouvez découvrir que les sessions de la base de données sont laissées <command>disponible en transaction</command>.
646 Ceci peut normalement arriver si les  connexions réseaux  sont supprimées sans que &lslon; ni la base en ait pris connaissance
647 .Dans ce cas vous pouvez découvrir que des connexions <quote>zombies</quote> traînent encore durant deux long heures
648 si vous n'y aller pas à la main pour leur mettre fin dans &postgres;
649 backends.</para>
650
651  Il y a un autre cas qui pourrait causer l'ennui ; quand &lslon;
652  la gestion du noeud d'origine ne fonctionne pas, événement de synchro
653  ne fonctionne pas contre ce noeud. Si &lslon; les séjours vers le bas
654  pendant une période prolongée, et quelque chose aiment isn' ; fonctionnement
655  de t, vous pourriez être laissé avec une grande synchro au processus quand il
656  vient support. Mais c'est seulement un souci si ce &lslon; est vers le bas
657  pendant une période prolongée ; le fermant pour uns seconde shouldn' ; cause
658  de t tout grand problÚme.
659
660
661 <para> Il y a un autre cas qui pourrait causer l'ennui; quand
662 &lslon; administrant son noeud d'attachement n'est pas en cours d'exécution
663 ,aucun évÚnement <command>SYNC</command> s'exécute sur ce même serveur. Si le &lslon;
664  arrêté pour une longue durée, et que quelques chose du genre <xref linkend="gensync"/> n'est pas encours,
665 vous pouvez vous retrouvez avec  <emphasis>un énorme<command>SYNC</command></emphasis> à effectuer
666 lorsque vous vous apprêtez à réaliser une sauvegarde.  Ceci est vrai seulement si &lslon; est en arrêt pendant une période
667 assez longue; alors que un arrêt de quelques seconds ne génÚre pas de problÚme.</para> </answer>
668 </qandaentry>
669
670 <qandaentry>
671 <question><para> Y a-t-il des risques pour ce faire ? Quels en sont les avantages ?</para></question>
672
673 <answer><para> En bref, si votre <command>COPY_SET</command> prend environ 18h pour s'exécuter
674 finalement, ce n'est pas un grand sacrifice d'arrêter quelques moments un &lslon;
675 ou peut-être même durant un cycle<emphasis>all</emphasis> de &lslon;s. </para> </answer>
676 </qandaentry>
677
678 </qandadiv>
679
680 <qandadiv id="faqconfiguration"> <title> &slony1; FAQ: ProblÚmes de configuration </title>
681 <qandaentry>
682 <question><para>Slonik tombe en erreur - ne peut pas charger les librairies &postgres;  -
683 <command>PGRES_FATAL_ERROR load '$libdir/xxid';</command></para>
684
685 <para> Lorsque j'exécute un simple script de configuration, j'obtiens un message similaire à
686 :
687
688 <command>
689 stdin:64: PGRES_FATAL_ERROR load '$libdir/xxid';  - ERROR:  LOAD:
690 could not open file '$libdir/xxid': No such file or directory
691 </command></para></question>
692
693 <answer><para> Evidemment, vous n'avez pas accÚs à la librairie
694 <filename>xxid.so</filename> dans le répertoire <envar>$libdir</envar>
695 où l'instance &postgres; est en usage. Notez que le composant &slony1;doit être installé sur le noyau du &postgres;
696 pour <emphasis>chacun des noeud</emphasis> et pas seulement sur le noeud d'origine.</para>
697
698 <para>Cela peut également venir du fait d'une disparité entre les binaires
699 du noyau  &postgres; et celui du noyau de  &slony1;. Si vous avez manuellement compilé &slony1;
700 vous même, sur une machine où il y a plusieurs noyau de
701 &postgres;  <quote>se trouvant autour,</quote> il est possible
702 que les binaires slon ou lslonik demande de charger une librairie qui n'est pas accessible
703 actuellement dans les répertoires du noyau de &postgres; gérant le cluster.</para>
704
705 <para>Court et concis: Ceci indique un besoin de <quote>auditer</quote>
706 quel mode d'installation de &postgres; et de &slony1; vous avez en place sur vos machines.
707 Malheureusement,n'importe quelle incompatibilité peut faire remonter ce genre
708 de soucis.  Voir aussi<link linkend="threadsafety">
709 sécurité des thread </link> à propos de la gestion des thread sur Solaris.
710 ...</para>
711
712 <para> La situation sera plus simple si vous aviez un seul noyau de &postgres; installé par serveur
713 dans ce cas il n'y aura pas d' <quote>incompatibilité
714 de chemins</quote> dans lequel les composants de &slony1; sont installés.</para>
715 Si vous avez une installation multiple,
716 vous devrez vous assurez de la compatibilité de la bonne
717 versions de &slony1; associé à la bonne version du noyau de
718 &postgres;. </answer></qandaentry>
719
720 <qandaentry>
721 <question> <para>J'essai de créer un cluster dont le nom contient un "-".
722 Cela ne marche pas!.</para></question>
723
724 <answer><para> &slony1; Utilise les même rÚgles de nommage que &postgres;
725 alors  confirmation, il ne faudra pas utiliser un "-"
726 dans le nom.</para>
727
728 <para> Vous pouvez tenter de mettre des simples <quote>quotes</quote> pour l'identifiant
729 ,mais vous allez vous exposer à des soucis, qui pourront surgir à tout moment.</para>
730 </answer>
731 </qandaentry>
732
733 <qandaentry>
734 <question><para>La commande ps affiche le mot de passe en claire</para>
735
736 <para> Si je lance une commande <command>ps</command>, tout le monde,
737 peut voir le mot de passe qui a été fourni à la ligne de commande.</para></question>
738
739 <answer> <para>Conservez vous mot de passe en dehors de la configuration Slony, en les mettant dans
740 des fichiers <filename>$(HOME)/.pgpass.</filename></para>
741 </answer></qandaentry>
742
743 <qandaentry>
744 <question><para>Sommaire de questions posées sur namespace
745
746 <programlisting>
747 set add table (set id = 1, origin = 1, id = 27,
748                full qualified name = 'nspace.some_table',
749                key = 'key_on_whatever',
750                comment = 'Table some_table in namespace nspace with a candidate primary key');
751 </programlisting></para></question>
752
753 <answer><para> Si vous avez <command> key =
754 'nspace.key_on_whatever'</command> la demande
755 <emphasis>echoura</emphasis>.</para>
756 </answer></qandaentry>
757
758 <qandaentry>
759 <question> <para> La réplication a été retardée, et il semble que les interrogations pour restituer des données
760 depuis  <xref linkend="table.sl-log-1"/>/<xref
761 linkend="table.sl-log-2"/> prennent beaucoup de temps en indiquant quelques demande de
762 <command>SYNC</command>s. </para>
763 </question>
764
765 <answer> <para> Jusqu'à la version 1.1.1, la table <xref
766 linkend="table.sl-log-1"/>/<xref linkend="table.sl-log-2"/>,possédait seulement un index, et si plusieurs jeu de réplication
767 se mettaient en route en même temps, quelques colonnes dans l'indexe n'était pas trÚs discriminent pour la maniÚre d'accÚs.
768 Si l'index ne contient pas la colonne<function> log_xid</function>, il est conseillé de l'ajouter. Voir le script
769 <filename>slony1_base.sql</filename> pour regarder la maniÚre de créer un indexe.
770 </para>
771 </answer>
772 </qandaentry>
773
774 <qandaentry><question> <para> J'ai besoin de renommer une colonne qui figure dans la clef
775 primaire pour l'une de mes tables répliquées. L'opération s'avÚre un peu dangereuse, est-ce vrai ?
776 Aurai-je à la recréer en dehors de la réplication ?</para>
777 </question>
778
779 <answer><para> Affirmatif, c'est un scénario qui fonctionne proprement.  &slony1; fait un usage intensif de
780 clef primaire, mais actuellement c'est ainsi et on espÚre une gestion intégrée et transparente  prochainement</para>.
781
782 <para> Supposez que vous souhaiter renommer une colonne, comme dans uns script sql, on utiliserais la
783 commande DDL suivante<command> alter table accounts alter column aid rename to cid; </command> Ceci
784 permet de renommer la colonne dans la table; elle permet de maniÚre
785 <emphasis>transparente</emphasis> de effectuer la mise à jour dans clef primaire qui contient la colonne en question.
786 Le résultat est que ce genre de changement s'effectue simultanément sur les différents composants, du noeud.</para>
787
788 <para> Dans l' <emphasis>ideal</emphasis> et pour bien faire les choses
789 il aurait fallu utiliser <xref linkend="stmtddlscript"/> pour déployer la modification
790 en étant sur que le bon changement s'applique aux bons noeuds.</para>
791
792 <para> Pour la clarté des choses, tant que la modification commence par la partie répliquée et bien avant les abonnés,
793 il n'y aura pas de cassure irrémédiable. Se retrouver avec quelques évÚnements de
794 <command>SYNC</command> qui n'incluent pas la table sur laquelle il y a la modification, n'est pas un problÚme car ils vont se dérouler
795 sans difficulté...  Par contre si le changement est signalé d'abord par un abonné, alors
796 point that the first update to the table is drawn in by a subscriber,
797 <emphasis>ce</emphasis> sera le point de départ pour que
798 <command>SYNC</command> tombe en erreur, puisque le fournisseur indiquera une
799 <quote>nouvelle</quote>  colonne alors que l'abonné connait toujours
800 ses <quote>anciens</quote> formats. En appliquant la modification à postériori chez l'abonné, la commande
801 <command>SYNC</command>, peut retrouver le
802 <quote>nouveau</quote> nom de colonne et fonctionner sans plantage .
803 </para> </answer></qandaentry>
804
805 <qandaentry id="v72upgrade">
806 <question> <para> J'ai un &postgres; version 7.2 que je souhaite
807 <emphasis>vraiment, vraiment</emphasis> employer avec &slony1; Que faut-il faire pour une migration en
808 version 8.2 ? Quel est l'implication pour récupérer &slony1; afin de les exploiter ensemble?</para>
809 </question>
810
811 <answer> <para> Voici l'écrit d'un certain Rod Taylor sur le sujet ...
812 </para>
813
814 <para> Voici ce dont approximativement vous avez besoin:</para>
815 <itemizedlist>
816 <listitem><para>Prendre les formulaire 7.3 et de mes copier en 7.2 -- ou bien de
817         mettre en dur 7.3 dans vos formulaire </para></listitem>
818 <listitem><para>Supprimer toute trace de schémas dans le code sql de vos formulaires.
819         Sommairement je remplace "." par "-". </para></listitem>
820 <listitem><para> Le bloc de travail relatif aux models de données XID ainsi qu’aux fonctions.
821         Par exemple, Slony crée des  CASTs pour  the xid en  xxid et vice versa -- mais
822         la 7.2 ne peut pas crée de nouveau casts et dans ce cas vous êtes obligé de le modifier à la main.
823         Je rappelle la création d'une classe d'opérateur ainsi que l'édition de certaines fonctions. </para></listitem>
824 <listitem><para>sl_log_1 aura de grave problÚme de performance quelque soit le volume de données.
825         Ceci exige qu'un certain nombre d'indexe soient positionnés pour optimiser les interrogations en 7.2. 7.3
826         et supérieur. </para></listitem>
827 <listitem><para> Ne pas s'  embeter à essayer de travailler en séquence. Faites les à la main
828         en utilisant pg_dump et grep. </para></listitem>
829 </itemizedlist>
830 <para> Bien sûr, une fois que ces pre-requis terminés, on n'est pas encore compatible avec
831 le Slony standard. Ainsi ou bien, vous devez au moins implémenter la 7.2 de maniÚre artisanale
832 du moins, forcer slony à travailler sans les schémas dans la nouvelle version versions de &postgres;
833 ainsi le dialogue entre les deux peut être établi.
834 </para>
835 <para> Juste aprÚs le déroulement de la procédure de migration de 7.2 vers 7.4,
836 on peut désinstaller la version bidouillée de Slony (à la main encore pour la majeur partie), et démarrer la migration
837 de  7.2 à 7.4 sur les différentes machines en utilisant un Slony standard.
838 Ceci permettant de s'assurer sur la fiabilité d'un catalogue systÚme qui avait subi des changement manuels.
839 </para>
840
841 <para> Tout cela pour dire, que nous migrons quelque centaine de GO de données,
842 de  7.2 a  7.4 en espace de 30 minutes. (contre 48 heures auparavant annoncées myeneant un dump et
843 restore) sans pertes de données.
844 </para>
845 </answer>
846
847 <answer> <para> Ceci vous dresse un éventail assez laid qualifié de
848 <quote>bidouille</quote> qu'il faut admettre entrer dans le périmÚtre de production.
849 Si quelqu'un est intéressé pour le transformer en
850 <quote>tâche de production</quote>, il y aura un sens dans ce cas de s'appuyer sur
851 &slony1; en version 1.0, avec un maître mot de ne
852 <emphasis>pas</emphasis> essayer de le rendre pérenne, étant donnée sa durée de vie limitée.</para>
853
854 <para> Vous devriez seulement adapter cette solution que si vous êtes à l'aise avec
855 &postgres; et &slony1; et que de mettre la main au code ne vous fait pas peur. </para> </answer>
856 </qandaentry>
857
858 <qandaentry>
859 <question> <para> J'avais un réseau <quote>pas performant</quote> qui m'obligeais à utiliser
860  <xref linkend="stmtfailover"/> un basculement sur un noeud secondaire.
861 Le plantage n'était pas causé par un problÚme de corruption de donnée venant du disque,
862 Pourquoi serais-je obligé de reconstruire depuis le début, le noeud planté ? </para></question>
863
864 <answer><para> Le rÃŽle de <xref linkend="stmtfailover"/> est d'
865 <emphasis>abandonner</emphasis> le noeud planté, et par conséquence il n'a plus de
866 charge générée par l'activité de &slony1;. Plus le temps passe plus le serveur planté se désynchronise.</para></answer>
867
868 <answer><para> L'<emphasis>énorme</emphasis> problÚme afin de restaurer le serveur planté,
869 est qu'il peut contenir des mises à jours qui n'ont pas eu le temps de se propager endors.
870 Vous ne pouvez pas non plus les rejouer, car elles vont être conflictuelles, car à moitié en place.
871 En tout cas vous avez une sorte de corruption <quote>logique</quote>de donnée, qui n'est jamais causée par une erreur disque.
872 dite <quote>physique.</quote>
873 </para></answer>
874
875 <answer><para> Comme cela a été abordé en <xref linkend="failover"/>, utiliser <xref
876 linkend="stmtfailover"/> revient à accepter comme <emphasis>dernier
877 ressort</emphasis> tant qu'il implique d'abandonner le noeud d'origine pour cette corruption.</para></answer>
878 </qandaentry>
879
880
881 <qandaentry> <question><para> AprÚs notification d'un abonnement sur un
882 <emphasis>autre</emphasis> noeud, la réplication échoue sur l'un des abonnés, avec le message d'erreur suivant:</para>
883
884 <screen>
885 ERROR  remoteWorkerThread_1: "begin transaction; set transaction isolation level serializable; lock table "_livesystem".sl_config_lock; select "_livesystem".enableSubscription(25506, 1, 501); notify "_livesystem_Event"; notify "_livesystem_Confirm"; insert into "_livesystem".sl_event     (ev_origin, ev_seqno, ev_timestamp,      ev_minxid, ev_maxxid, ev_xip, ev_type , ev_data1, ev_data2, ev_data3, ev_data4    ) values ('1', '4896546', '2005-01-23 16:08:55.037395', '1745281261', '1745281262', '', 'ENABLE_SUBSCRIPTION', '25506', '1', '501', 't'); insert into "_livesystem".sl_confirm      (con_origin, con_received, con_seqno, con_timestamp)    values (1, 4, '4896546', CURRENT_TIMESTAMP); commit transaction;" PGRES_FATAL_ERROR ERROR:  insert or update on table "sl_subscribe" violates foreign key constraint "sl_subscribe-sl_path-ref"
886 DETAIL:  Key (sub_provider,sub_receiver)=(1,501) is not present in table "sl_path".
887 </screen>
888
889 <para> Par la suite l'erreur est suivie par un ensemble d'<xref
890 linkend="slon"/> arrêt: de syncs:</para>
891
892 <screen>
893 DEBUG2 remoteListenThread_1: queue event 1,4897517 SYNC
894 DEBUG2 remoteListenThread_1: queue event 1,4897518 SYNC
895 DEBUG2 remoteListenThread_1: queue event 1,4897519 SYNC
896 DEBUG2 remoteListenThread_1: queue event 1,4897520 SYNC
897 DEBUG2 remoteWorker_event: ignore new events due to shutdown
898 DEBUG2 remoteListenThread_1: queue event 1,4897521 SYNC
899 DEBUG2 remoteWorker_event: ignore new events due to shutdown
900 DEBUG2 remoteListenThread_1: queue event 1,4897522 SYNC
901 DEBUG2 remoteWorker_event: ignore new events due to shutdown
902 DEBUG2 remoteListenThread_1: queue event 1,4897523 SYNC
903 </screen>
904
905 </question>
906
907 <answer><para> Si vous regardez les journaux de &lslon; à l'arrêt avec des erreurs due à cet effet
908 <emphasis>d'arrêt</emphasis>, vous auriez besoin de revenir en arriÚre en ignorant une partie de
909 ces journalisation,
910 <emphasis>en attendant</emphasis> aprÚs le redémarrage du serveur en erreur de trouver la cause d'origine.</para></answer>
911
912 <answer><para> Dans ce cas particulier, l'erreur est due à la commande
913 <xref linkend="stmtstorepath"/> qui n'est pas encore répercutée sur le noeud 4 en attendant la propagation
914 de <xref linkend="stmtsubscribeset"/> command</para>
915
916 <para>Ceci démontre encore un autre exemple où l'approximatif ne devra pas prendre le dessus,
917 et que on doit avec assurance vérifier le bon fonctionnement des choses
918 <emphasis>avant</emphasis> de suggérer un changement de la configuration.
919 </para></answer>
920
921 </qandaentry>
922
923 <qandaentry>
924
925 <question><para>J'ai juste utilisé <xref linkend="stmtmoveset"/> afin de déporter le noeud d'origine sur
926 un nouveau serveur. Malheureusement certains abonnés sont toujours attachés à l'ancien noeud que je viens de migrer,
927 or je ne peux les mettre hors service tant qu'il n'ont pas reçu le signalement de ce changement.
928 Que puis-je faire?  </para></question>
929
930 <answer><para> Vous avez besoin d'utiliser <xref linkend="stmtsubscribeset"/> afin de modifier les abonnements
931  de ces serveurs abonnés, que leurs fournisseur <emphasis>sera</emphasis> indisponible durant une période maintenance.</para>
932
933 <warning> <para> Que vous avez <emphasis>omis</emphasis> de faire <xref
934 linkend="stmtunsubscribeset"/>; pour que vous soyez obligé de recommencer à rafraîchir les noeuds depuis le début.
935
936 </para></warning>
937 </answer>
938 </qandaentry>
939
940 <qandaentry>
941 <question><para> AprÚs la notification d'un abonnement auprÚs
942 <emphasis>d'un autre</emphasis> serveur fournisseur, la réplication tombe en erreur, et commençant des messages d'erreurs
943 avec :</para>
944
945 <screen>
946 ERROR  remoteWorkerThread_1: "begin transaction; set transaction isolation level serializable; lock table "_livesystem".sl_config_lock; select "_livesystem".enableSubscription(25506, 1, 501); notify "_livesystem_Event"; notify "_livesystem_Confirm"; insert into "_livesystem".sl_event     (ev_origin, ev_seqno, ev_timestamp,      ev_minxid, ev_maxxid, ev_xip, ev_type , ev_data1, ev_data2, ev_data3, ev_data4    ) values ('1', '4896546', '2005-01-23 16:08:55.037395', '1745281261', '1745281262', '', 'ENABLE_SUBSCRIPTION', '25506', '1', '501', 't'); insert into "_livesystem".sl_confirm      (con_origin, con_received, con_seqno, con_timestamp)    values (1, 4, '4896546', CURRENT_TIMESTAMP); commit transaction;" PGRES_FATAL_ERROR ERROR:  insert or update on table "sl_subscribe" violates foreign key constraint "sl_subscribe-sl_path-ref"
947 DETAIL:  Key (sub_provider,sub_receiver)=(1,501) is not present in table "sl_path".
948 </screen>
949
950 <para> Ceci est suivi plus tard par une série d'erreur de syncs puisque le <xref
951 linkend="slon"/> est à l'arrêt:
952
953 <screen>
954 DEBUG2 remoteListenThread_1: queue event 1,4897517 SYNC
955 DEBUG2 remoteListenThread_1: queue event 1,4897518 SYNC
956 DEBUG2 remoteListenThread_1: queue event 1,4897519 SYNC
957 DEBUG2 remoteListenThread_1: queue event 1,4897520 SYNC
958 DEBUG2 remoteWorker_event: ignore new events due to shutdown
959 DEBUG2 remoteListenThread_1: queue event 1,4897521 SYNC
960 DEBUG2 remoteWorker_event: ignore new events due to shutdown
961 DEBUG2 remoteListenThread_1: queue event 1,4897522 SYNC
962 DEBUG2 remoteWorker_event: ignore new events due to shutdown
963 DEBUG2 remoteListenThread_1: queue event 1,4897523 SYNC
964 </screen>
965
966 </para></question>
967
968 <answer><para> Si lors d'un arrêt, vous voyez dans le journal d'un &lslon; 
969 <emphasis>des nouveaux évÚnements ignorés dus à l'arrêt</emphasis> ,
970 c'est le cas parlant où il faut revenir une étape en arriÚre
971 <emphasis>avant</emphasis> l'arrêt pour voir l'origine de l'erreur.
972 </para></answer>
973
974 <answer><para> Dans ce cas particulier, le problÚme était que certain
975  <xref linkend="stmtstorepath"/> commandes n'ont pas été transmises aux noeud 4 avant <xref linkend="stmtsubscribeset"/>
976  la commande soit propagée. </para>
977
978 <para>C'est encore un exemple où il ne faut pas hâtivement modifier les choses
979 ;vous devrez avec certitude, constater le disfonctionnement
980 <emphasis>avant</emphasis> de faire de nouveau changement de configuration.
981 </para></answer>
982
983 </qandaentry>
984
985 <qandaentry>
986 <question> <para> Est-ce que dans une configuration globale, l'ordre dans lequel, on traite les tables
987 est important ?</para>
988 </question>
989 <answer> <para> La plupart de temps il ne l'est pas. Vous devrez adapter un ordre selon lequel
990 les tables <quote>maîtres</quote> sont mises à jour avant celles de <quote>détails</quote>
991 en fonction de la relation de clef étrangÚre qui les relie; ceci ne sera <emphasis>pas exigé</emphasis> si sur le noeud abonné,
992 on a pris le soin, de désactiver les déclencheurs.
993 </para>
994 </answer>
995
996 <answer> <para>(Les commentaires de Jan Wieck:) L'ordre des ID des tables
997 a une importance uniquement lors d'une opération de <xref linkend="stmtlockset"/> en préparation de basculement.
998 Si l'ordre est différent de celui selon lequel les applications obtiennent des verrous,
999 ces derniers peuvent se transformer en verrous mortels et par conséquent faire tomber l'application ou bien
1000 <application>slon</application>.
1001 </para>
1002 <answer><para> (David Parker) Dans un autre cas, j'ai lancé l'opération où l'ordre des