Vous n'êtes pas identifié(e).
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
Quel est l'encodage de la base ?
Guillaume.
Hors ligne
Ainsi que la ligne de commande complète pour lancer pg_dump.
Julien.
https://rjuju.github.io/
Hors ligne
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
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
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
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
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).
Julien.
https://rjuju.github.io/
Hors ligne
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
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
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
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
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
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
Julien.
https://rjuju.github.io/
Hors ligne
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