PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#26 Re : PL/pgSQL » Sql avec paramètres et condition IF » 02/02/2021 15:19:41

dverite a écrit :

C'est parce qu'il y a d'autres erreurs dans la déclaration. En fait il y en a 3:

Alternativement dans le script psql vous pouvez utiliser \echo pour faire un affichage côté client sans solliciter le SQL.

  \echo [-n] [TEXTE]     écrit le texte sur la sortie standard (-n pour supprimer le retour à la ligne)

Bon, je clos cette discussion car c'est ce que je recherchais depuis hier. Merci dverite et je garde de côté tes bons conseils.
C'est une solution toute simple.
Pour la petite histoire, dans les exemples, je voyais bien 'LANGUAGE plpgsql' mais je pensais que c'était à remplacer par du code, la suite du programme.... Bref, je le saurai la prochaine fois.

Merci aussi à rjuju et gleu.

#27 Re : PL/pgSQL » Sql avec paramètres et condition IF » 02/02/2021 11:43:15

Là, sauf erreur de ma part, j'ai un doute car dans la doc https://docs.postgresql.fr/9.3/sql-synt … funcs.html , il n'y en avait pas.

Si je le rajoute, c'est ce que je disais avant, la fonction n'est plus reconnue...

psql:test.sql:9: ERROR:  function log_notice(unknown) does not exist
LINE 1: SELECT log_notice('TINTIN');
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Autre idée?

#28 Re : PL/pgSQL » Sql avec paramètres et condition IF » 02/02/2021 10:17:03

rjuju a écrit :

Le problème vient à priori des lignes précédentes.  Peut être manqeue-t-il un ; à la fin de l'instruction précédente ?.

Je ne pense pas car il y en a à chaque ligne. Quand j'en ai ajouté un après le $$ , c'était pire, la fonction n'était pas reconnue. Et même sans paramètre, ça coince....

CREATE FUNCTION log_notice(text) AS $$;
DECLARE
    user ALIAS FOR $1;
BEGIN
    RAISE NOTICE 'creation user % done!', user;
END;
$$

SELECT log_notice('TINTIN');

Toujours l'erreur...

psql:test.sql:9: ERROR:  syntax error at or near "SELECT"
LINE 8: SELECT log_notice('TINTIN');
        ^

Je sèche....

#29 Re : PL/pgSQL » Sql avec paramètres et condition IF » 01/02/2021 18:05:11

gleu a écrit :

Votre CREATE FUNCTION ne respecte pas la syntaxe. La doc sur CREATE FUNCTION se trouve sur https://docs.postgresql.fr/13/sql-createfunction.html

De plus, vous avez mal copié mon RAISE NOTICE smile

Et tant que j'y suis, la doc sur PL/pgsql : https://docs.postgresql.fr/13/plpgsql.html

Merci pour la doc.
Après avoir consulté la doc, normalement, ma fonction doit être OK.

CREATE FUNCTION log_notice(text) AS $$;
DECLARE
    user ALIAS FOR $1;
BEGIN
    RAISE NOTICE 'creation user % done!', user;
END;
$$

Par contre, pour l'appel, j'ai suivi https://docs.postgresql.fr/9.3/sql-synt … funcs.html et j'ai donc mis cela :

SELECT log_notice(':p1');

Toujours une erreur :

psql:test.sql:9: ERROR:  syntax error at or near "SELECT"
LINE 8: SELECT log_notice(':p1');
        ^

Bref, pour un simple message d'information.... pas évident.

#30 Re : PL/pgSQL » Sql avec paramètres et condition IF » 01/02/2021 16:11:05

ok, mais ça coince encore. Pas évident ce langage....

CREATE FUNCTION log_notice(text)
DECLARE
    user ALIAS FOR $1;
BEGIN
    raise notice 'creation user % done!';
END;


SELECT COUNT(*) = 0 AS user_not_exist FROM pg_roles WHERE rolname = :'p1' \gset

\if :user_not_exist

SELECT CASE
    WHEN :'p3' = 'indus' THEN 'roleadmin'
    ELSE 'roleread'
END AS profil
\gset
CREATE USER :p1 password :'p2' NOCREATEDB IN GROUP :"profil";
do $$
BEGIN
   log_notice :p1
END $$;
\endif

Ca plante...

psql -U $USER-d $BASE -f CreateUser.sql -v p1="tintin" -v p2="xxxxx" -v p3="indus"
psql:createUser.sql:3: ERROR:  syntax error at or near "DECLARE"
LINE 2: DECLARE
        ^
