root/traduc/trunk/slony/faql.xml

Revision 1082, 112.1 kB (checked in by david.tokmatchi@gmail.com, 5 months ago)

--

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