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).

#1 03/03/2020 16:29:35

JosQuelqu1
Membre

[RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Bonjour,
Je tente de déplacer une base de donnée vers un nouvel ordinateur mais j'obtiens le message suivant lorsque je veux faire une sauvegarde.

---------------------------------------------------------------------------------
pg_dump: lecture des schémas
pg_dump: lecture des tables utilisateur
pg_dump: la commande SQL a échoué
pg_dump: Message d'erreur du serveur : ERREUR:  séquence d'octets invalide pour l'encodage « UTF8 » : 0xe3a976
pg_dump: La commande était : LOCK TABLE sh_tab_sp."lã©vis" IN ACCESS SHARE MODE
pg_dump: *** interrompu du fait d'erreurs
---------------------------------------------------------------------------------

La BD se trouve sur un ordi Win 7 avec PostgreSQL v9.0.

Merci

Dernière modification par JosQuelqu1 (05/03/2020 18:59:37)

Hors ligne

#2 03/03/2020 16:32:42

gleu
Administrateur

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Quel est l'encodage de la base ?


Guillaume.

Hors ligne

#3 03/03/2020 17:03:50

rjuju
Administrateur

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Ainsi que la ligne de commande complète pour lancer pg_dump.

Hors ligne

#4 03/03/2020 23:59:40

JosQuelqu1
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Encodage UTF8

pg_dump.exe -U postgres -f c:\sqlbackup\2020-03-03.sql ma_db

Que ce soit avec pgAdmin ou en cmd avec pg_dump j'ai la même erreur.

Merci!

Hors ligne

#5 04/03/2020 12:35:20

pifor
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Quel est le résultat de la commande SQL:

show client_encoding

Quel est le résultat de la commande Windows:

chcp

Il est possible que le nom de la table dans le catalogue système soit mal encodé.
Essayez de lancer la commande SQL suivante pour vérifier le nom des tables (dans le schéma en question) qui commencent par le caractère 'l':

select pg_namespace.nspname, relname, convert_to(relname,'UTF8') 
from pg_class 
join pg_namespace 
on pg_class.relnamespace = pg_namespace.oid 
and pg_namespace.nspname='sh_tab_sp'
where relname like 'l%';

Dernière modification par pifor (04/03/2020 12:37:34)


Pierre

Hors ligne

#6 04/03/2020 15:46:26

JosQuelqu1
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Bonjour,

client encoding : UTF8

code page : 850

J'ai aussi un message quand je me connecte a psql en cmd:

Attention : l'encodage console (850) diffère de l'encodage Windows (1252).
            Les caractères 8 bits peuvent ne pas fonctionner correctement.
            Voir la section « Notes aux utilisateurs de Windows » de la page
            référence de psql pour les détails.
Saisissez « help » pour l'aide.

Ca ne donne rien la commande. Le tableau est vide.

postgres=# select pg_namespace.nspname, relname, convert_to(relname,'UTF8') from
pg_class join pg_namespace on pg_class.relnamespace = pg_namespace.oid and pg_n
amespace.nspname='sh_tab_sp' where relname like 'l%';
nspname | relname | convert_to
---------+---------+------------
(0 ligne)

Merci de votre aide, c'est super apprécié.

Dernière modification par JosQuelqu1 (04/03/2020 15:47:20)

Hors ligne

#7 04/03/2020 16:11:44

pifor
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Essayez d'afficher toutes les tables du schéma sh_tab_sp avec:

select pg_namespace.nspname, relname, convert_to(relname,'UTF8') 
from pg_class 
join pg_namespace 
on pg_class.relnamespace = pg_namespace.oid 
and pg_namespace.nspname='sh_tab_sp'
order by relname;

Est-ce que pgAdmin affiche bien le schéma appelé sh_tab_sp dans la base en question ?
Est-ce que pgAdmin affiche correctement le nom des tables dans ce schéma et si oui comment est affiché le nom de table qui pose problème dans pg_dump ?

Dernière modification par pifor (04/03/2020 16:12:05)


Pierre

Hors ligne

#8 04/03/2020 16:29:39

rjuju
Administrateur

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

JosQuelqu1 a écrit :

Ca ne donne rien la commande. Le tableau est vide.

postgres=# select pg_namespace.nspname, relname, convert_to(relname,'UTF8') from
pg_class join pg_namespace on pg_class.relnamespace = pg_namespace.oid and pg_n
amespace.nspname='sh_tab_sp' where relname like 'l%';
nspname | relname | convert_to
---------+---------+------------
(0 ligne)

Vous êtes à priori connecté sur la mauvaise base (postgres).

Hors ligne

#9 04/03/2020 16:35:55

pifor
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Oui Julien a raison: il faut d'abord se connecter à la base ma_db avec:

psql -U postgres ma_db

et ensuite dans cette session lancer les commandes SQL pour lister les tables du bon schéma.


Pierre

Hors ligne

#10 04/03/2020 18:43:08

JosQuelqu1
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Je n'étais effectivement pas connecté à la BD... désolé

Voila!

select pg_namespace.nspname, relname, convert_to(relname,'UTF8') from pg_class join pg_namespace on pg_class.relnamespace = pg_namespace.oid and pg_namespace.nspname='sh_tab_sp' order by relname;
ERREUR:  séquence d'octets invalide pour l'encodage « UTF8 » : 0xe3a976

En allant fouillé les tables avec pgAdmin j'ai un avertissement qui me recommande d'exécuter vacuum. Devrais-je?

J'obtiens ca aussi avant le message VACUUM en cliquant sur des tables pas de nom:

An error has occurred:
ERREUR: erreur de syntaxe à la fin de l'entrée
LINE 1: SELECT count(*) AS rows FROM ONLY sh_tab_sp.
                                                ^

Dernière modification par JosQuelqu1 (04/03/2020 18:47:52)

Hors ligne

#11 04/03/2020 19:08:25

pifor
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

L'hypothèse la plus probable est que le nom de la table est mal encodé dans le catalogue système.
Il faudrait essayer de renommer la table avec RENAME TABLE ou faire une mise à jour directe dans le catalogue système en accédant à la bonne ligne de PG_CLASS mais sans déclencher l'erreur d'encodage.
On peut essayer avec client_encoding='SQL_ASCII' et récupérer l'OID de la table pour faire l'UPDATE:

set client_encoding='SQL_ASCII';

SELECT pg_namespace.nspname, pg_class.oid, relname  
FROM pg_class 
JOIN pg_namespace 
ON pg_class.relnamespace = pg_namespace.oid 
AND pg_namespace.nspname='sh_tab_sp'
WHERE pg_class.relname LIKE 'l%'
ORDER BY relname;

BEGIN
UPDATE pg_class SET relname = 'nouveau_nom de la table' WHERE oid = <oid retourné par le SELECT pour la bonne table du bon schéma>;

Lancer COMMIT que si on est sûr de la commande UPDATE (surtout ne pas oublier la clause WHERE sinon c'est la  C A T A  S T R O P H E  dans le catalogue système !!!).
Si on n'est pas sûr lancer ROLLBACK.

Mais si la table a des index, le problème peut aussi être présent sur le nom des index ...

Je ne sais pas si VACUUM va changer que ce soit.

Dernière modification par pifor (04/03/2020 19:38:21)


Pierre

Hors ligne

#12 04/03/2020 21:27:24

JosQuelqu1
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

J'obtiens ceci après la première commande.


SELECT pg_namespace.nspname, pg_class.oid, relname FROM pg_class JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid AND pg_namespace.nspname='sh_tab_sp' WHERE pg_class.relname LIKE 'l%' ORDER BY relname;
  nspname  |  oid  |    relname
-----------+-------+---------------
sh_tab_sp | 31632 | labaie
sh_tab_sp | 31144 | lacpierre
sh_tab_sp | 31560 | laval
sh_tab_sp | 30291 | lavalest
sh_tab_sp | 31406 | lery
sh_tab_sp | 31031 | lignebeaumont
sh_tab_sp | 26612 | lÒ®vis
sh_tab_sp | 26619 | lÒ®vissnc
(8 lignes)


J'ai l'impression que c'était des accents à la base. Je suis un peu frileux de faire la suite. Je peux mettre n'importe quel nom?

Dernière modification par JosQuelqu1 (04/03/2020 21:27:56)

Hors ligne

#13 04/03/2020 21:38:17

pifor
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Oui vous pouvez utiliser n'importe quel nom à condition qu 'il n'est pas déjà utilisé par une autre table dans le même schéma .

Si ce n'est pas déjà fait, par mesure de précaution, vous pouvez faire une sauvegarde à froid du répertoire PGDATA de l'instance (je suppose que tous les tablespaces sont bien dans PGDATA).
- bien arrêter l'instance normalement avec pg_ctl stop
- copier tous les fichiers PGDATA à froid avec la commande copy ou un copier/coller de l'explorateur Windows
- redémarrer l'instance avec pg_ctl start.


Pierre

Hors ligne

#14 04/03/2020 21:45:59

rjuju
Administrateur

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

Avant d'entamer ce genre de procédure, il serait bien d'effectuer d'autres vérifications.  Par exemple:

- afficher le contenu de pg_database
- essayer de créer manuellement une table avec un nom approchant voir si le problème se reproduit ou pas (faite un BEGIN/ROLLBACK autour)
- quelle est la version mineure utilisée, et si elle est ancienne mettre à jour

Hors ligne

#15 04/03/2020 22:53:19

JosQuelqu1
Membre

Re : [RESOLU] Sauvegarde échoue avec erreur séquence d'octets invalide

J'ai corrigé 3 noms de table et je peux maintenant faire un pg_dump!

Merci beaucoup pour votre aide vous avez été super!!!

Il me reste maintenant a restaurer ca sur un autre ordi mais ca devrait bien aller. Sinon je démarre une nouvelle discussion.

Merci encore!

Hors ligne

Pied de page des forums