psql:createUser.sql:5: ERROR:  syntax error at or near "raise"
LINE 2:     raise notice 'creation user % done!';
            ^
psql:createUser.sql:6: WARNING:  there is no transaction in progress
COMMIT

#31 Re : PL/pgSQL » Sql avec paramètres et condition IF » 01/02/2021 14:55:04

rjuju a écrit :

Le paramètre ne sera pas pris en compte dans le bloc de code, ce qui est votre problème original.  Le seul moyen d'y avoir accès serait de créer une vraie fonction, par exemple log_notice(text) que vous appelleriez en passant votre paramètre.

Du genre? :

CREATE FUNCTION log_notice(text)
DECLARE
    user ALIAS FOR $1;
BEGIN
    raise notice 'creation user :user done!';
END;

#32 Re : PL/pgSQL » Sql avec paramètres et condition IF » 01/02/2021 12:26:26

gleu a écrit :

RAISE NOTICE ne fonctionne que dans une routine PL/pgsql.

Merci.
Du coup, j'ai ajouté cela :

CREATE USER :p1 password :'p2' NOCREATEDB IN GROUP :"profil";
do $$
BEGIN
raise notice 'creation user :p1 done!';
END $$;

Ca marche mieux mais mon paramètre n'est pas valorisé...
Il doit manquer une ligne de code...

CREATE ROLE
psql:createUser.sql:14: NOTICE:  creation user :p1 done!
DO

une idée?

#33 Re : Sécurité » Problème suppression rôle » 01/02/2021 10:35:10

Bonjour

ruizsebastien a écrit :

bonjour,

essayez de faire les revoke correspondants avant la suppression du rôle.

Et ben, je n'ai pas eu le temps de répondre mais c'est une solution qui me convient!
Cela marche sans problème.

Merci ;-)

#34 Re : PL/pgSQL » Sql avec paramètres et condition IF » 01/02/2021 09:59:39

rjuju a écrit :

Il manque le message d'erreur...

oups, pardon

psql:createUser.sql:11: ERROR:  syntax error at or near "raise"
LINE 1: raise notice 'creation user :p1 done!';
        ^

#35 Re : PL/pgSQL » Sql avec paramètres et condition IF » 01/02/2021 09:48:09

j'obtiens cela :

LINE 1: raise notice 'creation user :p1 done!';
        ^

#36 Sécurité » Problème suppression rôle » 01/02/2021 09:24:30

Christof25
Réponses : 3

Bonjour à tous

Dans notre batch technique quotidien, nous envisageons de supprimer et de recréer plusieurs rôles (admin, lecture et écriture) afin de mettre à jour diverses évolutions sur les droits ou en cas de nouveaux objets.

Par contre, quand j'essaie de supprimer un rôle (lecture par exemple), j'ai des messages d'erreur :

psql -U $USER -d $BASE -f deleteRoleRead.sql
psql:deleteRoleRead.sql:1: ERROR:  role "roleread" cannot be dropped because some objects depend on it
DETAIL:  privileges for database base00
privileges for default privileges on new functions belonging to role usersu in schema ebaschema
privileges for default privileges on new sequences belonging to role usersu in schema ebaschema
privileges for default privileges on new relations belonging to role usersu in schema ebaschema
privileges for sequence valides_idvalide_seq
privileges for sequence userbqe_iduser_seq
privileges for sequence societe_idsoc_seq
privileges for sequence tache_idtache_seq
privileges for sequence validateur_idvalidateur_seq
privileges for sequence uti_soc_id_seq
privileges for sequence typekey_idtypekey_seq
privileges for sequence utilisateur_iduti_seq
privileges for sequence alerte_idalerte_seq
privileges for sequence sigperso_idsigperso_seq
privileges for sequence segment_idsegment_seq
privileges for sequence scanrep_idscan_seq
privileges for sequence lstmsgtache_idlsttache_seq
privileges for sequence logpost_id_seq
privileges for sequence formatm_idformatm_seq
privileges for sequence format_idformat_seq
privileges for sequence erreur_iderreur_seq
privileges for sequence compte_idcompte_seq
privileges for sequence certificat_idcert_seq
privileges for sequence message_idmsg_seq
privileges for sequence "banque_IDBANQUE_seq"
privileges for table valides
privileges for table utili
privileges for table uti_soc
privileges for table message
privileges for table format
privileges for table erreur
privileges for table banque
privileges for table validateur
privileges for table userbqe
privileges for table typekey
privileges for table tache
privileges for table sigperso
privileges for table societe
privileges for table segment
privileges for table scanrep
privileges for table lstmsgtac
privileges for table logpost
privileges for table formatm
privileges for table compte
privileges for table codeerreur
privileges for table certificat
privileges for table alerte
privileges for schema prdschema

