En corto
| |
| |
extra_float_digits se puede ignorar sin efectos. options (lo que JDBC y DataGrip usan para -c search_path=…) también se ignora, pero entonces el search_path del cliente no llega: fíjalo en el rol con alter role app set search_path = app, public.
El error
| |
o, según el cliente, pooler error: unsupported startup parameter: extra_float_digits. Directo al puerto 5432 conecta; por el 6432 de pgbouncer, no. Lo mandan JDBC (todo lo que use el driver de PostgreSQL para Java: DBeaver, DataGrip, Spring, Jenkins), Npgsql y algunos ORMs; otros clientes mandan options.
Por qué pasa
Cuando un cliente abre conexión, mete en el paquete de inicio los parámetros de sesión que quiere (extra_float_digits=3, options=-c search_path=app). pgbouncer, en modo transaction o statement, comparte una misma conexión de servidor entre muchos clientes, así que solo deja pasar los parámetros que sabe guardar por cliente y restaurar en el servidor cuando le toca a ese cliente: client_encoding, datestyle, timezone, standard_conforming_strings, application_name. Cualquier otro sería un ajuste que se filtra de un cliente a otro; antes que eso, pgbouncer rechaza la conexión.
Dos formas de resolverlo:
| Opción | Qué hace | Para qué parámetros |
|---|---|---|
ignore_startup_parameters | Acepta el parámetro y lo tira | Los que no cambian nada (extra_float_digits) o los que puedes fijar en otro sitio (options) |
track_extra_parameters | Lo guarda por cliente y lo restaura en el servidor, como hace con timezone | Parámetros que el servidor reporta al cliente (ParameterStatus) y que de verdad necesitas por sesión |
extra_float_digits es inofensivo desde PostgreSQL 12: la salida de float ya es la representación más corta exacta y el parámetro no cambia nada. options con search_path sí importa: ignorado, el cliente verá el search_path por defecto de la base y las consultas sin esquema fallan con relation does not exist. La solución limpia es el rol:
| |
’no such database'
| |
pgbouncer solo enruta bases que estén en [databases]. O añades la entrada, o pones un comodín:
| |
Con *, un cliente que pida otra_db obtiene host=db.example dbname=otra_db; esas entradas automáticas se limpian solas tras autodb_idle_timeout. Y comprueba el dbname= de la entrada: es habitual apuntar app_db a otra base por un copy-paste.
Trampas
RELOADbasta paraignore_startup_parametersy[databases];listen_*yauth_typepiden reinicio.- Modo
transactionySET: unSET search_patha mano en la sesión se pierde en cuanto la conexión de servidor pasa a otro cliente; usaSET LOCALdentro de la transacción o elalter role. - Prepared statements con nombre (JDBC
prepareThreshold,PREPARE) no funcionan en modotransactionen pgbouncer antiguo; desde 1.21,max_prepared_statements = 200los soporta. - SCRAM: con
auth_type = scram-sha-256lauserlist.txtnecesita el hash SCRAM tal cual sale depg_authid, oauth_querypara que pgbouncer lo consulte. SHOW CONFIG;ySHOW DATABASES;en la consola de admin te dicen qué está cargado de verdad, no lo que crees haber escrito.
Ver también: PostgreSQL: cheat sheet de administración. Referencia: pgbouncer.ini.