Re: surprenant résultat : rollback sur update aprè s pg_dump

Tumasgiu Rossini <[email protected]> Thu, 29 Aug 2019 12:30:22 +0200
Newsgroups gmane.comp.db.postgresql.french
Message-ID <CAJD9AWwW3aESTzfGwLbZ7GpfHNLt+S6nmRUhkOkPW0G4Brq0Ow@mail.gmail.com>
--000000000000e6387505913efe14
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Sans vouloir vous offenser, moi =C3=A7=C3=A0 m'arrive donc je pars du
principe que tout le monde est aussi b=C3=AAte que moi :
vous =C3=AAtes certain que la base que vous mettez =C3=A0 jour est bien cel=
le
que vous interrogez par la suite ?

Je n'ai pas vraiment d'id=C3=A9es, a part la transaction.

Peut =C3=AAtre que quelque part dans votre script vous "annulez"  votre upd=
ate ?
Vous devriez, si c'est possible et si vous ne l'avez pas d=C3=A9j=C3=A0 fai=
t,
essayer une version "courte" de votre script, en isolant
la commande probl=C3=A9matique.

Augmenter le d=C3=A9tail des logs et les consulter serait une autre piste.

Le jeu. 29 ao=C3=BBt 2019 =C3=A0 11:23, Cloc <[email protected]> a =C3=A9c=
rit :

> Re.
>
> Je n'ai pas explor=C3=A9 cela. C'est chose faite :
> autocommit n'est d=C3=A9fini nulle part. C'est donc la valeur par d=C3=A9=
faut qui
> s'applique : on
> Effectivement, apr=C3=A8s connexion via psql
> \echo :AUTOCOMMIT
> on
>
> J'ai aussi tent=C3=A9 :
> #  REQUETE_PURGE=3D"begin transaction ; update tableune set nom =3D '',
> groupes =3D null where id_externe =3D any (select distinct id from contra=
t
> where ladate < '2019-01-01'::date); commit transaction; "
> # echo $REQUETE_PURGE | psql -h 127.0.0.1 -U $PROPRIO_ACTUEL -w -d $MABAS=
E
>
> M=C3=AAme r=C3=A9sultat surprenant.
>
> Autre hypoth=C3=A8se ?
>
> Autre information : le serveur est virtualis=C3=A9. Du coup, lors de la
> migration, nous n'avons d=C3=A9fini que 1Go de RAM pour le syst=C3=A8me. =
Est-ce
> que cela pourrait jouer sur ce comportement ?
>
> Le 29/08/2019 =C3=A0 10:43, Tumasgiu Rossini a =C3=A9crit :
> > Salut,
> >
> > est ce que par hasard la variable autocommit aurait la valeur "off" ?
> >
> > Si c'est le cas soit vous l'activez, soit vous d=C3=A9marrez et commite=
z
> > explicitement une transaction dans votre script ?
> >
> > Le jeu. 29 ao=C3=BBt 2019 =C3=A0 09:36, Cloc <[email protected]
> > <mailto:[email protected]>> a =C3=A9crit :
> >
> >     Bonjour.
> >
> >     En vue d'un travail sp=C3=A9cifique de d=C3=A9veloppement, j'ai bes=
oin de la
> copie
> >     d'une base interne. J'ai voulu d=C3=A9placer, upgrader et adapter c=
ette
> base
> >     via un script bash, sur CentOS.
> >
> >     Initialement, la base est en version 9.3. Je la migre sur un serveu=
r
> >     CentOS 7, en version 11. Pas de configuration particuli=C3=A8re.
> >     Un fichier pgpass est cr=C3=A9=C3=A9 au d=C3=A9but du script.
> >
> >     Voici le script utilis=C3=A9 (tronqu=C3=A9 et avec des noms modifi=
=C3=A9s)
> >
> >     # pg_dump -h $PRODUCTION -U $USER_INITIAL --clean --create $MABASE =
>
> >     dump.sql
> >     # su - $PROPRIO_ACTUEL -c 'psql ' < dump.sql
> >     #  REQUETE_PURGE=3D"update tableune set nom =3D '', groupes =3D nul=
l where
> >     id_externe =3D any (select distinct id from contrat where ladate <
> >     '2019-01-01'::date);"
> >     # echo $REQUETE_PURGE | psql -h 127.0.0.1 -U $PROPRIO_ACTUEL -w -d
> >     $MABASE
> >     UPDATE 125834
> >
> >     Puis dans la foul=C3=A9e, au sein du script, je v=C3=A9rifie et aff=
iche le
> >     r=C3=A9sultat d'un select.  Il est coh=C3=A9rent (le r=C3=A9sultat =
est =C3=A9gal =C3=A0 0 si
> >     l'update est effectu=C3=A9) :
> >     # echo "select count (id) from tableune where id_externe =3D 25;" |
> psql
> >     -h 127.0.0.1 -U bddopserv -w -d archivage
> >
> >     Le script laisse tomber PostgreSQL et effectue diff=C3=A9rentes
> manipulations
> >     sur des fichiers puis quitte tranquillement. Le nouveau serveur de
> d=C3=A9v
> >     est red=C3=A9marr=C3=A9.
> >
> >     Tout semble bien s'=C3=AAtre pass=C3=A9. Pourtant, d=C3=A8s le prem=
ier essai
> d'usage,
> >     je me rend compte que les requ=C3=AAtes de nettoyage ne semblent pa=
s avoir
> >     =C3=A9t=C3=A9 ex=C3=A9cut=C3=A9es, comme s'il y avait eu un rollbac=
k. Une fois ex=C3=A9cut=C3=A9es
> >     manuellement, tout rentre dans l'ordre.
> >
> >     Qu'ai je omis de prendre en compte ?
> >
> >     Claude
> >
> >
>