Pour info, voici le job de création initial

CREATE ROLE roleread LOGIN;
GRANT USAGE ON SCHEMA prdschema TO roleread;
GRANT SELECT ON ALL TABLES IN SCHEMA prdschema TO roleread;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA prdschema TO roleread;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA prdschema TO roleread;
GRANT CONNECT,TEMPORARY ON DATABASE base00 TO roleread;
ALTER DEFAULT PRIVILEGES IN SCHEMA prdschema GRANT SELECT ON TABLES TO roleread;
ALTER DEFAULT PRIVILEGES IN SCHEMA prdschema GRANT SELECT ON SEQUENCES TO roleread;
ALTER DEFAULT PRIVILEGES IN SCHEMA prdschema GRANT EXECUTE ON FUNCTIONS TO roleread;

Comment supprimer ce rôle enitèrement?

Merci de votre aide

#37 Re : PL/pgSQL » Sql avec paramètres et condition IF » 01/02/2021 09:05:21

Bonjour

Merci rjuju. Ça fonctionne.
J'aimerai également ajouter un message d'information dans le cas d'une création et dans le cas il existe déjà.

J'ai testé cela mais cela sort en erreur :

SELECT COUNT(*) = 0 AS user_not_exist FROM pg_roles WHERE rolname = :'p1' \gset

\if :user_not_exist

SELECT CASE
    WHEN :'p3' = 'indus' THEN 'roleadmin'
    ELSE 'roleread'
END AS profil
\gset
CREATE USER :p1 password :'p2' NOCREATEDB IN GROUP :"profil";
dbms_output.put_line('creation user :p1 done!');
\endif

J'ai également essayé avec

raise notice 'creation user :p1 done!';

Je ne sais pas si c'est la syntaxe ou l'appel qui sont en cause.

Merci

#38 Re : PL/pgSQL » Sql avec paramètres et condition IF » 29/01/2021 17:34:41

Me revoilà...
Dans mon sql, j'aimerai effectuer une recherche de l'utilisateur avant de le créer car il peut déjà exister.
Nous avons déjà un sql de ce type pour Oracle. J'aimerai donc reprendre la procédure mais en 'language' PSQSL

procedure recherche_user ( p_user IN ALL_USERS.USERNAME%TYPE,
                           p_user_exist OUT BOOLEAN ) IS
p_tmp           INTEGER;
BEGIN
        Select 1 into p_tmp from ALL_USERS
        WHERE USERNAME=upper(p_user);

        IF p_tmp=1 THEN
                p_user_exist :=TRUE;
        END IF;

EXCEPTION
        WHEN NO_DATA_FOUND THEN
        p_user_exist:=FALSE;
        WHEN OTHERS THEN
        dbms_output.put_line(chr(10)||'Error during searching user_id');
        RAISE SORTIES;
END recherche_user;

