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 26/02/2018 18:42:46

Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#2 27/02/2018 11:02:50

gleu
Administrateur

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

Ç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

#3 27/02/2018 11:50:50

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#4 27/02/2018 12:07:13

ruizsebastien
Membre

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#5 27/02/2018 15:07:50

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#6 27/02/2018 15:48:23

gleu
Administrateur

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#7 27/02/2018 17:11:47

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#8 27/02/2018 17:15:54

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#9 27/02/2018 17:45:30

gleu
Administrateur

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#10 27/02/2018 17:55:56

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#11 27/02/2018 23:10:43

gleu
Administrateur

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

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

#12 02/03/2018 13:41:39

Re : Foreign DW : DETAIL: FATAL: sorry, too many clients already

un grand merci à vous deux !

Hors ligne

Pied de page des forums