Vous n'êtes pas identifié(e).
Bonjour,
J'avais utilisé des FDWs dans un projet et ça marchait bien.
Je recommence dans un autre projet.
Je dois jouer plusieurs fois le script qui crée le serveur FDW car j'ai un problème de permission sur la foreign table.
Et tout d'un coup, quand j'essaie de faire un select sur la foreign table, je reçois :
ERROR: could not connect to server "fdw_utilities"
DETAIL: FATAL: sorry, too many clients already
FATAL: sorry, too many clients already
et une chiée de
CONTEXT: Remote SQL command: SELECT pg_user_name, permissions, db_name, pg_server_name, pg_server_address FROM public.list_permissions
Remote SQL command: SELECT pg_user_name, permissions, db_name, pg_server_name, pg_server_address FROM public.list_permissions
Remote SQL command: SELECT pg_user_name, permissions, db_name, pg_server_name, pg_server_address FROM public.list_permissions
je fais pg_ctl restart
ça continue
j'ai pourtant
shared_buffers = 2048MB
max_connections = 100
Je pédale dans la choucroute et je vous appelle à l'aide !
Hors ligne
Ça n'a rien à voir avec les droits. Vous avez atteint le max d'utilisateurs connectés sur le serveur distant, c'est tout.
Guillaume.
Hors ligne
Merci pour votre réponse.
Si je vous comprends, je devrais augmenter max_connections ?
Mais commentexpliquer que pg_ctl restart ne remet pas les compteurs à zéro ?
Hors ligne
le restart va remettre les compteurs à 0 mais si vous avez quelque chose qui se connecte "en masse" à votre foreign table (je ne sais pas, peut être un pool de connexion, un batch, une appli ou autre) et qui consomme toutes les connexions disponibles, c'est normal d'avoir l'erreur too many clients already.
Donc le mieux serait de comprendre pourquoi il y a autant de connexions.
Cordialement,
Sébastien.
Hors ligne
Pour le moment, il n'y a que moi qui crée des fdw servers en développement. Il n'y donc que moi qui crée toutes ces connexions. C'est étrange !
mais plus tard, chaque fois qu'un utilisateur se connectera, il créera des fdws. (Plusieurs dbs sur plusieurs serveurs. Le user se connecte à son sandbox où il a ses tables locales et les tables foreign)
Faut-il que je fasse des drop servers fdw quand le user quitte l'application?
Merci à tous deux
Hors ligne
Le FDW n'est pas une connexion. C'est un connecteur. Il faudrait déjà savoir d'où proviennent toutes ces connexions, s'il y a bien des connexions, ce qu'elles font, etc.
Guillaume.
Hors ligne
C'est moi qui crée les connexions en testant les functions qui créent les fdws. Ca c'est sûr. Ce n'est personne d'autre. Un exemple :
-- FUNCTION: public.create_fdw_utilities(text, text, text, text)
-- DROP FUNCTION public.create_fdw_utilities(text, text, text, text);
CREATE OR REPLACE FUNCTION public.create_fdw_utilities(
this_host_address text,
this_database_name text,
this_user_name text,
this_password text)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE SECURITY DEFINER
ROWS 0
AS $BODY$
declare
sql_stmt text;
port_number text;
this_table_name text;
begin
port_number = '5432';
drop server if exists fdw_utilities cascade;
sql_stmt = 'create server fdw_utilities '
|| ' foreign data wrapper postgres_fdw '
|| ' options (host'
|| ''''
|| this_host_address
|| ''''
|| ', dbname '
|| ''''
|| this_database_name
|| ''''
|| ', port'
|| ''''
|| port_number
|| ''''
|| ')';
execute sql_stmt;
sql_stmt = 'create user mapping for public '
|| ' server fdw_utilities '
|| ' options (user '
|| ''''
|| this_user_name
|| ''''
|| ', password '
|| ''''
|| this_password
|| ''''
|| ')';
execute sql_stmt;
create foreign table "rubin_permissions" (
pg_user_name text,
permissions text,
db_name text,
pg_server_name text,
pg_server_address text
) server fdw_utilitiesALTER FUNCTION public.create_fdw_utilities(text, text, text, text)
OWNER TO rubin;
options (
schema_name 'public',
table_name 'rubin_permissions'
);
sql_stmt = 'create view public.user_rubin_permissions as select '
|| ' * from rubin_permissions where pg_user_name = '
|| ''''
|| this_user_name
|| '''';
execute sql_stmt;
sql_stmt = 'grant usage on foreign server '
|| this_fdw_server_name
|| ' to '
|| this_user_name;
execute sql_stmt;
sql_stmt = 'grant usage on schema public to '
|| this_user_name;
execute sql_stmt;
sql_stmt = 'grant all on public.user_rubin_permissions to '
|| this_user_name;
execute sql_stmt;
end
ALTER FUNCTION public.create_fdw_utilities(text, text, text, text)
OWNER TO rubin;
$BODY$;
Devrais-je faire un
drop server if exists fdw_utilities cascade;
quand le user quitte le front-end ?
Merci pour votre aide car dans les livres, tout est facile...
"Grise est la théorie, vert est l'arbre de la vie" Goethe ;-))
Hors ligne
le
ALTER FUNCTION public.create_fdw_utilities(text, text, text, text)
après le create foreign table "rubin_permissions" (
est un problème de copier/coller
l'éditeur de pgadmin4 est aussi dangereux que sa procédure d'installation
Hors ligne
En dehors des ALTER FUNCTION, ce code semble correct. Ceci étant dit, ça n'aide pas à savoir ce qui ne va pas. Donc je réitère ma question : quand vous avez ce message d'erreur (Too many connections), combien de connexions y a-t-il sur le serveur sur lequel vous essayez de vous connecter, que font elles, d'où viennent elles ?
Guillaume.
Hors ligne
Encore merci pour votre tenacité.
Je suis le seul, pour le moment à faire des connexions fdw. Parce que je fais des tests qui créent et droppent des fdw servers.
Je pensais que le
drop server if exists fdw_utilities cascade;
devait remettre les pendules à zéro.
Ceci dit, le pg_ctl restart a aujourd'hui terminé (droppé) les connexions.
Et je peux continuer à tester. J'ai des problèmes au niveau des permissions. Si je définis des permissions aux niveau des foreign tables, je suppose que je dois le faire au niveau des tables de base. Non ?
Hors ligne
Le DROP SERVER va forcément couper les connexions vers le serveur en question.
Quant aux permissions, tout dépend de ce que vous cherchez à faire, mais j'aurais tendance à les mettre sur les foreign tables.
Guillaume.
Hors ligne
un grand merci à vous deux !
Hors ligne