Appel de la fonction

    recherche_user(w_user,w_user_exist);
        IF w_user_exist=false
        THEN
                 {creation de l'utilisateur avec mon sql de départ}
        ELSE
           dbms_output.put_line(chr(10)||'Warning ! User  '||w_user||' already exist on database.');
           raise sorties;
        END IF;

Pourriez-vous m'aider à faire l'équivalent, svp?

Merci

#39 Re : PL/pgSQL » Sql avec paramètres et condition IF » 29/01/2021 17:02:34

Merci beaucoup!! Cela fonctionne très bien!!
Bonne journée

#40 Re : PL/pgSQL » Sql avec paramètres et condition IF » 29/01/2021 12:00:31

merci beaucoup, cela fonctionne.

Par contre, quand je testais mon premier sql et qu'il plantait, le code de retour de ma commande plsql était quand même à 0.


psql -U $USER -d $BASE -f /sql/createUser.sql -v p1="toto" -v p2="xyxyxyxyxy" -v p3="indus"
psql:sql/createUser.sql:9: ERROR:  syntax error at or near ":"
LINE 3: if :p3 = 'indus' then
           ^
echo $?
0

Comment faire pour savoir si cela a aboutit ou pas?

#41 PL/pgSQL » Sql avec paramètres et condition IF » 29/01/2021 10:38:08

Christof25
Réponses : 28

Bonjour

Je débute en postgre et je dois lancer un sql avec des paramètres et en fonction de la valeur de ce paramètre, je dois initialiser des variables.
J'ai beau chercher des exemples avec Google mais pas de cas concrets, d'où mon appel à l'aide.
Voici mon sql :

do $$
begin
if :p3 = 'indus' then
     PROFIL := 'ROLEADMIN';
else
     PROFIL := 'ROLEREAD';
end if;
CREATE USER :p1 PASSWORD ':p2' NOCREATEDB in group :PROFIL ;
end $$;

Quand je lance ma commande, voilà ce que j'obtiens :

psql -U $USER -d $BASE -f /sql/createUser.sql -v p1="toto" -v p2="xyxyxyxyxy" -v p3="indus"
psql:sql/createUser.sql:9: ERROR:  syntax error at or near ":"
LINE 3: if :p3 = 'indus' then
           ^

Je pense qu'il faut que je déclare des variables pour récupérer les paramètres, non?
Si oui, comment...

Merci

#42 Re : Général » Restauration WAL » 31/07/2019 13:41:02

Vous savez quoi?
Merci à rjuju pour son indice :

rjuju a écrit :

soit c'est une subtilité due à votre utilisation de docker / ansible, et il faut chercher de ce côté là.

Car j'ai regardé le playbook de démarrage de mon container qui lance l'instance.
Et j'ai remarqué qu'il manquait un volume, celui qui contenait tous les WAL restorés!!! Normal qu'il ne pouvait pas les trouver....

Bref, après quelques modifications, j'ai relancé une restauration complète FULL + WAL et voilà ce que contient la log de démarrage :

bash-4.4# vi postgresql-2019-07-31_132103.log
2019-07-31 13:21:03 CEST [20-1] LOG:  database system was interrupted; last known up at 2019-07-30 20:00:23 CEST
2019-07-31 13:21:03 CEST [20-2] LOG:  starting archive recovery
2019-07-31 13:21:03 CEST [20-3] LOG:  restored log file "0000000100000007000000A3" from archive
2019-07-31 13:21:04 CEST [20-4] LOG:  redo starts at 7/A3000028
2019-07-31 13:21:04 CEST [20-5] LOG:  consistent recovery state reached at 7/A3000130
2019-07-31 13:21:04 CEST [1-6] LOG:  database system is ready to accept read only connections
2019-07-31 13:21:04 CEST [20-6] LOG:  restored log file "0000000100000007000000A4" from archive
2019-07-31 13:21:04 CEST [20-7] LOG:  record with incorrect prev-link 0/0 at 7/A4000028
2019-07-31 13:21:04 CEST [20-8] LOG:  redo done at 7/A3000130
2019-07-31 13:21:04 CEST [20-9] LOG:  restored log file "0000000100000007000000A3" from archive
cp: can't stat '/users/onl00/restore/WAL/00000002.history': No such file or directory
2019-07-31 13:21:05 CEST [20-10] LOG:  selected new timeline ID: 2
2019-07-31 13:21:05 CEST [20-11] LOG:  archive recovery complete
cp: can't stat '/users/onl00/restore/WAL/00000001.history': No such file or directory
2019-07-31 13:21:05 CEST [1-7] LOG:  database system is ready to accept connections
2019-07-31 13:21:06 CEST [34-1] [unknown]@[unknown] LOG:  connection received: host=opencell-00.onl00_opencell port=36402
2019-07-31 13:21:06 CEST [34-2] [unknown]@[unknown] LOG:  incomplete startup packet
2019-07-31 13:21:06 CEST [35-1] [unknown]@[unknown] LOG:  connection received: host=opencell-00.onl00_opencell port=36404
2019-07-31 13:21:36 CEST [36-1] [unknown]@[unknown] LOG:  connection received: host=opencell-00.onl00_opencell port=36484
2019-07-31 13:21:36 CEST [36-2] mdponlxxx@onl01 LOG:  connection authorized: user=mdponlxxx database=onl01
2019-07-31 13:21:36 CEST [36-3] mdponlxxx@onl01 LOG:  duration: 0.388 ms
2019-07-31 13:21:36 CEST [36-4] mdponlxxx@onl01 LOG:  duration: 0.021 ms
2019-07-31 13:21:36 CEST [36-5] mdponlxxx@onl01 LOG:  duration: 0.097 ms
......

Les messages concernant les fichiers .history sont-ils importants?

Mon application a démarré sans problème, sans intervenir manuellement cette fois-ci.

Merci encore pour votre aide en tout cas

#43 Re : Général » Restauration WAL » 31/07/2019 10:54:42

Non, pas compressé.

Voici la liste des WAL disponibles pour ma restauration :

bash-4.3# ls -altr
total 148112
-rwxrwxrwx    1 postgres postgres  16777216 Jul 30 20:00 0000000100000007000000A3
-rwxrwxrwx    1 postgres postgres  16777216 Jul 30 22:00 0000000100000007000000A5
-rwxrwxrwx    1 postgres postgres  16777216 Jul 30 23:00 0000000100000007000000A6
-rwxrwxrwx    1 postgres postgres  16777216 Jul 31 00:00 0000000100000007000000A7
-rwxrwxrwx    1 postgres postgres  16777216 Jul 31 04:00 0000000100000007000000A8
-rwxrwxrwx    1 postgres postgres  16777216 Jul 31 05:00 0000000100000007000000A9
-rwxrwxrwx    1 postgres postgres  16777216 Jul 31 06:00 0000000100000007000000AA
-rwxrwxrwx    1 postgres postgres  16777216 Jul 31 07:00 0000000100000007000000AB
-rwxrwxrwx    1 postgres postgres  16777216 Jul 31 08:33 0000000100000007000000A4

Ils font tous la même taille, non compressés et les droits sont OK

#44 Re : Général » Restauration WAL » 31/07/2019 09:54:10

Bonjour

J'ai voulu restaurer une nouvelle fois. Voici l'erreur de démarrage de ma base :

bash-4.4# cat postgresql-2019-07-31_094204.log
2019-07-31 09:42:04 CEST [20-1] LOG:  database system was interrupted; last known up at 2019-07-30 20:00:23 CEST
2019-07-31 09:42:04 CEST [21-1] [unknown]@[unknown] LOG:  connection received: host=opencell-00.onl00_opencell port=54880
2019-07-31 09:42:04 CEST [21-2] [unknown]@[unknown] LOG:  incomplete startup packet
2019-07-31 09:42:04 CEST [22-1] [unknown]@[unknown] LOG:  connection received: host=opencell-00.onl00_opencell port=54882
2019-07-31 09:42:04 CEST [20-2] LOG:  starting archive recovery
cp: can't stat '/users/onl00/restore/WAL/0000000100000007000000A3': No such file or directory
2019-07-31 09:42:04 CEST [20-3] LOG:  invalid checkpoint record
2019-07-31 09:42:04 CEST [20-4] FATAL:  could not locate required checkpoint record
2019-07-31 09:42:04 CEST [20-5] HINT:  If you are not restoring from a backup, try removing the file "/var/lib/postgresql/data/backup_label".
2019-07-31 09:42:04 CEST [1-6] LOG:  startup process (PID 20) exited with exit code 1
2019-07-31 09:42:04 CEST [1-7] LOG:  aborting startup due to startup process failure
2019-07-31 09:42:04 CEST [1-8] LOG:  database system is shut down

Pourtant, le fichier WAL recherché est bien présent !

bash-4.4# ls -altr /users/onl00/restore/WAL/0000000100000007000000A3
-rwxrwxrwx    1 postgres postgres  16777216 Jul 30 18:00 /users/onl00/restore/WAL/0000000100000007000000A3

Pour vous aider, voici le contenu du recovery.conf et backup_label

bash-4.4# cat recovery.conf
restore_command = 'cp /users/onl00/restore/WAL/%f "%p"'


bash-4.4# cat backup_label
START WAL LOCATION: 7/A3000028 (file 0000000100000007000000A3)
CHECKPOINT LOCATION: 7/A3000060
BACKUP METHOD: streamed
BACKUP FROM: master
START TIME: 2019-07-30 20:00:23 CEST
LABEL: pg_basebackup base backup

Merci de votre aide

#45 Re : Général » Restauration WAL » 24/07/2019 10:04:49

oui, on est bien d'accord, mais c'était la seule commande que j'ai pu trouver par moi-même pour repartir d'une FULL uniquement et de pouvoir démarrer ma base.
Après, je peux retenter autant de fois une restauration des WAL, si vous voyez quelque chose que j'aurai 'loupé' .

En tout cas, j'apprécie beaucoup votre temps consacré à m'aider ;-)