--000000000000e6387505913efe14
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Sans vouloir vous offenser, moi =C3=A7=C3=A0 m&#39;ar=
rive donc je pars du</div><div>principe que tout le monde est aussi b=C3=AA=
te que moi :<br></div><div>vous =C3=AAtes certain que la base que vous mett=
ez =C3=A0 jour est bien celle</div><div>que vous interrogez par la suite ?<=
/div><div><br></div><div>Je n&#39;ai pas vraiment d&#39;id=C3=A9es, a part =
la transaction.</div><div><br></div><div>Peut =C3=AAtre que quelque part da=
ns votre script vous &quot;annulez&quot;=C2=A0 votre update ?</div><div>Vou=
s devriez, si c&#39;est possible et si vous ne l&#39;avez pas d=C3=A9j=C3=
=A0 fait,</div><div> essayer une version &quot;courte&quot; de votre script=
, en isolant</div><div>la commande probl=C3=A9matique.<br></div><div><br></=
div><div>Augmenter le d=C3=A9tail des logs et les consulter serait une autr=
e piste.<br></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"=
gmail_attr">Le=C2=A0jeu. 29 ao=C3=BBt 2019 =C3=A0=C2=A011:23, Cloc &lt;<a h=
ref=3D"mailto:[email protected]">[email protected]</a>&gt; a =C3=A9crit=
=C2=A0:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px =
0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Re.<br>
<br>
Je n&#39;ai pas explor=C3=A9 cela. C&#39;est chose faite :<br>
autocommit n&#39;est d=C3=A9fini nulle part. C&#39;est donc la valeur par d=
=C3=A9faut qui<br>
s&#39;applique : on<br>
Effectivement, apr=C3=A8s connexion via psql<br>
\echo :AUTOCOMMIT<br>
on<br>
<br>
J&#39;ai aussi tent=C3=A9 :<br>
#=C2=A0 REQUETE_PURGE=3D&quot;begin transaction ; update tableune set nom =
=3D &#39;&#39;,<br>
groupes =3D null where id_externe =3D any (select distinct id from contrat<=
br>
where ladate &lt; &#39;2019-01-01&#39;::date); commit transaction; &quot;<b=
r>
# echo $REQUETE_PURGE | psql -h 127.0.0.1 -U $PROPRIO_ACTUEL -w -d $MABASE<=
br>
<br>
M=C3=AAme r=C3=A9sultat surprenant.<br>
<br>
Autre hypoth=C3=A8se ?<br>
<br>
Autre information : le serveur est virtualis=C3=A9. Du coup, lors de la<br>
migration, nous n&#39;avons d=C3=A9fini que 1Go de RAM pour le syst=C3=A8me=
. Est-ce<br>
que cela pourrait jouer sur ce comportement ?<br>
<br>
Le 29/08/2019 =C3=A0 10:43, Tumasgiu Rossini a =C3=A9crit=C2=A0:<br>
&gt; Salut,<br>
&gt; <br>
&gt; est ce que par hasard la variable autocommit aurait la valeur &quot;of=
f&quot; ?<br>
&gt; <br>
&gt; Si c&#39;est le cas soit vous l&#39;activez, soit vous d=C3=A9marrez e=
t commitez<br>
&gt; explicitement une transaction dans votre script ?<br>
&gt; <br>
&gt; Le=C2=A0jeu. 29 ao=C3=BBt 2019 =C3=A0=C2=A009:36, Cloc &lt;<a href=3D"=
mailto:[email protected]" target=3D"_blank">[email protected]</a><br>
&gt; &lt;mailto:<a href=3D"mailto:[email protected]" target=3D"_blank">cca=
[email protected]</a>&gt;&gt; a =C3=A9crit=C2=A0:<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Bonjour.<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0En vue d&#39;un travail sp=C3=A9cifique de d=C3=A9v=
eloppement, j&#39;ai besoin de la copie<br>
&gt;=C2=A0 =C2=A0 =C2=A0d&#39;une base interne. J&#39;ai voulu d=C3=A9place=
r, upgrader et adapter cette base<br>
&gt;=C2=A0 =C2=A0 =C2=A0via un script bash, sur CentOS.<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Initialement, la base est en version 9.3. Je la mig=
re sur un serveur<br>
&gt;=C2=A0 =C2=A0 =C2=A0CentOS 7, en version 11. Pas de configuration parti=
culi=C3=A8re.<br>
&gt;=C2=A0 =C2=A0 =C2=A0Un fichier pgpass est cr=C3=A9=C3=A9 au d=C3=A9but =
du script.<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Voici le script utilis=C3=A9 (tronqu=C3=A9 et avec =
des noms modifi=C3=A9s)<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0# pg_dump -h $PRODUCTION -U $USER_INITIAL --clean -=
-create $MABASE &gt;<br>
&gt;=C2=A0 =C2=A0 =C2=A0dump.sql<br>
&gt;=C2=A0 =C2=A0 =C2=A0# su - $PROPRIO_ACTUEL -c &#39;psql &#39; &lt; dump=
.sql<br>
&gt;=C2=A0 =C2=A0 =C2=A0#=C2=A0 REQUETE_PURGE=3D&quot;update tableune set n=
om =3D &#39;&#39;, groupes =3D null where<br>
&gt;=C2=A0 =C2=A0 =C2=A0id_externe =3D any (select distinct id from contrat=
 where ladate &lt;<br>
&gt;=C2=A0 =C2=A0 =C2=A0&#39;2019-01-01&#39;::date);&quot;<br>
&gt;=C2=A0 =C2=A0 =C2=A0# echo $REQUETE_PURGE | psql -h 127.0.0.1 -U $PROPR=
IO_ACTUEL -w -d<br>
&gt;=C2=A0 =C2=A0 =C2=A0$MABASE<br>
&gt;=C2=A0 =C2=A0 =C2=A0UPDATE 125834<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Puis dans la foul=C3=A9e, au sein du script, je v=
=C3=A9rifie et affiche le<br>
&gt;=C2=A0 =C2=A0 =C2=A0r=C3=A9sultat d&#39;un select.=C2=A0 Il est coh=C3=
=A9rent (le r=C3=A9sultat est =C3=A9gal =C3=A0 0 si<br>
&gt;=C2=A0 =C2=A0 =C2=A0l&#39;update est effectu=C3=A9) :<br>
&gt;=C2=A0 =C2=A0 =C2=A0# echo &quot;select count (id) from tableune where =
id_externe =3D 25;&quot; | psql<br>
&gt;=C2=A0 =C2=A0 =C2=A0-h 127.0.0.1 -U bddopserv -w -d archivage<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Le script laisse tomber PostgreSQL et effectue diff=
=C3=A9rentes manipulations<br>
&gt;=C2=A0 =C2=A0 =C2=A0sur des fichiers puis quitte tranquillement. Le nou=
veau serveur de d=C3=A9v<br>
&gt;=C2=A0 =C2=A0 =C2=A0est red=C3=A9marr=C3=A9.<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Tout semble bien s&#39;=C3=AAtre pass=C3=A9. Pourta=
nt, d=C3=A8s le premier essai d&#39;usage,<br>
&gt;=C2=A0 =C2=A0 =C2=A0je me rend compte que les requ=C3=AAtes de nettoyag=
e ne semblent pas avoir<br>
&gt;=C2=A0 =C2=A0 =C2=A0=C3=A9t=C3=A9 ex=C3=A9cut=C3=A9es, comme s&#39;il y=
 avait eu un rollback. Une fois ex=C3=A9cut=C3=A9es<br>
&gt;=C2=A0 =C2=A0 =C2=A0manuellement, tout rentre dans l&#39;ordre.<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Qu&#39;ai je omis de prendre en compte ?<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0Claude<br>
&gt; <br>
&gt; <br>
</blockquote></div></div>

--000000000000e6387505913efe14--