Vous n'êtes pas identifié(e).
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.
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?
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....
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
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.
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 $$;
\endifCa 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
COMMITLe 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;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!
DOune idée?
Bonjour
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 ;-)
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!';
^j'obtiens cela :
LINE 1: raise notice 'creation user :p1 done!';
^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 prdschemaPour 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
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!');
\endifJ'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
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
Merci beaucoup!! Cela fonctionne très bien!!
Bonne journée
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 $?
0Comment faire pour savoir si cela a aboutit ou pas?
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
Vous savez quoi?
Merci à rjuju pour son indice :
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
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 0000000100000007000000A4Ils font tous la même taille, non compressés et les droits sont OK
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 downPourtant, 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/0000000100000007000000A3Pour 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 backupMerci de votre aide
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 ;-)
Tout simplement en suivant vos conseils..... lol
Bref, je vais consulter votre document concernant les WAL.
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 00000001000000070000006ELe 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 directoryJe 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_labelDu 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 downJe 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 resetMais 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 downEn 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.
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?
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 :
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.) Fichier en sortie
20190709T200010_FULL_postgres_save.tar.gz
1.) Arrêt de la base
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.) 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.) 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)
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_tmpMerci de votre aide.