#46 Re : Général » Restauration WAL » 24/07/2019 09:50:18

Tout simplement en suivant vos conseils..... lol
Bref, je vais consulter votre document concernant les WAL.

#47 Re : Général » Restauration WAL » 24/07/2019 08:37:44

Bonjour

J'ai pu (enfin) refaire des tests mais il y a encore quelque chose qui 'coince'....

WAL restorés

bash-4.4# ls -altr /users/onl00/restore/WAL
total 131656
-rwxrwxrwx    1 root     root      16777216 Jul 23 19:00 000000010000000700000067
-rwxrwxrwx    1 root     root      16777216 Jul 23 20:00 000000010000000700000068
-rwxrwxrwx    1 root     root      16777216 Jul 23 21:00 000000010000000700000069
-rwxrwxrwx    1 root     root      16777216 Jul 23 22:00 00000001000000070000006A
-rwxrwxrwx    1 root     root      16777216 Jul 24 02:00 00000001000000070000006B
-rwxrwxrwx    1 root     root      16777216 Jul 24 03:00 00000001000000070000006C
-rwxrwxrwx    1 root     root      16777216 Jul 24 04:00 00000001000000070000006D
-rwxrwxrwx    1 root     root      16777216 Jul 24 05:00 00000001000000070000006E

Le fichier recovery.conf est bien en place

bash-4.4# cat /var/lib/postgresql/data/recovery.conf
restore_command = 'cp /users/onl00/restore/WAL/%f "%p"'

Première tentative de restauration mais échec au démarrage....

bash-4.4# cat postgresql-2019-07-24_081032.log
2019-07-24 08:10:33 CEST [19-1] LOG:  database system was interrupted; last known up at 2019-07-23 20:00:13 CEST
2019-07-24 08:10:33 CEST [19-2] LOG:  starting archive recovery
cp: can't stat '/users/onl00/restore/WAL/000000010000000700000066': No such file or directory
2019-07-24 08:10:33 CEST [19-3] LOG:  invalid checkpoint record
2019-07-24 08:10:33 CEST [19-4] FATAL:  could not locate required checkpoint record
2019-07-24 08:10:33 CEST [19-5] HINT:  If you are not restoring from a backup, try removing the file "/var/lib/postgresql/data/backup_label".
2019-07-24 08:10:33 CEST [1-6] LOG:  startup process (PID 19) exited with exit code 1
2019-07-24 08:10:33 CEST [1-7] LOG:  aborting startup due to startup process failure
2019-07-24 08:10:33 CEST [1-8] LOG:  database system is shut down

bash-4.4# ls /users/onl00/restore/WAL/000000010000000700000066
ls: /users/onl00/restore/WAL/000000010000000700000066: No such file or directory

Je vérifie où ce fichier WAL est appelé :

bash-4.4# grep 000000010000000700000066 *
backup_label:START WAL LOCATION: 7/66000028 (file 000000010000000700000066)

bash-4.4# cat backup_label
START WAL LOCATION: 7/66000028 (file 000000010000000700000066)
CHECKPOINT LOCATION: 7/66000060
BACKUP METHOD: streamed
BACKUP FROM: master
START TIME: 2019-07-23 20:00:13 CEST
LABEL: pg_basebackup base backup

bash-4.4# ls -altr backup_label
-rwxrwxrwx    1 postgres postgres       209 Jul 23 18:00 backup_label

Du coup, je supprime backup_label et j'essaie de démarrer ma base :

bash-4.4# cat postgresql-2019-07-24_081548.log
2019-07-24 08:15:48 CEST [20-1] LOG:  database system was interrupted; last known up at 2019-07-23 20:00:13 CEST
2019-07-24 08:15:48 CEST [20-2] LOG:  starting archive recovery
2019-07-24 08:15:48 CEST [20-3] LOG:  ignoring file "tablespace_map" because no file "backup_label" exists
2019-07-24 08:15:48 CEST [20-4] DETAIL:  File "tablespace_map" was renamed to "tablespace_map.old".
2019-07-24 08:15:48 CEST [20-5] LOG:  invalid primary checkpoint record
2019-07-24 08:15:48 CEST [20-6] LOG:  invalid secondary checkpoint record
2019-07-24 08:15:48 CEST [20-7] PANIC:  could not locate a valid checkpoint record
2019-07-24 08:15:48 CEST [1-6] LOG:  startup process (PID 20) was terminated by signal 6
2019-07-24 08:15:48 CEST [1-7] LOG:  aborting startup due to startup process failure
2019-07-24 08:15:48 CEST [1-8] LOG:  database system is shut down

Je décide donc d'effectuer un resetwal pour rendre le TP disponible en attendant d'avoir votre analyse.

bash-4.4# su postgres
~/log $ pg_resetwal -f /var/lib/postgresql/data
Write-ahead log reset

Mais problème au démarrage....

bash-4.4# cat postgresql-2019-07-24_081721.log
2019-07-24 08:17:21 CEST [20-1] LOG:  database system was shut down at 2019-07-24 08:17:05 CEST
2019-07-24 08:17:21 CEST [20-2] LOG:  starting archive recovery
cp: can't stat '/users/onl00/restore/WAL/000000010000000700000067': No such file or directory
2019-07-24 08:17:21 CEST [20-3] WARNING:  WAL was generated with wal_level=minimal, data may be missing
2019-07-24 08:17:21 CEST [20-4] HINT:  This happens if you temporarily set wal_level=minimal without taking a new base backup.
2019-07-24 08:17:21 CEST [20-5] FATAL:  hot standby is not possible because wal_level was not set to "replica" or higher on the master server
2019-07-24 08:17:21 CEST [20-6] HINT:  Either set wal_level to "replica" on the master, or turn off hot_standby here.
2019-07-24 08:17:21 CEST [1-6] LOG:  startup process (PID 20) exited with exit code 1
2019-07-24 08:17:21 CEST [1-7] LOG:  aborting startup due to startup process failure
2019-07-24 08:17:21 CEST [1-8] LOG:  database system is shut down

En désespoir de cause, je supprime alors le fichier recovery.conf et la base a pu démarrer, donc à partir du FULL et sans les WAL.

Merci de votre aide.

#48 Re : Général » Restauration WAL » 10/07/2019 11:08:43

Merci pour le tuyau.
En fait, si j'ai bien compris,
1.) je supprime tous les fichiers présents dans /var/lib/postgresql/data/pg_wal
2.) je dépose dans ce même dossier tous les WAL à rejouer.
3.) je créé un fichier recovery.conf qui sera pris en compte en démarrant la base

Par contre, dans ce fichier, j'ai un peu mal à le remplir.
Dans mon cas, est-ce que cela suffira?

restore_command = 'cp /var/lib/postgresql/data/pg_wal/%f "%p"'

ou dois-je renseigner un autre dossier temporaire dans lequel j'aurai décompressé le fichier compressé contenant mes WAL?

#49 Général » Restauration WAL » 10/07/2019 09:47:42

Christof25
Réponses : 15

Bonjour à tous.

Je dois réaliser une restauration d'une base POSTGRES en version 10.5 sous docker avec des playbooks Ansible.

J'arrive déjà à restaurer à partir d'une FULL dont voici les étapes :

== Sauvegarde
  1. 1.) Sauvegarde à chaud de la base

    command: su postgres -c 'pg_basebackup -h postgres -p 5432 -U {{ONL_POSTGRES_USER}} -D /var/lib/postgresql/last_save -Ft [/*]-z -P -v -Xf '
  2. 2.) Fichier en sortie
    20190709T200010_FULL_postgres_save.tar.gz

== Restauration
  1. 1.) Arrêt de la base

  2. 2.) Décompression de l'archive

    tar -xvC {{UNXRESTORE}}/20190709T200010_FULL_postgres_save -f {{UNXRESTORE}}/20190709T200010_FULL_postgres_save.tar.gz ; chmod -R 777 {{UNXRESTORE}}/*
  3. 3.) Restauration

    command: sh -c 'rm -rf /var/lib/postgresql/data/* ; mv {{UNXRESTORE}}/20190709T200010_FULL_postgres_save/* /var/lib/postgresql/data ; chown -R postgres:postgres /var/lib/postgresql/data ; rm -f /var/lib/postgresql/data/recovery.conf'
  4. 4.) Démarrage
    Le démarrage est OK et l'application est opérationnelle.


Par contre, j'ai des fichiers WAL à restaurer (ils sont générés après le FULL)

== Sauvegarde
command: su postgres -c 'cd {{UNXSAVE}}/{{SAVE_RETENTION}}tmp/{{SAVE_SUBDIR}}/{{environment_type}}/arch ; tar -czvf {{UNXBACKUP}}/{{time_save}}_{{backup_file_prefix}}_postgres_save.tar.gz ./* ; chmod 777 {{UNXBACKUP}}/{{time_save}}_{{backup_file_prefix}}_postgres_save.tar.gz'

Voici le contenu d'une archive WAL :

bash-4.4# mkdir 20190710T000011_WAL_postgres_save
bash-4.4# tar -xvC ./20190710T000011_WAL_postgres_save -f ./20190710T000011_WAL_postgres_save.tar.gz
./0000000100000006000000D7
./0000000100000006000000D8
./0000000100000006000000D9

bash-4.4# ls -altr ./20190710T000011_WAL_postgres_save
total 49376
-rw-------    1 root     root      16777216 Jul  9 19:00 0000000100000006000000D7
-rw-------    1 root     root      16777216 Jul  9 20:00 0000000100000006000000D8
-rwx------    1 root     root      16777216 Jul  9 21:00 0000000100000006000000D9
drwxrwxrwx    4 nobody   nobody        4096 Jul 10 07:38 ..
drwxr-xr-x    2 root     root          4096 Jul 10 07:39 .

Voici ma question :
Comment rejouer ces WAL après ma restauration d'une FULL?
Dois-je les déplacer dans un dossier précis et lancer une commande du type 'pg_standby' ?


Voici les dossiers de ma base

bash-4.4# cd /var/lib/postgresql/data
bash-4.4# ls -altr
total 148
-rwxrwxrwx    1 postgres postgres        88 Mar  8 17:07 postgresql.auto.conf
drwxrwxrwx    2 postgres postgres      4096 Mar  8 17:07 pg_twophase
drwxrwxrwx    2 postgres postgres      4096 Mar  8 17:07 pg_tblspc
drwxrwxrwx    2 postgres postgres      4096 Mar  8 17:07 pg_snapshots
drwxrwxrwx    2 postgres postgres      4096 Mar  8 17:07 pg_serial
drwxrwxrwx    2 postgres postgres      4096 Mar  8 17:07 pg_replslot
-rwxrwxrwx    1 postgres postgres      1636 Mar  8 17:07 pg_ident.conf
drwxrwxrwx    2 postgres postgres      4096 Mar  8 17:07 pg_dynshmem
drwxrwxrwx    2 postgres postgres      4096 Mar  8 17:07 pg_commit_ts
-rwxrwxrwx    1 postgres postgres         3 Mar  8 17:07 PG_VERSION
-rwxrwxrwx    1 postgres postgres       178 Apr  3 19:00 recovery.conf.NOK
-rwxrwxrwx    1 postgres postgres     30591 Jun  6 12:21 postgresql.conf
-rwxrwxrwx    1 postgres postgres      5000 Jun  6 12:21 pg_hba.conf
drwxrwxrwx    2 postgres postgres      4096 Jul  2 13:56 pg_stat
-rwxrwxrwx    1 postgres postgres         0 Jul  8 18:00 tablespace_map.old
-rwxrwxrwx    1 postgres postgres       209 Jul  8 18:00 backup_label.old
drwxrwxrwx    2 postgres postgres      4096 Jul  9 13:58 pg_xact
drwxrwxrwx    7 postgres postgres      4096 Jul  9 13:59 base
drwxrwxrwx    4 postgres postgres      4096 Jul  9 13:59 pg_multixact
-rw-------    1 postgres postgres        24 Jul  9 14:00 postmaster.opts
drwxrwxrwx    2 postgres postgres      4096 Jul  9 14:00 pg_notify
-rw-------    1 postgres postgres        94 Jul  9 14:00 postmaster.pid
drwxrwxrwx    2 postgres postgres      4096 Jul  9 14:01 global
drwxrwxrwx    2 postgres postgres      4096 Jul  9 14:10 pg_subtrans
-rw-r-----    1 postgres postgres        64 Jul  9 22:00 current_logfiles
drwx------   19 postgres postgres      4096 Jul  9 22:00 .
drwxrwxrwx    3 postgres postgres      4096 Jul 10 04:20 pg_wal
drwxrwxrwx    4 postgres postgres      4096 Jul 10 04:20 pg_logical
drwxr-xr-x    1 postgres postgres      4096 Jul 10 06:36 ..
drwxrwxrwx    2 postgres postgres      4096 Jul 10 07:42 pg_stat_tmp

Merci de votre aide.

Pied de page des forums

Propulsé par FluxBB