This is the multi-page printable view of this section. .
PgBouncer 1.26.0 Documentation
- 1: Features
- 2: Configuration: pgbouncer.ini
- 3: Usage: pgbouncer command
- 4: PgBouncer compilation and installation
- 5: Source Releases Download
- 6: Changelog
- 7: Community
- 8: Frequently Asked Questions
Source: https://www.pgbouncer.org/
This manual is based on PgBouncer 1.26.0, released on 2026-09-23. See the release notes for the changes from earlier versions.
pgbouncer is a PostgreSQL connection pooler. Applications connect to pgbouncer as they would to a PostgreSQL server. pgbouncer creates a server connection or reuses an existing connection.
pgbouncer reduces the performance cost of opening new PostgreSQL connections.
To preserve transaction semantics, pgbouncer supports these connection pooling modes:
- Session pooling: PgBouncer assigns a server connection to a client for its entire session. When the client disconnects, the connection returns to the pool. This is the default mode and changes connection assignment least often.
- Transaction pooling: PgBouncer assigns a server connection only during a transaction. When the transaction ends, the connection returns to the pool.
- Statement pooling: The connection returns to the pool immediately after each query. This mode changes connection assignment most often and does not allow multi-statement transactions.
1 - Features
Connection pooling modes with different connection reuse intervals:
- Session pooling
- PgBouncer assigns a server connection to a client for its entire session. The connection returns to the pool when the client disconnects. This mode changes connection assignment least often and supports all PostgreSQL features.
- Transaction pooling
- PgBouncer assigns a server connection only during a transaction. The connection returns to the pool when the transaction ends. Some PostgreSQL session features cannot work in this mode. The application must avoid these features. See the table below.
- Statement pooling
- This mode changes connection assignment most often. It uses transaction pooling but disallows multi-statement transactions. It enforces client autocommit mode and mainly targets PL/Proxy.
Low memory use: 2 kB per connection by default. PgBouncer does not need to hold a complete packet at once.
Destination databases can be on different hosts. PgBouncer is not limited to one backend server.
Supports online reconfiguration for most settings.
Supports rolling restarts and upgrades using multiple processes with
so_reuseport. The legacy online restart (-R) was removed in 1.26.0.
SQL feature map for pooling modes
This table shows PostgreSQL feature compatibility with each pooling mode. Transaction pooling changes client expectations of the server by design. Applications must avoid incompatible features.
| Feature | Session pooling | Transaction pooling |
|---|---|---|
| Startup parameters 1 | Yes | Yes |
| SET/RESET | Yes | For tracked parameters 1 |
| LISTEN | Yes | Never |
| NOTIFY | Yes | Yes |
| WITHOUT HOLD CURSOR | Yes | Yes |
| WITH HOLD CURSOR | Yes | Never |
| Protocol-level prepared plans | Yes | Yes 2 |
| PREPARE / DEALLOCATE | Yes | Never |
| ON COMMIT DROP temp tables | Yes | Yes |
| PRESERVE/DELETE ROWS temp tables | Yes | Never |
| Cached plan reset | Yes | Yes |
| LOAD statement | Yes | Never |
| Session-level advisory locks | Yes | Never |
Since 1.26.0, PgBouncer tracks all server-reported parameters that clients can change. These are
application_name,client_encoding,DateStyle,default_transaction_read_only(PostgreSQL 14+),IntervalStyle,scram_iterations(PostgreSQL 16+),search_path(PostgreSQL 18+),session_authorization,standard_conforming_strings, andTimeZone. For parameters that the server does not report, PgBouncer tracks only startup values. It does not track laterSETchanges. Seetrack_extra_parametersandignore_startup_parametersfor details and parameters supplied by extensions. ↩︎ ↩︎Protocol-level prepared statement support requires a non-zero
max_prepared_statements. The default is 200. Set it to 0 to disable support. SQL-levelPREPARE/DEALLOCATEis incompatible with transaction pooling. The exceptions areDEALLOCATE ALLandDISCARD ALLwhen tracking is enabled. ↩︎
2 - Configuration: pgbouncer.ini
Source: https://www.pgbouncer.org/config.html · 1.26.0 source
Description
The configuration file uses INI format. Section names appear between [ and ]. Lines beginning with ; or # are comments and are ignored. Elsewhere in a line, these characters have no special meaning.
Generic settings
logfile
Specifies the log file. For daemonization (-d), either this or syslog need to be set.
PgBouncer keeps the log file open. After rotation, run kill -HUP or console RELOAD;. On Windows, stop and start the service.
Note that setting logfile does not by itself turn off logging to stderr. Use the command-line option -q or -d for that.
Default: not set
pidfile
Specifies the PID file. Without pidfile set, daemonization (-d) is not allowed.
Default: not set
listen_addr
Comma-separated TCP listen addresses. Use * for all addresses. If unset, PgBouncer accepts only Unix socket connections.
Addresses can be specified numerically (IPv4/IPv6) or by name.
Default: not set
listen_port
Which port to listen on. Applies to both TCP and Unix sockets.
Default: 6432
unix_socket_dir
Unix socket directory for listening and server connections. An empty string disables Unix sockets. A value beginning with @ selects the abstract namespace, currently supported on Linux and Windows.
Default: /tmp (empty on Windows)
unix_socket_mode
File system mode for Unix socket. Ignored for sockets in the abstract namespace. Not supported on Windows.
Default: 0777
unix_socket_group
Group name to use for Unix socket. Ignored for sockets in the abstract namespace. Not supported on Windows.
Default: not set
user
If set, specifies the Unix user to change to after startup. Works only if PgBouncer is started as root or if it’s already running as the given user. Not supported on Windows.
Default: not set
pool_mode
Specifies when a server connection can be reused by other clients.
session: Server is released back to pool after client disconnects. Default.transaction: Server is released back to pool after transaction finishes.statement: Server is released back to pool after query finishes. Transactions spanning multiple statements are disallowed in this mode.
max_client_conn
Maximum number of client connections allowed.
Increasing this limit may also require a higher operating system file descriptor limit. PgBouncer can use more than max_client_conn file descriptors. If each client user connects to the server with its own name, the theoretical maximum is:
If a database user is specified in the connection string (all users connect under the same user name), the theoretical maximum is:
Normal workloads should not reach this theoretical maximum; a deliberately constructed workload could. Set the file descriptor limit sufficiently high.
Search for ulimit in your favorite shell man page. Note: ulimit does not apply in a Windows environment.
Default: 100
default_pool_size
Maximum server connections per user/database pair. Per-database or per-user pool_size overrides this value. It applies when neither specifies pool_size.
Default: 20
min_pool_size
Add server connections when the pool is below this minimum. This improves response when normal load returns after inactivity. The pool size caps the effective minimum.
Only enforced for pools where at least one of the following is true:
- the entry in the
[database]section for the pool has a value set for theuserkey (aka forced user) - there is at least one client connected to the pool
Default: 0 (disabled)
reserve_pool_size
How many additional connections to allow to a pool (see reserve_pool_timeout). 0 disables.
Default: 0 (disabled)
reserve_pool_timeout
If a client has not been serviced in this time, use additional connections from the reserve pool. 0 disables. [seconds]
Default: 5.0
max_db_connections
Maximum server connections per database, across all users. This refers to the client-facing PgBouncer database, not the destination PostgreSQL database.
This can also be set per database in the [databases] section.
At the limit, closing a client does not immediately free capacity for another pool. The first pool’s server connection remains open. After its idle timeout closes it, PgBouncer immediately opens a connection for the waiting pool.
Default: 0 (unlimited)
max_db_client_connections
Maximum client connections per database, across all users. This refers to the client-facing PgBouncer database, not the destination PostgreSQL database.
Set this to at least max_db_connections. The difference is the number of database connections that can queue while active connections finish.
This can also be set per database in the [databases] section.
Default: 0 (unlimited)
max_user_connections
Maximum server connections per user, across all databases. The pool user is the configured server connection user, or the client user if no server user is specified.
This can also be set per user in the [users] section.
At the limit, closing a client does not immediately free capacity for another pool. The first pool’s server connection remains open. After its idle timeout closes it, PgBouncer immediately opens a connection for the waiting pool.
Default: 0 (unlimited)
max_user_client_connections
Maximum client connections per user, across all databases. Set it above max_user_connections. The difference between max_user_connections and max_user_client_connections is the maximum queue size for that user.
This can also be set per user in the [users] section.
Default: 0 (unlimited)
server_round_robin
By default, PgBouncer reuses connections in LIFO order: last in, first out. A few connections therefore receive most load. This performs best with one database server. For TCP, DNS, or host-list round-robin routing, enable round-robin reuse in PgBouncer to distribute load evenly.
Default: 0
track_extra_parameters
By default, PgBouncer tracks all the parameters that Postgres reports to the client and that can be changed by the client:
application_nameclient_encodingDateStyledefault_transaction_read_onlyIntervalStylescram_iterations(since PostgreSQL version 16)search_path(since PostgreSQL version 18)session_authorizationstandard_conforming_stringsTimeZone
List additional parameters here to keep them in the client variable cache. PgBouncer restores their server values whenever the client becomes active.
If you need to specify multiple values, use a comma-separated list (e.g. some_extension.setting, other_extension.setting)
Note: Most parameters cannot be fully tracked. PgBouncer learns SET changes only for parameters reported by Postgres. See the reported parameter list. Extensions can report new parameters or existing parameters that Postgres does not normally report. Citus 12.0+ reports search_path.
Some default tracked parameters require newer Postgres versions for reporting: default_transaction_read_only requires 14, scram_iterations requires 16, and search_path requires 18.
For unreported parameters, PgBouncer knows only values supplied in the client startup packet or its options parameter. For example, this applies to search_path before Postgres 18. When the client becomes active, PgBouncer applies its startup value. For clients without a supplied value, it restores the default. Later SET changes are not tracked and can affect other clients sharing the connection unless server_reset_query_always is used.
Postgres accepts parameters directly in the startup packet or inside options. track_extra_parameters supports both methods. List the parameters inside options; you cannot list options itself.
Default: empty
ignore_startup_parameters
By default, startup packets can contain only tracked parameters; see track_extra_parameters. Other parameters cause an error. List additional parameters here to let PgBouncer ignore them because the administrator manages them.
If you need to specify multiple values, use a comma-separated list (e.g. options,extra_float_digits)
Postgres accepts parameters directly in the startup packet or inside options. ignore_startup_parameters supports both methods. You can also list options itself to ignore every unknown parameter inside it.
Default: empty
peer_id
Identifier for this PgBouncer process within its peer group. Each peer_id must be unique in the group. A value of 0 disables peering. The maximum is 16383. See [peers] for details.
Default: 0
disable_pqexec
Disable Simple Query protocol (PQexec). Unlike Extended Query, Simple Query permits multiple queries per packet, which enables some SQL injection attacks. Disabling it can improve security. Only clients that exclusively use Extended Query continue to work.
Default: 0
application_name_add_host
Add the client host address and port to the application name at connection startup. This helps identify query sources. It applies only at startup. PgBouncer does not alter later SET changes to application_name.
Default: 0
conffile
Show location of current config file. Changing it will make PgBouncer use another config file for next RELOAD / SIGHUP.
Default: file from command line
service_name
Used on win32 service registration.
Default: pgbouncer
job_name
Alias for service_name.
stats_period
Sets how often the averages shown in various SHOW commands are updated and how often aggregated statistics are written to the log (but see log_stats). [seconds]
Default: 60
max_prepared_statements
A non-zero value enables protocol-level named prepared statement tracking in transaction and statement pooling. PgBouncer makes each client statement available on its assigned server connection, even if another connection originally prepared it.
PgBouncer assigns each unique prepared query string an internal name, PGBOUNCER_{unique_id}. Identical strings share a name, even across clients. PostgreSQL receives only this internal name. PgBouncer tracks each client’s statement names and rewrites commands before forwarding them, for example from my_prepared_statement to PGBOUNCER_123. If the assigned server has not prepared the statement, PgBouncer prepares it before execution. This can occur when a client receives a different server connection.
Note: SQL-level PREPARE, EXECUTE, and DEALLOCATE commands are not tracked or rewritten. PgBouncer forwards them directly to Postgres. The exceptions are DEALLOCATE ALL and DISCARD ALL: these clear the tracked statements for the requesting client.
This value limits prepared statements in each server connection’s LRU cache. A value of 0 disables support in transaction and statement pooling. For best performance, use a value above the number of commonly used application statements. Higher values increase PostgreSQL memory per connection because more statements remain prepared. They also increase PgBouncer memory use for query strings.
PgBouncer limits memory use in two ways:
- Each unique query is stored once in a global cache.
- Each client uses a packet rewrite buffer, at most four times
pkt_buf. This maximum is reached only when prepared queries are between two and four timespkt_buf.
So if you consider the following as an example scenario:
- There are 1000 active clients
- The clients prepare 200 unique queries
- The average size of a query is 5kB
pkt_bufparameter is set to the default of 4096 (4kB)
Then, PgBouncer needs at most the following amount of memory to handle these prepared statements:
Prepared statement tracking also increases CPU use because PgBouncer inspects and rewrites commands. To use multiple cores, run multiple instances on one port. See so_reuseport.
Prepared statements reduce repeated query parsing and planning, as with direct PostgreSQL connections. PgBouncer also reuses statements prepared by other clients on the same server connection. For example, with pool_size 20 and 100 clients preparing an identical query, PostgreSQL prepares and parses it only 20 times.
If a reused statement’s return or argument types change between executions, PostgreSQL currently raises an error such as:
Do not use identical query strings with different expected argument or result types across clients. This problem commonly occurs during DDL migrations that add columns or change column types. After migration, run RECONNECT in the admin console to force statement preparation again and clear the error.
Default: 200
scram_iterations
Number of iterations for SCRAM-SHA-256 password encryption. Higher values strengthen protection against brute-force attacks on stored passwords but slow authentication.
Default: 4096
Authentication settings
PgBouncer handles its own client authentication and has its own database of users. These settings control this.
auth_type
How to authenticate users.
cert: Client must connect over TLS connection with a valid client certificate. The user name is then taken from the CommonName field from the certificate.md5: Use MD5-based password check. This is the default authentication method.auth_filemay contain both MD5-encrypted and plain-text passwords. Ifmd5is configured and a user has a SCRAM secret, then SCRAM authentication is used automatically instead.scram-sha-256: Use password check with SCRAM-SHA-256.auth_filehas to contain SCRAM secrets or plain-text passwords.plain: The clear-text password is sent over the wire. Deprecated.trust: No authentication is done. The user name must still exist inauth_file.any: Like thetrustmethod, but the user name given is ignored. Requires that all databases are configured to log in as a specific user. Additionally, the console database allows any user to log in as a statistics user; users listed inadmin_usersreceive administrator privileges.hba: The actual authentication type is loaded fromauth_hba_file. This allows different authentication methods for different access paths, for example: connections over Unix socket use thepeerauthentication method, connections over TCP must use TLS.ldap: Users are authenticated against an LDAP server, like in PostgreSQL (see https://www.postgresql.org/docs/current/auth-ldap.html for details). The LDAP connection options are configured using the settingauth_ldap_options, or alternatively in theauth_hba_file.pam: PAM is used to authenticate users,auth_fileis ignored. This method is not compatible with databases using theauth_useroption. The service name reported to PAM is “pgbouncer”.pamis not supported in the HBA configuration file.
auth_hba_file
HBA configuration file to use when auth_type is hba. See section HBA file format below about details.
Default: not set
auth_ident_file
Identity map file to use when auth_type is hba and a user map will be defined. See section Ident map file format below about details.
Default: not set
auth_file
The name of the file to load user names and passwords from. See section Authentication file format below about details.
Most authentication types (see above) require that either auth_file or auth_user be set; otherwise there would be no users defined.
Default: not set
auth_user
With auth_user, PgBouncer uses auth_query to retrieve users absent from auth_file from database pg_authid. It connects as auth_user using that user’s password from auth_file. If auth_user needs no password, it need not appear in auth_file.
Direct access to pg_authid requires admin rights. It’s preferable to use a non-superuser that calls a SECURITY DEFINER function instead.
Default: not set
auth_query
Query to load user’s password from database.
Direct access to pg_authid requires admin rights. It’s preferable to use a non-superuser that calls a SECURITY DEFINER function instead.
Note that the query is run inside the target database. So if a function is used, it needs to be installed into each database.
The query must return user name and encrypted or hashed password columns. For a nonexistent user, return no rows or a row with a null user name. The default query returns no rows. A null user name is useful with record-returning functions; see Examples. A null password means the user exists but has no usable password. PgBouncer then rejects every supplied password.
Default: SELECT rolname, CASE WHEN rolvaliduntil < now() THEN NULL ELSE rolpassword END FROM pg_authid WHERE rolname=$1 AND rolcanlogin
auth_dbname
Database name in the [database] section to be used for authentication purposes. This option can be either global or overridden in the connection string if this parameter is specified.
auth_ldap_options
LDAP connection options to use if auth_type is ldap. (Not used if authentication is configured via auth_hba_file.) Example:
Log settings
syslog
Toggles syslog on/off. On Windows, the event log is used instead.
Default: 0
syslog_ident
Under what name to send logs to syslog.
Default: pgbouncer (program name)
syslog_facility
Under what facility to send logs to syslog. Possibilities: auth, authpriv, daemon, user, local0-7.
Default: daemon
log_connections
Log successful logins.
Default: 1
log_disconnections
Log disconnections with reasons.
Default: 1
log_pooler_errors
Log error messages the pooler sends to clients.
Default: 1
log_stats
Write aggregated statistics into the log, every stats_period. This can be disabled if external monitoring tools are used to grab the same data from SHOW commands.
Default: 1
verbose
Increase verbosity. Mirrors the -v switch on the command line. For example, using -v -v on the command line is the same as verbose=2. 3 is the highest currently-supported verbosity.
Default: 0
Console access control
admin_users
Comma-separated list of database users that are allowed to connect and run all commands on the console. With auth_type=any, this list still determines who receives administrator privileges; other users can log in as statistics users. See the 1.26.0 console access checks.
Default: empty
stats_users
Comma-separated list of database users that are allowed to connect and run read-only queries on the console. That means all SHOW commands.
Default: empty
Connection sanity checks, timeouts
server_reset_query
Query sent when a server connection is released, before another client uses it. No transaction is active at this point. Do not include ABORT or ROLLBACK.
The query clears session changes so the next client receives a known state. The default DISCARD ALL clears everything, including cached state. A lighter query, such as DEALLOCATE ALL, removes only prepared statements. Use a lighter query only if retained state does not break the application.
Transaction pooling does not use server_reset_query. Clients must avoid session features because transactions can use different connections and session states.
Default: DISCARD ALL
server_reset_query_always
Controls whether server_reset_query runs in all pooling modes. When disabled, the default, it runs only in session pooling. Transaction pooling should not need a reset query.
Use this to work around applications that incorrectly use session features with transaction pooling. State loss becomes predictable: clients lose session state after every transaction.
Default: 0
server_check_delay
How long to keep released connections available for immediate re-use, without running server_check_query on it. If 0 then the check is always run.
Default: 30.0
server_check_query
Simple do-nothing query to check if the server connection is alive.
If an empty string, then sanity checking is disabled.
If <empty> then send empty query as sanity check.
Default: <empty>
server_fast_close
In session pooling, close a server marked “close_needed” immediately if idle, or after its current transaction. This avoids waiting for session end. RECONNECT, changed connection settings on RELOAD, or DNS changes set “close_needed”. Statement and transaction pooling already behave this way, so the setting has no effect there.
If this setting closes a server before client session end, PgBouncer also closes the client connection. The client can then detect the interruption.
This applies connection changes sooner during long sessions. Applications must reconnect and restore session state after interruptions. Running transactions are not interrupted, so no transactions are lost; only idle sessions are closed.
Default: 0
server_lifetime
Close unused server connections older than this interval. Unused means not linked to a client. A value of 0 permits one use before closure. [seconds]
This can also be set per database in the [databases] section.
Default: 3600.0
server_idle_timeout
If a server connection has been idle more than this many seconds it will be closed. If 0 then this timeout is disabled. [seconds]
Default: 600.0
server_connect_timeout
If connection and login don’t finish in this amount of time, the connection will be closed. [seconds]
Default: 15.0
server_login_retry
After a connection or authentication failure, wait this interval before another server login attempt. During the interval, new clients receive an immediate error without another attempt. [seconds]
This prevents clients from queuing for an unavailable server. However, a brief failure, such as restart or configuration error, still delays retries by this interval. Use PAUSE for planned restarts to avoid this delay.
Default: 15.0
client_login_timeout
If a client connects but does not manage to log in in this amount of time, it will be disconnected. [seconds]
Default: 60.0
autodb_idle_timeout
If the automatically created (via *) database pools have been unused this many seconds, they are freed. The negative aspect of that is that their statistics are also forgotten. [seconds]
Default: 3600.0
pool_idle_timeout
Free a database/user pool after it has no clients or servers for this interval. Unlike autodb_idle_timeout, this frees individual pools, not entire automatically created databases. Unlike server_idle_timeout, it frees the pool itself, but only when completely empty.
As with autodb_idle_timeout, freeing a pool discards its statistics. Per-database SHOW STATS totals sum only current pools, so totals decrease after removal. Monitoring may interpret this as a counter reset. This setting is therefore disabled by default. A value of 0 disables it. [seconds]
Default: 0 (disabled)
dns_max_ttl
How long DNS lookups can be cached. The actual DNS TTL is ignored. [seconds]
Default: 15.0
dns_nxdomain_ttl
How long DNS errors and NXDOMAIN DNS lookups can be cached. [seconds]
Default: 15.0
dns_zone_check_period
Period to check if a zone serial has changed.
PgBouncer derives DNS zones from the part of each host name after the first dot. It checks zone serials periodically. After a serial change, it looks up every host in that zone again. A changed host IP invalidates its connections.
Works only with c-ares backend (configure option --with-cares).
Default: 0.0 (disabled)
resolv_conf
The location of a custom resolv.conf file. This is to allow specifying custom DNS servers and perhaps other name resolution options, independent of the global operating system configuration.
Requires evdns (>= 2.0.3) or c-ares (>= 1.15.0) backend.
The parsing of the file is done by the DNS backend library, not PgBouncer, so see the library’s documentation for details on allowed syntax and directives.
Default: empty (use operating system defaults)
query_wait_notify
Time that a client will be queued for before PgBouncer sends a notification message that they are being queued. [seconds]
A value of 0 disables this notification message.
Default: 5
login_notify_message
Welcome notify message that is sent to the client after a login is successful. Can be used to ensure that clients understand that they are connecting to pgbouncer instead of postgres directly.
Default: empty (no welcome message sent)
TLS settings
After RELOAD, new connections use changed certificate or key file contents, even if filenames are unchanged. Existing connections remain open. To apply replacement files promptly to all connections for security reasons, run RECONNECT after RELOAD.
Changing any TLS settings will trigger a RECONNECT automatically for security reasons.
client_tls_sslmode
Client TLS mode. TLS is disabled by default. To enable it, also set client_tls_key_file and client_tls_cert_file for the accepting key and certificate. PEM is the most common supported certificate format.
disable: Plain TCP. If client requests TLS, it’s ignored. Default.allow: If client requests TLS, it is used. If not, plain TCP is used. If the client presents a client certificate, it is not validated.prefer: Same asallow.require: Client must use TLS. If not, the client connection is rejected. If the client presents a client certificate, it is not validated.verify-ca: Client must use TLS with valid client certificate.verify-full: Same asverify-ca.
client_tls_key_file
Private key for PgBouncer to accept client connections.
Default: not set
client_tls_cert_file
Certificate for private key. Clients can validate it.
Default: not set
client_tls_ca_file
Root certificate file to validate client certificates.
Default: not set
client_tls_protocols
Which TLS protocol versions are allowed. Allowed values: tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3. Shortcuts: all (tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3), secure (tlsv1.2,tlsv1.3).
Default: secure
client_tls_ciphers
Allowed TLS ciphers, in OpenSSL syntax. Shortcuts:
default/secure/fast/normal(these all use system wide OpenSSL defaults)all(enables all ciphers, not recommended)
Only connections using TLS version 1.2 and lower are affected. For version 1.3 see client_tls13_ciphers below.
Default: default
client_tls13_ciphers
Allowed TLS v1.3 ciphers. When empty it will use the value of client_tls_ciphers. Allowed values:
TLS_AES_256_GCM_SHA384TLS_CHACHA20_POLY1305_SHA256TLS_AES_128_GCM_SHA256TLS_AES_128_CCM_8_SHA256TLS_AES_128_CCM_SHA256
Only connections using TLS version 1.3 and higher are affected. For version 1.2 and lower see client_tls_ciphers.
Default: <empty>
client_tls_ecdhcurve
Elliptic Curve name to use for ECDH key exchanges.
Allowed values: none (DH is disabled), auto (256-bit ECDH), curve name
Default: auto
client_tls_dheparams
DHE key exchange type.
Allowed values: none (DH is disabled), auto (2048-bit DH), legacy (1024-bit DH)
Default: auto
server_tls_sslmode
TLS mode to use for connections to PostgreSQL servers. The default mode is prefer.
disable: Plain TCP. TLS is not even requested from the server.allow: FIXME: if server rejects plain, try TLS?prefer: TLS connection is always requested first from PostgreSQL. If refused, the connection will be established over plain TCP. Server certificate is not validated. Default.require: Connection must go over TLS. If server rejects it, plain TCP is not attempted. Server certificate is not validated.verify-ca: Connection must go over TLS and server certificate must be valid according toserver_tls_ca_file. Server host name is not checked against certificate.verify-full: Connection must go over TLS and server certificate must be valid according toserver_tls_ca_file. Server host name must match certificate information.
server_tls_ca_file
Root certificate file to validate PostgreSQL server certificates.
Default: not set
server_tls_key_file
Private key for PgBouncer to authenticate against PostgreSQL server.
Default: not set
server_tls_cert_file
Certificate for private key. PostgreSQL server can validate it.
Default: not set
server_tls_protocols
Which TLS protocol versions are allowed. Allowed values: tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3. Shortcuts: all (tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3), secure (tlsv1.2,tlsv1.3), legacy (all).
Default: secure
server_tls_ciphers
Allowed TLS ciphers, in OpenSSL syntax. Shortcuts:
default/secure/fast/normal(these all use system wide OpenSSL defaults)all(enables all ciphers, not recommended)
Only connections using TLS version 1.2 and lower are affected. For version 1.3 see server_tls13_ciphers below.
Default: default
server_tls13_ciphers
Allowed TLS v1.3 ciphers. When empty it will use the value of server_tls_ciphers. Allowed values:
TLS_AES_256_GCM_SHA384TLS_CHACHA20_POLY1305_SHA256TLS_AES_128_GCM_SHA256TLS_AES_128_CCM_8_SHA256TLS_AES_128_CCM_SHA256
Only connections using TLS version 1.3 and higher are affected. For version 1.2 and lower see server_tls_ciphers.
Default: <empty>
Dangerous timeouts
Setting the following timeouts can cause unexpected errors.
query_timeout
Queries running longer than that are canceled. This should be used only with a slightly smaller server-side statement_timeout, to apply only for network problems. [seconds]
Default: 0.0 (disabled)
query_wait_timeout
Maximum time queries are allowed to spend waiting for execution. If the query is not assigned to a server during that time, the client is disconnected. 0 disables. If this is disabled, clients will be queued indefinitely. [seconds]
This setting is used to prevent unresponsive servers from grabbing up connections. It also helps when the server is down or rejects connections for any reason.
This setting can also be configured per database and per user. The precedence is user, then database, then global. An explicit 0 at the selected level disables this timeout. See the 1.26.0 timeout selection code.
Default: 120.0
cancel_wait_timeout
Maximum time cancellation requests are allowed to spend waiting for execution. If the cancel request is not assigned to a server during that time, the client is disconnected. 0 disables. If this is disabled, cancel requests will be queued indefinitely. [seconds]
This setting is used to prevent a client locking up when a cancel cannot be forwarded due to the server being down.
Default: 10.0
client_idle_timeout
Client connections idling longer than this many seconds are closed. This should be larger than the client-side connection lifetime settings, and only used for network problems. [seconds]
Default: 0.0 (disabled)
idle_transaction_timeout
If a client has been in “idle in transaction” state longer, it will be disconnected. [seconds]
Default: 0.0 (disabled)
transaction_timeout
If a client has been in “in transaction” state longer, it will be disconnected. [seconds]
Default: 0.0 (disabled)
Low-level network settings
pkt_buf
Internal buffer size for packets. Affects size of TCP packets sent and general memory usage. Actual libpq packets can be larger than this, so no need to set it large.
Default: 4096
max_packet_size
Maximum size for PostgreSQL packets that PgBouncer allows through. One packet is either one query or one result set row. The full result set can be larger.
Default: 2147483647
listen_backlog
Backlog argument for listen(2). Determines how many new unanswered connection attempts are kept in the queue. When the queue is full, further new connections are dropped.
Default: 128
sbuf_loopcnt
How many times to process data on one connection, before proceeding. Without this limit, one connection with a big result set can stall PgBouncer for a long time. One loop processes one pkt_buf amount of data. 0 means no limit.
Default: 5
so_reuseport
Set SO_REUSEPORT on TCP listening sockets. On supported systems, multiple PgBouncer instances can share a host and port, and the kernel distributes connections. This uses multiple CPU cores. Each PgBouncer instance has one thread and uses one core.
Behavior depends on the kernel. At the time of writing, sufficiently recent Linux, DragonFlyBSD, and FreeBSD support the intended distribution. FreeBSD uses SO_REUSEPORT_LB. Other systems may permit port sharing but send all connections to one process. See your operating system’s setsockopt() documentation.
On systems that don’t support the socket option at all, turning this setting on will result in an error.
Each instance on one host needs distinct unix_socket_dir and pidfile settings, plus distinct logfile if used. TCP/IP can no longer select a specific instance. Consider this when collecting monitoring data and metrics.
Configure peering between processes so query cancellation continues to work. See peer_id, peers, and the example using peering with so_reuseport.
Default: 0
tcp_defer_accept
Sets the TCP_DEFER_ACCEPT socket option; see man 7 tcp for details. (This is a Boolean option: 1 means enabled. The actual value set if enabled is currently hardcoded to 45 seconds.)
This is currently only supported on Linux.
Default: 1 on Linux, otherwise 0
tcp_socket_buffer
Default: not set
tcp_keepalive
Turns on basic keepalive with OS defaults.
On Linux, the system defaults are tcp_keepidle=7200, tcp_keepintvl=75, tcp_keepcnt=9. They are probably similar on other operating systems.
Default: 1
tcp_keepcnt
Default: not set
tcp_keepidle
Default: not set
tcp_keepintvl
Default: not set
tcp_user_timeout
Sets TCP_USER_TIMEOUT: maximum milliseconds that transmitted data can remain unacknowledged before forced connection closure. A value of 0 uses the operating system default.
This is currently only supported on Linux.
Default: 0
Section [databases]
The [databases] section defines client-facing database names and connection destinations. Use key=value entries:
The key is the database name. The value contains key=value connection parameters described below. Syntax resembles libpq, but PgBouncer does not use libpq and supports different features. For example:
The database name can contain characters _0-9A-Za-z without quoting. Names that contain other characters need to be quoted with standard SQL identifier quoting: double quotes, with "" for a single instance of a double quote.
The database name pgbouncer is reserved for the admin console and cannot be used as a key here.
* acts as a fallback database: If the exact name does not exist, its value is taken as connection string for the requested database. For example, if there is an entry (and no other overriding entries)
then a connection to PgBouncer specifying a database bar will effectively behave as if an entry
exists (taking advantage of the default for dbname being the client-side database name; see below).
Such automatically created database entries are cleaned up if they stay idle longer than the time specified by the autodb_idle_timeout parameter.
dbname
Destination database name.
Default: same as client-side database name
host
Destination host name or IP address. PgBouncer resolves names at connection time and caches results for dns_max_ttl. If DNS results change, it closes old connections on release according to pooling mode. New connections use the changed result immediately. Multiple DNS results are used in round-robin order.
If the value begins with /, then a Unix socket in the file-system namespace is used. If the value begins with @, then a Unix socket in the abstract namespace is used.
You can specify comma-separated host names or addresses for round-robin connections. If a host also resolves to multiple IP addresses, the two round-robin mechanisms operate independently. This implementation detail can change. Every listed host must remain available: this list has no mechanism to skip unreachable hosts or select available ones. This differs from libpq host lists.
Host selection affects new connections only. See server_round_robin for assignment to existing server connections.
Examples:
Default: not set, meaning to use a Unix socket
port
Default: 5432
user
If user= is set, all connections to the destination database will be done with the specified user, meaning that there will be only one pool for this database.
Otherwise, PgBouncer logs into the destination database with the client user name, meaning that there will be one pool per user.
password
If no password is specified here, the password from the auth_file will be used for the user specified above. Dynamic forms of password discovery such as auth_query are not currently supported.
auth_user
Override of the global auth_user setting, if specified.
auth_query
Override of the global auth_query setting, if specified. The entire SQL statement needs to be enclosed in single quotes.
auth_dbname
Override of the global auth_dbname setting, if specified.
pool_size
Set the maximum size of pools for this database. If not set, the default_pool_size is used.
min_pool_size
Set the minimum pool size for this database. If not set, the global min_pool_size is used.
Only enforced if at least one of the following is true:
- this entry in the
[database]section has a value set for theuserkey (aka forced user) - there is at least one client connected to the pool
reserve_pool_size
Set additional connections for this database. If not set, the global reserve_pool_size is used. For backwards compatibility reasons reserve_pool is an alias for this option.
connect_query
Query to be executed after a connection is established, but before allowing the connection to be used by any clients. If the query raises errors, they are logged but ignored otherwise.
pool_mode
Set the pool mode specific to this database. If not set, the default pool_mode is used.
query_wait_timeout
Maximum time queries are allowed to spend waiting for execution. 0 disables. Omit this setting to inherit the applicable default. [seconds]
See description of the global query_wait_timeout setting for additional detail.
A user-level query_wait_timeout overrides this database setting. If neither is set, the global query_wait_timeout is used.
load_balance_hosts
When a comma-separated list is specified in host, load_balance_hosts controls which entry is chosen for a new connection.
Note: This setting controls multiple connection-string hosts, but not multiple IP addresses returned for one DNS name. A future release may extend it to both methods.
round-robin: A new connection attempt chooses the next host entry in the list.disable: A new connection continues using the same host entry until a connection fails, after which the next host entry is chosen.
It is recommended to set server_login_retry lower than the default to ensure fast retries when multiple hosts are available.
Default: round-robin
max_db_connections
Configure a database-wide maximum of server connections (i.e. all pools within the database will not have more than this many server connections).
max_db_client_connections
Configure a database-wide client connection maximum. Should be used in conjunction with max_client_conn to limit the number of connections that PgBouncer is allowed to accept.
server_lifetime
Configure the server_lifetime per database. If not set the database will fall back to the instance wide configured value for server_lifetime.
client_encoding
Ask specific client_encoding from server.
datestyle
Ask specific datestyle from server.
timezone
Ask specific timezone from server.
Section [users]
This section contains key=value lines like
where the key will be taken as a user name and the value as a list of key=value pairs of configuration settings specific for this user. Example:
Only a few settings are available here.
If a user appears in [users] but not in configured auth_file, PgBouncer uses auth_query when auth_user is set. Without auth_user, PgBouncer treats the user as existing but accepts no password. It does not return “no such user”.
pool_size
Set the maximum size of pools for all connections from this user. If not set, the database or default_pool_size is used.
reserve_pool_size
Set the number of additional connections to allow to a pool for this user. If not set, the database configuration or the global reserve_pool_size is used.
pool_mode
Set the pool mode to be used for all connections from this user. If not set, the database or default pool_mode is used.
max_user_connections
Configure a maximum for the user of server connections (i.e. all pools with the user will not have more than this many server connections).
query_timeout
Set the maximum number of seconds that a user query can run for. If set this timeout overrides the server level query_timeout described above.
query_wait_timeout
Maximum time queries are allowed to spend waiting for execution. 0 disables. Omit this setting to inherit the applicable default. [seconds]
See description of the global query_wait_timeout setting for additional detail.
This setting overrides both the database and global query_wait_timeout. If not set, the database setting is used, falling back to the global value.
idle_transaction_timeout
Set the maximum number of seconds that a user can have an idle transaction open. If set this timeout overrides the server level idle_transaction_timeout described above.
transaction_timeout
Set the maximum number of seconds that a user can have a transaction open. If set this timeout overrides the server level transaction_timeout described above.
client_idle_timeout
Set the maximum amount of time in seconds that a client is allowed to idly connect to the PgBouncer instance. If set this timeout overrides the server level client_idle_timeout described above.
Please note that this is a potentially dangerous timeout.
max_user_client_connections
Configure a maximum for the user of client connections. This is the user equivalent of the max_client_conn setting.
Section [peers]
The section [peers] defines the peers that PgBouncer can forward cancellation requests to and where those cancellation requests will be routed.
Define peer_id and [peers] in each process configuration to create a peer group. Peers forward cancellation requests to the process handling the query. This is necessary when processes, possibly on different servers, share a TCP load balancer. Query cancellation uses a separate TCP connection, so the balancer can route it to a different process. Peering forwards it to the correct process. See this conference talk for details.
The section contains key=value lines like
The key is peer_id. The value contains key=value connection parameters described below. Syntax resembles libpq, but PgBouncer does not use libpq and supports different features. For example:
Note 1: Every process needs a unique peer_id within the group. [peers] should list each peer ID; see the examples below. It may also list the current process’s peer_id, but this entry is ignored. This permits identical [peers] sections across process configurations.
Note 2: Peering supports different versions only if all peers are on the same side of the v1.21.0 boundary. Version 1.21.0 changed cancellation token encoding incompatibly with earlier versions.
host
Destination host name or IP address. PgBouncer resolves names at connection time and caches results for dns_max_ttl. It uses multiple DNS results in round-robin order. Avoid names with multiple IP addresses: cancellation can reach the wrong node and need forwarding again. Forwarding is allowed at most three times.
If the value begins with /, then a Unix socket in the file-system namespace is used. If the value begins with @, then a Unix socket in the abstract namespace is used.
Examples:
port
Default: 6432
pool_size
Maximum concurrent cancellation requests to this peer. Requests often arrive in bursts when Postgres slows or fails. Set pool_size high enough to handle these bursts.
If not set, the default_pool_size is used.
Include directive
The PgBouncer configuration file can contain include directives, which specify another configuration file to read and process. This allows splitting the configuration file into physically separate parts. The include directives look like this:
If the file name is not an absolute path, it is taken as relative to the current working directory.
Authentication file format
This section describes the format of the file specified by the auth_file setting. It is a text file in the following format:
Each line needs at least two double-quoted fields. The first is the user name. The second is a plain-text password, MD5-hashed password, or SCRAM secret. PgBouncer ignores additional fields. Escape a double quote by writing it twice.
PostgreSQL MD5-hashed password format:
So user admin with password 1234 will have MD5-hashed password md545f2603610af569b6155c45067268c6b.
PostgreSQL SCRAM secret format:
See the PostgreSQL documentation and RFC 5803 for details on this.
The authentication file serves two purposes. It verifies incoming passwords when client authentication uses passwords. It also supplies backend passwords when the server requires password authentication, unless a database connection string supplies one directly.
Limitations
If the password is stored in plain text, it can be used for any password-based authentication used in the backend server; plain text, MD5 or SCRAM (see https://www.postgresql.org/docs/current/auth-password.html for details).
MD5-hashed passwords can be used if backend server uses MD5 authentication (or specific users have MD5-hashed passwords).
SCRAM server login requires SCRAM client authentication, no user name in the PgBouncer database definition, and identical PgBouncer and PostgreSQL secrets. The salt and iteration count must match, not only the password. SCRAM security prevents deriving login credentials from the stored secret alone.
Write the file manually or generate it from another user/password list. The sample ./etc/mkauth.py generates it from pg_authid. Alternatively, use auth_query instead of auth_file to avoid a separate authentication file.
Note on managed servers
For SCRAM backend authentication, PgBouncer must know the plain-text password or the corresponding SCRAM secret.
Some cloud providers, such as AWS RDS, block password access through sensitive PostgreSQL system tables. Even rds_superuser members receive ERROR: permission denied for table pg_authid from select * from pg_authid. See the AWS blog.
You cannot retrieve an existing SCRAM secret from such a managed server. To use an identical secret on both sides, generate it before storage:
Generate a SCRAM secret for your chosen password with a tool that displays it. For example, psql --echo-hidden displays the secret from \password before sending it to the server:
Note down the SCRAM secret from the QUERY and set it in PgBouncer’s userlist.txt.
If you used another tool instead of psql --echo-hidden, also set the secret on the server. Use ALTER ROLE <role_name> PASSWORD '<scram_secret>'.
HBA file format
The location of the HBA file is specified by the setting auth_hba_file. It is only used if auth_type is set to hba.
The file follows the format of the PostgreSQL pg_hba.conf file (see https://www.postgresql.org/docs/current/auth-pg-hba-conf.html).
- Supported record types:
local,host,hostssl,hostnossl. - Database field: Supports
all,replication,sameuser,@file, multiple names. Not supported:samerole,samegroup. - User name field: Supports
all,@file, multiple names. Not supported:+groupname. - Address field: Supports
all, IPv4, IPv6. Not supported:samehost,samenet, DNS names, domain prefixes. - Auth-method field: Only methods supported by PgBouncer’s
auth_typeare supported, pluspeerandreject, but exceptanyandpam, which only work globally. - User name map (
map=) parameter is supported whenauth_typeiscertorpeer.
Ident map file format
The location of the ident map file is specified by the setting auth_ident_file. It is only loaded if auth_type is set to hba.
The file format is a simplified variation of the PostgreSQL ident map file (see https://www.postgresql.org/docs/current/auth-username-maps.html).
- Supported lines are only of the form
map-name system-username database-username. - There is no support for including file/directory.
- System-username field: Not supported: regular expressions.
- Database-username field: Supports
allor a single Postgres user name. Not supported:+groupname, regular expressions.
Examples
Small example configuration:
Database examples:
Example of a secure function for auth_query:
Example configs for 2 peered PgBouncer processes to create a multi-core PgBouncer setup using so_reuseport. The config for the first process:
The config for the second process:
See also
pgbouncer(1) - man page for general usage, console commands
3 - Usage: pgbouncer command
Source: https://www.pgbouncer.org/usage.html · 1.26.0 source
Synopsis
pgbouncer [-d][-v][-u user] <pgbouncer.ini>
pgbouncer -V|-h
On Windows, the options are:
pgbouncer.exe [-v][-u user] <pgbouncer.ini>
pgbouncer.exe -V|-h
Additional options for setting up a Windows service:
pgbouncer.exe --regservice <pgbouncer.ini>
pgbouncer.exe --unregservice <pgbouncer.ini>
Description
pgbouncer is a PostgreSQL connection pooler. Applications connect to pgbouncer as they would to PostgreSQL. pgbouncer creates a server connection or reuses an existing one.
pgbouncer reduces the performance cost of opening new PostgreSQL connections.
To preserve transaction semantics, pgbouncer supports these pooling modes:
- Session pooling
PgBouncer assigns a server connection for the full client session. The connection returns to the pool when the client disconnects. This is the default mode and changes connection assignment least often.
- Transaction pooling
PgBouncer assigns a server connection only during a transaction. The connection returns to the pool when the transaction ends.
- Statement pooling
The server connection returns to the pool immediately after each query. This mode changes connection assignment most often. Multi-statement transactions cannot work and are disallowed.
Connect to the virtual pgbouncer database to use its administration interface. This interface provides additional SHOW commands.
Since 1.26.0, PgBouncer sends three ParameterStatus values at client login: pgbouncer.version, pgbouncer.pool_mode, and pgbouncer.max_prepared_statements. Drivers can detect PgBouncer and adapt their behavior. Optional login_notify_message sends a welcome NOTICE after successful login.
Quick-start
Basic setup and usage is as follows.
Create a pgbouncer.ini file. Details in pgbouncer(5). Simple example:
[databases] template1 = host=localhost port=5432 dbname=template1 [pgbouncer] listen_port = 6432 listen_addr = localhost auth_type = md5 auth_file = userlist.txt logfile = pgbouncer.log pidfile = pgbouncer.pid admin_users = someuserCreate a
userlist.txtfile that contains the users allowed in:"someuser" "same_password_as_in_server"Launch pgbouncer:
$ pgbouncer -d pgbouncer.iniHave your application (or the psql client) connect to pgbouncer instead of directly to the PostgreSQL server:
$ psql -p 6432 -U someuser template1Manage pgbouncer by connecting to the special administration database pgbouncer and issuing
SHOW HELP;to begin:$ psql -p 6432 -U someuser pgbouncer pgbouncer=# SHOW HELP; NOTICE: Console usage DETAIL: SHOW [HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|SOCKETS|LISTS|VERSION|...] SET key = arg RELOAD PAUSE RESUME SHUTDOWN [...]If you made changes to the pgbouncer.ini file, you can reload it with:
pgbouncer=# RELOAD;
Command line switches
-d,--daemon- Run in the background. Without it, the process will run in the foreground.
Daemon mode requires
pidfileand eitherlogfileorsyslog. After entering the background, PgBouncer writes no messages to stderr.Note: Does not work on Windows; pgbouncer need to run as service there.
-uUSERNAME,--user=USERNAME- Switch to the given user on startup.
-v,--verbose- Increase verbosity. Can be used multiple times.
-q,--quiet- Disable stderr logging. This does not change logging verbosity. Use it in init.d scripts.
-V,--version- Show version.
-h,--help- Show short help.
--regservice- Win32: Register PgBouncer to run as Windows service. The service_name configuration parameter value is used as the name to register under.
--unregservice- Win32: Unregister Windows service.
Admin console
The console is available by connecting as normal to the database pgbouncer:
$ psql -p 6432 pgbouncer
Only users in admin_users or stats_users can log in to the console. With auth_type=any, any user can log in as a stats_user.
The pgbouncer user can also log in without a password through a Unix socket. Its Unix UID must match the running PgBouncer process.
The admin console supports only the simple query protocol. Drivers that use extended query protocol for all commands cannot use it.
Show commands
The SHOW commands output information. Each command is described below.
SHOW STATS
Show statistics. In this and related commands, totals start at process startup. Averages update every stats_period.
- database
- Statistics are presented per database.
- total_xact_count
- Total number of SQL transactions pooled by pgbouncer.
- total_query_count
- Total number of SQL commands pooled by pgbouncer.
- total_server_assignment_count
- Total times a server was assigned to a client
- total_received
- Total volume in bytes of network traffic received by pgbouncer.
- total_sent
- Total volume in bytes of network traffic sent by pgbouncer.
- total_xact_time
- Total number of microseconds spent by pgbouncer when connected to PostgreSQL in a transaction, either idle in transaction or executing queries.
- total_query_time
- Total number of microseconds spent by pgbouncer when actively connected to PostgreSQL, executing queries.
- total_wait_time
- Time spent by clients waiting for a server, in microseconds. Updated when a client connection is assigned a backend connection.
- total_client_parse_count
- Total number of prepared statements created by clients. Only applicable
in named prepared statement tracking mode, see
max_prepared_statements. - total_server_parse_count
- Total number of prepared statements created by pgbouncer on a server. Only
applicable in named prepared statement tracking mode, see
max_prepared_statements. - total_bind_count
- Total number of prepared statements readied for execution by clients and forwarded
to PostgreSQL by pgbouncer. Only applicable in named prepared statement tracking
mode, see
max_prepared_statements. - total_client_login_count
- Total number of successful client logins.
- avg_xact_count
- Average transactions per second in last stat period.
- avg_query_count
- Average queries per second in last stat period.
- avg_server_assignment_count
- Average number of times a server as assigned to a client per second in the last stat period.
- avg_recv
- Average received (from clients) bytes per second.
- avg_sent
- Average sent (to clients) bytes per second.
- avg_xact_time
- Average transaction duration, in microseconds.
- avg_query_time
- Average query duration, in microseconds.
- avg_wait_time
- Time spent by clients waiting for a server, in microseconds (average
of the wait times for clients assigned a backend during the current
stats_period). - avg_client_parse_count
- Average number of prepared statements created by clients. Only applicable
in named prepared statement tracking mode, see
max_prepared_statements. - avg_server_parse_count
- Average number of prepared statements created by pgbouncer on a server. Only
applicable in named prepared statement tracking mode, see
max_prepared_statements. - avg_bind_count
- Average number of prepared statements readied for execution by clients and forwarded
to PostgreSQL by pgbouncer. Only applicable in named prepared statement tracking
mode, see
max_prepared_statements. - avg_client_login_count
- Average number of successful client logins per second.
SHOW STATS_TOTALS
Subset of SHOW STATS showing the total values (total_).
SHOW STATS_AVERAGES
Subset of SHOW STATS showing the average values (avg_).
SHOW TOTALS
Like SHOW STATS but aggregated across all databases.
SHOW SERVERS
- type
- S, for server.
- user
- User name pgbouncer uses to connect to server.
- database
- Database name.
- replication
- If server connection uses replication. Can be none, logical or physical.
- state
- State of the PgBouncer server connection, one of active, idle, used, tested, new, active_cancel, being_canceled.
- addr
- IP address of PostgreSQL server.
- port
- Port of PostgreSQL server.
- local_addr
- Connection start address on local machine.
- local_port
- Connection start port on local machine.
- connect_time
- When the connection was made.
- request_time
- When last request was issued.
- wait
- Not used for server connections.
- wait_us
- Not used for server connections.
- close_needed
- 1 if the connection will be closed as soon as possible, because a configuration file reload or DNS update changed the connection information or RECONNECT was issued.
- ptr
- Address of internal object for this connection.
- link
- Address of client connection the server is paired with.
- remote_pid
- Backend process ID. For Unix socket connections, use the OS PID if the operating system exposes it. Otherwise, read the value from the server cancellation packet. For PostgreSQL, this should be its PID. For another PgBouncer, it is a random number.
- tls
- A string with TLS connection information, or empty if not using TLS.
- application_name
- A string containing the
application_nameset on the linked client connection, or empty if this is not set, or if there is no linked connection. - prepared_statements
- The amount of prepared statements that are prepared on the server. This
number is limited by the
max_prepared_statementssetting. - id
- Unique ID for server.
SHOW CLIENTS
- type
- C, for client.
- user
- Client connected user.
- database
- Database name.
- replication
- If client connection uses replication. Can be none, logical or physical.
- state
- Client connection state: active, idle, waiting, active_cancel_req, or waiting_cancel_req. Active clients are linked to servers. Idle clients have no queries waiting for processing.
- addr
- IP address of client.
- port
- Source port of client.
- local_addr
- Connection end address on local machine.
- local_port
- Connection end port on local machine.
- connect_time
- Timestamp of connect time.
- request_time
- Timestamp of latest client request.
- wait
- Current waiting time in seconds.
- wait_us
- Microsecond part of the current waiting time.
- close_needed
- not used for clients
- ptr
- Address of internal object for this connection.
- link
- Address of server connection the client is paired with.
- remote_pid
- Process ID, in case client connects over Unix socket and OS supports getting it.
- tls
- A string with TLS connection information, or empty if not using TLS.
- application_name
- A string containing the
application_nameset by the client for this connection, or empty if this was not set. - prepared_statements
- The amount of prepared statements that the client has prepared
- id
- Unique ID for client.
SHOW POOLS
A new pool entry is made for each couple of (database, user).
- database
- Database name.
- user
- User name.
- cl_active
- Client connections that are either linked to server connections or are idle with no queries waiting to be processed.
- cl_waiting
- Client connections that have sent queries but have not yet got a server connection.
- cl_active_cancel_req
- Client connections that have forwarded query cancellations to the server and are waiting for the server response.
- cl_waiting_cancel_req
- Client connections that have not forwarded query cancellations to the server yet.
- sv_active
- Server connections that are linked to a client.
- sv_active_cancel
- Server connections that are currently forwarding a cancel request.
- sv_being_canceled
- Servers waiting to become idle until all cancellation requests for their queries complete.
- sv_idle
- Server connections that are unused and immediately usable for client queries.
- sv_used
- Server connections that have been idle for more than
server_check_delay, so they needserver_check_queryto run on them before they can be used again. - sv_tested
- Server connections that are currently running either
server_reset_queryorserver_check_query. - sv_login
- Server connections currently in the process of logging in.
- maxwait
- Seconds the oldest queued client has waited. An increasing value means the server pool cannot process requests quickly enough. The server may be overloaded, or pool_size may be too small.
- maxwait_us
- Microsecond part of the maximum waiting time.
- pool_mode
- The pooling mode in use.
- load_balance_hosts
- The load_balance_hosts in use if the pool’s host contains a comma-separated list.
SHOW PEER_POOLS
A new peer_pool entry is made for each configured peer.
- peer_id
- ID of the configured peer entry.
- cl_active_cancel_req
- Client connections that have forwarded query cancellations to the server and are waiting for the server response.
- cl_waiting_cancel_req
- Client connections that have not forwarded query cancellations to the server yet.
- sv_active_cancel
- Server connections that are currently forwarding a cancel request.
- sv_login
- Server connections currently in the process of logging in.
SHOW LISTS
Show following internal information, in columns (not rows):
- databases
- Count of databases.
- users
- Count of users.
- pools
- Count of pools.
- free_clients
- Disconnected client count. PgBouncer retains their allocated memory for future clients to avoid new allocations.
- used_clients
- Count of used clients.
- login_clients
- Count of clients in login state.
- free_servers
- Disconnected server count. PgBouncer retains their allocated memory for future servers to avoid new allocations.
- used_servers
- Count of used servers.
- dns_names
- Count of DNS names in the cache.
- dns_zones
- Count of DNS zones in the cache.
- dns_queries
- Count of in-flight DNS queries.
- dns_pending
- not used
SHOW USERS
- name
- The user name
- pool_size
- The user’s override pool_size. or NULL if not set.
- reserve_pool_size
- The user’s override reserve_pool_size. or NULL if not set.
- pool_mode
- The user’s override pool_mode, or NULL if not set.
- max_user_connections
- The user’s max_user_connections setting. If this setting is not set for this specific user, then the default value will be displayed.
- current_connections
- Current number of server connections that this user has open to all servers.
- max_user_client_connections
- The user’s max_user_client_connections setting. If this setting is not set for this specific user, then the default value will be displayed.
- current_client_connections
- Current number of client connections that this user has open to PgBouncer.
SHOW DATABASES
- name
- Name of configured database entry.
- host
- Host PgBouncer connects to.
- port
- Port PgBouncer connects to.
- database
- Actual database name PgBouncer connects to.
- force_user
- If the connection string specifies a user, PgBouncer always uses that user for PostgreSQL connections, regardless of the client user.
- pool_size
- Maximum number of server connections.
- min_pool_size
- Minimum number of server connections.
- reserve_pool_size
- Maximum number of additional connections for this database.
- server_lifetime
- The maximum lifetime of a server connection for this database
- pool_mode
- The database’s override pool_mode, or NULL if the default will be used instead.
- load_balance_hosts
- The database’s load_balance_hosts if the host contains a comma-separated list.
- max_connections
- Maximum number of allowed server connections for this database, as set by max_db_connections, either globally or per database.
- current_connections
- Current number of server connections for this database.
- max_client_connections
- Maximum number of allowed client connections for this PgBouncer instance, as set by max_db_client_connections per database.
- current_client_connections
- Current number of client connections for this database.
- paused
- 1 if this database is currently paused, else 0.
- disabled
- 1 if this database is currently disabled, else 0.
SHOW PEERS
- peer_id
- ID of the configured peer entry.
- host
- Host PgBouncer connects to.
- port
- Port PgBouncer connects to.
- pool_size
- Maximum number of server connections that can be made to this peer
SHOW SOCKETS, SHOW ACTIVE_SOCKETS
Shows low-level information about sockets or only active sockets. This includes the information shown under SHOW CLIENTS and SHOW SERVERS as well as other more low-level information.
SHOW CONFIG
Show the current configuration settings, one per row, with the following columns:
- key
- Configuration variable name
- value
- Configuration value
- default
- Configuration default value
- changeable
- yes if the setting can change at runtime, or no if it can change only at startup. Use SET for runtime changes.
SHOW MEM
Shows low-level information about the current sizes of various internal memory allocations. The information presented is subject to change.
SHOW DNS_HOSTS
Show host names in DNS cache.
- hostname
- Host name.
- ttl
- How many seconds until next lookup.
- addrs
- Comma separated list of addresses.
SHOW DNS_ZONES
Show DNS zones in cache.
- zonename
- Zone name.
- serial
- Current serial.
- count
- Host names belonging to this zone.
SHOW VERSION
Show the PgBouncer version string.
SHOW STATE
Show the PgBouncer state settings. Current states are active and paused.
Process controlling commands
PAUSE [db]
PgBouncer disconnects all server connections after their pooling mode permits release. Transaction pooling waits for transaction completion. Statement pooling waits for statement completion. Session pooling waits for client disconnection. The command returns only after all server connections close. Use it during database restarts.
If database name is given, only that database will be paused.
New client connections to a paused database will wait until RESUME is called.
DISABLE db
Reject all new client connections on the given database.
ENABLE db
Allow new client connections after a previous DISABLE command.
RECONNECT [db]
Close server connections after release according to their pooling mode, even before their lifetime expires. Apply this to the specified database, or all databases if omitted. New server connections can open immediately as required by pool size settings.
Use this after server connection routing changes, for example for gradual switchover. Reloading changed pgbouncer.ini connection strings with RELOAD, or a DNS change, already triggers the equivalent action. This command is necessary only when a downstream component routes connections.
Old and new server destinations can coexist for an extended period after this command. This is generally suitable for read-only traffic between replicas or for switching nodes in a multimaster setup. If all connections must switch together, use PAUSE. To close connections immediately, for example during emergency failover, consider KILL.
KILL [db]
Immediately drop all client and server connections on the given database or all databases, excluding the admin database.
New client connections to a killed database will wait until RESUME is called.
KILL_CLIENT id
Immediately terminate the specified client and all its associated server connections. Find its id with SHOW CLIENTS.
An example command will look something like KILL_CLIENT 1234.
RESUME [db]
Resume work from previous KILL or PAUSE command.
SHUTDOWN
The PgBouncer process will exit.
SHUTDOWN WAIT_FOR_SERVERS
Stop accepting new connections and shut down after all servers are released. This is similar to PAUSE followed by SHUTDOWN, but also stops new connections while waiting. It immediately disconnects clients waiting for a server. Unix sockets remain open but accept only administration console connections.
SHUTDOWN WAIT_FOR_CLIENTS
Stop accepting new connections and shut down after all existing clients disconnect. Unix sockets remain open but accept only administration console connections. Use this command for a zero-downtime rolling restart of two PgBouncer processes:
- Run two or more PgBouncer processes on one port with
so_reuseport. Peering is recommended but optional. Restart processes one at a time so the others continue to accept connections. - Select the first process, called A here.
- Send
SHUTDOWN WAIT_FOR_CLIENTSorSIGTERMto A. - Make all clients reconnect. You can wait for a client pooler’s
server_idle_timeoutor equivalent setting. Without a client pooler, you can restart clients. After all clients reconnect elsewhere, A exits automatically because it has no clients. - Start A again.
- Repeat steps 3, 4, and 5 for each remaining process, one at a time.
RELOAD
PgBouncer reloads its configuration files and applies changeable settings. This includes the main file, auth_file, and auth_hba_file.
If reload changes a database connection definition, PgBouncer closes old server connections on their next release according to the pooling mode. New connections use the changed parameters immediately.
WAIT_CLOSE [db]
Wait until all server connections clear “close_needed”; see SHOW SERVERS. Apply to the specified database, or all databases if omitted. After RECONNECT or RELOAD, this waits for the change to apply fully, for example in switchover scripts.
Other commands
SET key = arg
Changes a configuration setting (see also SHOW CONFIG). For example:
SET log_connections = 1;
SET server_check_query = 'select 2';
Run this command in the PgBouncer admin console to change PgBouncer settings. SET on another database passes to PostgreSQL like other SQL commands.
Signals
- SIGHUP
- Reload config. Same as issuing the command RELOAD on the console.
- SIGTERM
- Wait for existing clients to disconnect and reject new connections, like SHUTDOWN WAIT_FOR_CLIENTS. If shutdown is already in progress, this signal triggers immediate shutdown. Before PgBouncer 1.23.0, SIGTERM caused immediate shutdown.
- SIGINT
- Wait for server release, like SHUTDOWN WAIT_FOR_SERVERS. If shutdown is already in progress, this signal triggers immediate shutdown.
- SIGQUIT
- Immediate shutdown. Same as issuing SHUTDOWN on the console.
- SIGUSR1
- Same as issuing PAUSE on the console.
- SIGUSR2
- Same as issuing RESUME on the console.
Libevent settings
From the Libevent documentation:
It is possible to disable support for epoll, kqueue, devpoll, poll or select by setting the environment variable EVENT_NOEPOLL, EVENT_NOKQUEUE, EVENT_NODEVPOLL, EVENT_NOPOLL or EVENT_NOSELECT, respectively.
By setting the environment variable EVENT_SHOW_METHOD, libevent displays the kernel notification method that it uses.
See also
pgbouncer(5) - man page of configuration settings descriptions
4 - PgBouncer compilation and installation
Source: https://www.pgbouncer.org/install.html · 1.26.0 source
Building
Build PgBouncer with Autoconf or the newer, experimental Meson build system. Autoconf is currently recommended for production builds and packages. Meson is expected to become the default, and a future release is expected to remove Autoconf. Test Meson and report problems. Compilation requires:
- Libevent 2.0+
- pkg-config
- OpenSSL 1.0.1+ for TLS support
- a C11-capable C compiler
- (optional) c-ares as alternative to Libevent’s evdns
- (optional) LDAP libraries
- (optional) PAM libraries
The Meson build additionally needs Meson 0.58+ and Ninja; the Autoconf build needs GNU Make 3.81+.
When dependencies are installed, build with Autoconf:
$ ./configure --prefix=/usr/local
$ make
$ make install
or with Meson (experimental):
$ meson setup build --prefix=/usr/local
$ meson compile -C build
$ meson install -C build
For Git or Windows builds, see the specific instructions below.
DNS lookup support
PgBouncer looks up host names when it connects, not only when it loads configuration. This requires asynchronous DNS. The table lists supported backends in probing order:
| backend | parallel | EDNS0 (1) | /etc/hosts | SOA lookup (2) | note |
|---|---|---|---|---|---|
| c-ares | yes | yes | yes | yes | IPv6+CNAME buggy in <=1.10 |
| evdns, libevent 2.x | yes | no | yes | no | does not check /etc/hosts updates |
| getaddrinfo_a, glibc 2.9+ | yes | yes (3) | yes | no | N/A on non-glibc |
| getaddrinfo, libc | no | yes (3) | yes | no | requires pthreads |
- EDNS0 is required to have more than 8 addresses behind one host name.
- SOA lookup is needed to re-check host names on zone serial change.
- To enable EDNS0, add
options edns0to/etc/resolv.conf.
c-ares has the most features. We recommend it for most uses and binary packages when a sufficiently recent version is available. Libevent evdns also works for many uses, subject to the restrictions above. The other backends are mainly legacy options and receive little testing.
PgBouncer uses c-ares by default when available. Force it with -Dcares=enabled (configure: --with-cares) or disable it with -Dcares=disabled (configure: --without-cares). If c-ares is absent or disabled, PgBouncer uses Libevent. To disable Libevent evdns and use libc, set -Devdns=false (configure: --disable-evdns).
Optional features
Meson detects PAM, LDAP, and systemd libraries automatically. The -Dpam, -Dldap, and -Dsystemd options default to auto. Each feature builds when its libraries are present. Force a feature on with -D<feature>=enabled or off with -D<feature>=disabled. Autoconf requires explicit options: --with-pam, --with-ldap, or --with-systemd. It does not detect these features automatically.
PAM authentication
A build with PAM support provides the global authentication type pam to validate users through PAM.
LDAP authentication
A build with LDAP support provides the global authentication type ldap to validate users through LDAP.
systemd integration
systemd support enables socket activation and Type=notify. With systemd 253 or later, it also supports Type=notify-reload. See etc/pgbouncer.service and etc/pgbouncer.socket for examples.
Building from Git
For an Autoconf build, generate the header and configuration files before you run configure:
$ git clone --branch pgbouncer_1_26_0 https://github.com/pgbouncer/pgbouncer.git
$ cd pgbouncer
$ ./autogen.sh
$ ./configure
$ make
$ make install
The default installation directory is /usr/local. Pass command-line options to configure to customize it. Run ./configure --help to list options and configuration environment variables.
Additional packages required for the Autoconf build from Git: autoconf, automake, libtool, pandoc
Meson builds directly from a checkout. It requires pandoc to build man pages:
$ meson setup build
$ meson compile -C build
$ meson install -C build
Run meson configure build to list the available -D options.
Testing
See the README.md file in the test directory on how to run the tests.
Building on Windows
MinGW is the only supported Windows build environment. Cygwin and Visual $ANYTHING are not supported.
To build on MinGW, do the usual Autoconf build:
$ ./configure
$ make
or the experimental Meson build:
$ meson setup build
$ meson compile -C build
If cross-compiling from Unix with Autoconf:
$ ./configure --host=i586-mingw32msvc
The LDAP build option is currently not supported on Windows.
Running on Windows
Command-line operation works as usual, but -d (daemonize) and -u (switch user) do not work.
To run PgBouncer as a Windows service, set service_name. Then register the service:
$ pgbouncer -regservice config.ini
To uninstall the service:
$ pgbouncer -unregservice config.ini
To use the Windows event log, first register pgbevent.dll as shown below. Then set syslog = 1 in the configuration file:
$ regsvr32 pgbevent.dll
To unregister it, do:
$ regsvr32 /u pgbevent.dll
5 - Source Releases Download
PgBouncer 1.26
| File | Date | Size | Checksum |
|---|---|---|---|
| pgbouncer-1.26.0.tar.gz | 2026-09-23 | 897943 bytes | sha256 |
PgBouncer 1.25
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.25.2.tar.gz | 2026-05-08 | 865371 bytes | sha256 |
| pgbouncer-1.25.1.tar.gz | 2025-12-03 | 864801 bytes | sha256 |
| pgbouncer-1.25.0.tar.gz | 2025-11-09 | 863322 bytes | sha256 |
PgBouncer 1.24
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.24.1.tar.gz | 2025-04-16 | 717796 bytes | sha256 |
| pgbouncer-1.24.0.tar.gz | 2025-01-10 | 706573 bytes | sha256 |
PgBouncer 1.23
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.23.1.tar.gz | 2024-08-02 | 700025 bytes | sha256 |
| pgbouncer-1.23.0.tar.gz | 2024-07-03 | 694845 bytes | sha256 |
PgBouncer 1.22
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.22.1.tar.gz | 2024-03-04 | 677351 bytes | sha256 |
| pgbouncer-1.22.0.tar.gz | 2024-01-31 | 670589 bytes | sha256 |
PgBouncer 1.21
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.21.0.tar.gz | 2023-10-16 | 668211 bytes | sha256 |
PgBouncer 1.20
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.20.1.tar.gz | 2023-08-09 | 638844 bytes | sha256 |
| pgbouncer-1.20.0.tar.gz | 2023-07-20 | 638020 bytes | sha256 |
PgBouncer 1.19
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.19.1.tar.gz | 2023-05-31 | 623569 bytes | sha256 |
| pgbouncer-1.19.0.tar.gz | 2023-05-04 | 616947 bytes | sha256 |
PgBouncer 1.18
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.18.0.tar.gz | 2022-12-12 | 600825 bytes | sha256 |
PgBouncer 1.17
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.17.0.tar.gz | 2022-03-23 | 598294 bytes | sha256 |
PgBouncer 1.16
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.16.1.tar.gz | 2021-11-11 | 591450 bytes | sha256 |
| pgbouncer-1.16.0.tar.gz | 2021-08-09 | 592136 bytes | sha256 |
PgBouncer 1.15
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.15.0.tar.gz | 2020-11-19 | 588042 bytes | sha256 |
PgBouncer 1.14
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.14.0.tar.gz | 2020-06-11 | 578955 bytes | sha256 |
PgBouncer 1.13
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.13.0.tar.gz | 2020-04-27 | 574955 bytes | sha256 |
PgBouncer 1.12
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.12.0.tar.gz | 2019-10-17 | 567465 bytes | sha256 |
PgBouncer 1.11
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.11.0.tar.gz | 2019-08-27 | 571414 bytes | sha256 |
PgBouncer 1.10
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.10.0.tar.gz | 2019-07-01 | 480571 bytes | sha256 |
PgBouncer 1.9
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.9.0.tar.gz | 2018-08-13 | 469300 bytes | sha256 |
PgBouncer 1.8
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.8.1.tar.gz | 2017-12-20 | 465930 bytes | sha256 |
| pgbouncer-1.8.tar.gz | 2017-12-19 | 465612 bytes | sha256 |
PgBouncer 1.7
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.7.2.tar.gz | 2016-02-26 | 462374 bytes | sha256 |
| pgbouncer-1.7.1.tar.gz | 2016-02-18 | 461903 bytes | sha256 |
| pgbouncer-1.7.tar.gz | 2015-12-18 | 459080 bytes | sha256 |
PgBouncer 1.6
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.6.1.tar.gz | 2015-09-03 | 431076 bytes | sha256 |
| pgbouncer-1.6.tar.gz | 2015-08-01 | 412700 bytes | sha256 |
PgBouncer 1.5
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.5.5.tar.gz | 2015-04-09 | 336145 bytes | sha256 |
| pgbouncer-1.5.4.tar.gz | 2012-11-28 | 339610 bytes | sha256 |
| pgbouncer-1.5.3.tar.gz | 2012-09-12 | 339013 bytes | sha256 |
| pgbouncer-1.5.2.tar.gz | 2012-05-29 | 335338 bytes | sha256 |
| pgbouncer-1.5.1.tar.gz | 2012-04-17 | 334413 bytes | sha256 |
| pgbouncer-1.5.tar.gz | 2012-01-05 | 411488 bytes | sha256 |
PgBouncer 1.4
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.4.2.tgz | 2011-06-16 | 283204 bytes | sha256 |
| pgbouncer-1.4.1.tgz | 2011-04-01 | 282728 bytes | sha256 |
| pgbouncer-1.4.tgz | 2011-01-11 | 231691 bytes | sha256 |
PgBouncer 1.3
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.3.4.tgz | 2010-09-09 | 167957 bytes | sha256 |
| pgbouncer-1.3.3.tgz | 2010-05-10 | 167476 bytes | sha256 |
| pgbouncer-1.3.2.tgz | 2010-03-15 | 166756 bytes | sha256 |
| pgbouncer-1.3.1.tgz | 2009-07-06 | 161518 bytes | sha256 |
| pgbouncer-1.3.tgz | 2009-02-18 | 160154 bytes | sha256 |
PgBouncer 1.2
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.2.3.tgz | 2008-08-08 | 145372 bytes | sha256 |
| pgbouncer-1.2.2.tgz | 2008-08-06 | 145017 bytes | sha256 |
| pgbouncer-1.2.1.tgz | 2008-08-04 | 144903 bytes | sha256 |
| pgbouncer-1.2.tgz | 2008-07-29 | 143915 bytes | sha256 |
PgBouncer 1.1
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.1.2.tgz | 2007-12-10 | 122054 bytes | sha256 |
| pgbouncer-1.1.1.tgz | 2007-10-26 | 121042 bytes | sha256 |
| pgbouncer-1.1.tgz | 2007-10-09 | 120462 bytes | sha256 |
PgBouncer 1.0
| File | Date | Size | SHA256 |
|---|---|---|---|
| pgbouncer-1.0.8.tgz | 2007-06-18 | 93636 bytes | sha256 |
| pgbouncer-1.0.7.tgz | 2007-04-19 | 93086 bytes | sha256 |
| pgbouncer-1.0.6.tgz | 2007-04-12 | 92244 bytes | sha256 |
| pgbouncer-1.0.5.tgz | 2007-04-11 | 91934 bytes | sha256 |
| pgbouncer-1.0.4.tgz | 2007-04-11 | 91889 bytes | sha256 |
| pgbouncer-1.0.3.tgz | 2007-04-11 | 91489 bytes | sha256 |
| pgbouncer-1.0.2.tgz | 2007-03-28 | 90555 bytes | sha256 |
| pgbouncer-1.0.1.tgz | 2007-03-15 | 89609 bytes | sha256 |
| pgbouncer-1.0.tgz | 2007-03-13 | 88587 bytes | sha256 |
Binary Packages
Many operating system distributions provide PgBouncer packages or ports. First check whether your operating system already provides one.
These dedicated builds may have newer versions than distribution repositories:
- RPM: yum.postgresql.org
- Deb: apt.postgresql.org
6 - Changelog
Source: https://www.pgbouncer.org/changelog.html · 1.26.0 source
PgBouncer 1.26.x
2026-09-23 - PgBouncer 1.26.0 - “Ignore all previous search_path”
- Security
- Fix CVE-2026-19888: PgBouncer before 1.26.0 did not check that the SCRAM client-final-message contained a nonce. An unauthenticated remote attacker could crash PgBouncer by sending a client-final-message without one. This also applies to users that do not exist, because PgBouncer runs a mock SCRAM exchange for those. This bug has existed since SCRAM support was added in PgBouncer 1.11.0.
- Fix CVE-2026-6668: Before 1.26.0, integer overflow in packet buffer growth could make PgBouncer loop indefinitely. This required a large amount of data in one packet buffer. With default
max_packet_size, an unauthenticated client could trigger it. Because PgBouncer is single-threaded, it stopped serving all clients until the process was killed. - Fix CVE-2026-6669: Before 1.26.0, PgBouncer accepted an unbounded SCRAM iteration count from servers. A malicious or compromised PostgreSQL server could force unlimited work during one login. This blocked service for all other clients and databases. The iteration count must now be at most 1000000.
- Features
- Track all parameters that PostgreSQL reports by default. These include
search_pathon PostgreSQL 18+ anddefault_transaction_read_onlyon PostgreSQL 14+. Previously,SET search_pathorSET default_transaction_read_only = truein transaction pooling affected later clients that used the same server connection. (#1580, #1573) - Add
pool_idle_timeoutto remove pools unused for a configured period. This helps when many users connect infrequently and pool counts otherwise grow without limit. The default disables this setting because pool removal also removes its statistics. (#1491) - Allow
query_wait_timeoutto be configured per user and per database. (#1449) - Add
client_login_countstat toSHOW STATS, which counts successful client logins. This makes it possible to detect clients that churn connections. (#1457) - Send PgBouncer-specific
ParameterStatusmessages at client login:pgbouncer.version,pgbouncer.pool_mode, andpgbouncer.max_prepared_statements. Clients and drivers can use these to detect PgBouncer and adjust their behavior. (#1490) - Add
login_notify_messagesetting. When set, its value is sent to clients as a NOTICE message after they log in. This can be used to make it clear to clients that they are connected through PgBouncer instead of directly to PostgreSQL. (#1488) - Add support for building PgBouncer with meson, including a Windows build using the UCRT64 environment. Autoconf builds continue to be supported. (#1524, #1426, #1568, #1585, #1602, #1607)
- Add a logo. (#1609)
- Track all parameters that PostgreSQL reports by default. These include
- Changes
- Remove the deprecated online restart (
-R, aka takeover) functionality, together with theSHOW FDSandSUSPENDadmin commands that only existed to support it. Use rolling restarts withso_reuseportinstead. (#1581) - Increase the maximum length of passwords to 65535 bytes, matching libpq. (#1310, #1520)
- Treat a
NULLuser name returned byauth_querythe same as no rows being returned, instead of treating it as an error. (#1569) - Accept
SET extra_float_digitson the admin database, which newer PostgreSQL JDBC drivers send during connection setup. (#1550) - Allow
mkauth.pyto write to stdout by passing-as the output file. (#1514) - Stop logging noisy errors on unexpected EOF from clients when built against OpenSSL 3. (#1507)
- Include the underlying system error in TLS error messages when built against OpenSSL 3. (#1492)
- Require a C11 compiler. (#1417)
- Log which limit caused a server connection to be evicted. The disconnect reason is now
evicted for max_db_connections,evicted for pool_sizeorevicted for max_user_connectionsinstead of the bareevicted. (#1597)
- Remove the deprecated online restart (
- Fixes
- Fix late
COPYmessages causing pool exhaustion in transaction pooling mode. This also makesCOPYwork outside of an explicit transaction in transaction pooling mode. (#1471) - Fix LDAP authentication failures with long DNs by increasing the maximum LDAP URL length. (#1497)
- Fix SCRAM pass-through corruption of cached forced-user credentials. This caused server login failures because the real server rejected the SCRAM proof. (#1612)
- Fix SCRAM pass-through with stored SCRAM secrets after server reconnection. It failed with “password is SCRAM secret but client authentication did not provide SCRAM keys”. (#1504, bug introduced in 1.25.1)
- Fix use-after-free crash when a replication client disconnects while its server connection is still logging in. (#1577)
- Fix idle server eviction for replication clients when the pool is full. Previously, one replication client could evict every idle server instead of one. No eviction occurred when reserve pools or cancel requests made the server count exceed
pool_size. (#1597) - Fix stalled TLS connections when a packet straddles the packet buffer boundary, for example a
SET application_namewith a long value. (#1531) - Fix prepared statement responses being sent in the wrong order when a batch mixes
ParseandClosemessages without aSyncin between. (#1555) - Fix parameters listed in
track_extra_parametersthat are not reported by the server causing incorrect behaviour when a client sets them in its startup packet. (#1576) - Fix login failures when the server splits its login packets across multiple TCP packets, for example when there is another proxy between PgBouncer and PostgreSQL. (#1446)
- Fix
query_timeoutclosing connections when no query was in flight. (#1395) - Fix sending a duplicate
NegotiateProtocolVersionmessage when no server was available right away. (#1460) - Fix
pool_sizecolumn inSHOW USERSshowing a value for users that do not have one configured. (#1489) - Fix error message for
ENABLEadmin command. (#1308) - Fix compilation against future OpenSSL versions that make
struct asn1_string_stopaque. (#1440) - Prevent the compiler from optimizing away the erasure of sensitive cryptographic data from the stack. (#1508)
- Fix linking of
pgbevent.dllwith clang on Windows. (#1571) - Fix paths of root-level files in the release tarball, which were stored as
pgbouncer-X.Y.Z/./configureinstead ofpgbouncer-X.Y.Z/configure. (#1549) - Fix a memory leak when reading
track_extra_parametersfrom the config. (#1510) - Fix a memory leak for every startup packet that contained a protocol extension parameter (
_pq_.prefix), which could be triggered by unauthenticated clients. (#1540)
- Fix late
PgBouncer 1.25.x
2026-05-08 - PgBouncer 1.25.2 - “Human touch with fresh twist in title race full of uncertainties”
Security
- Fix CVE-2026-6664: An integer overflow in network packet parsing code in PgBouncer before 1.25.2 bypasses a boundary check and can lead to a crash. An unauthenticated remote attacker can crash PgBouncer with a malformed SCRAM authentication packet.
- Fix CVE-2026-6665: Before 1.25.2, SCRAM client-final-message construction checked the
strlcat()return value incorrectly. A malicious backend could trigger stack overflow with a long nonce in its SCRAM server-final-message. - Fix CVE-2026-6666: A possible null pointer reference in PgBouncer before 1.25.2 could lead to a crash if a server sends an error response without an SQLSTATE field.
- Fix CVE-2026-6667: PgBouncer before 1.25.2 did not perform an appropriate authorization check for the
KILL_CLIENTadmin command. All users with access to the administration console, which itself requires authorization, could run this command. It should only be allowed for users listed in theadmin_usersparameter.
Fixes
- Clarify documentation of the
default_pool_sizeparameter. - Correct documentation for
client_tls13_ciphersandserver_tls13_ciphers.
- Clarify documentation of the
2025-12-03 - PgBouncer 1.25.1 - “Fixing a bunch of bugs before Christmas”
Security
Fix CVE-2025-12819: An unauthenticated attacker could previously execute arbitrary SQL during authentication with a malicious search_path in StartupMessage. Systems are vulnerable only when ALL the following conditions apply:
track_extra_parametersincludes search_path (non-default configuration, probably only configured in setups involving Citus or PostgreSQL 18)auth_useris set to a non-empty string (non-default configuration)auth_queryis configured without fully-qualified object names (default configuration, the < operator is not schema qualified)
Fixes
- Fix errors with ad-hoc SCRAM auth after reconnect to server (#1432, introduced in 1.25.0)
- Add missing typedefs for exotic architectures without SIMD support (#1414, introduced in 1.25.0)
- Remove noisy warning log when client closes the connection before sending any data (#1420, introduced in 1.25.0)
- Prevent potential NULL pointer dereference (#1423, introduced in 1.25.0)
- Fix potential memory leak (#1422, introduced in 1.25.0)
- Fix SCRAM parsing of server messages (#1431, introduced in 1.25.0)
2025-11-09 - PgBouncer 1.25.0 - “The one with LDAP support”
- Features
- Add LDAP authentication! You can configure it using an HBA file or using
auth_ldap_options. (#731) - Add client-side direct TLS connections using the faster setup introduced in PostgreSQL 17. PgBouncer cannot yet use this setup for its PostgreSQL server connections. (#1359)
- Add idle state to
SHOW CLIENTS. (#1191) - Add
transaction_timeoutsetting, both globally and at the user level. (#1242) - Send a NOTICE message to the client if it is queued without receiving a connection for more than 5 seconds. This duration can be changed/disabled using
query_wait_notify. (#1264) - Add
scram_iterationssetting to allow operators to trade security for authentication speed (#1339) - Add
client_tls13_ciphersandserver_tls13_ciphersto choose which TLSv1.3 cipher suites to enable. (#1352)
- Add LDAP authentication! You can configure it using an HBA file or using
- Changes
- Greatly improve performance of ad hoc SCRAM authentication. (#1338)
- Allow
KILLto not take any database, which now means toKILLall databases. (#1317) - Health check query defaults to sending empty query instead of
SELECT 1. (#1233) - Log full PAM queue as a warning. This makes it easier to find the cause of slow queries caused by this. (#1297)
- The
RELOADcommand now reports any errors that happened during the reload. (#1231) - Allow admin connections through the PgBouncer UNIX socket during shutdown. Operators can inspect why shutdown is delayed or use
KILL_CLIENTon stuck connections. (#1305) - Change
mkauth.pyto not add an obsolete third field anymore (#1365) - Improve
FATALmessages indisconnect_clientanddisconnect_serverfunctions. (#1382) - Stop using deprecated OpenSSL function
EVP_PKEY_get0_EC_KEY. This could cause issues with certain FIPS implementatinos. (#1384)
- Fixes
- Fix crash involving long passwords (1024 characters or more). (#1215)
- Fix multi-host connections when using
server_tls_sslmode=verify-full. (#1303) - Fix rare
FATALerror when forwarding cancel requests. (#1383) - Fix sorting of parameters in
SHOW CONFIG. (#1403) - Harden parsing of the startup packet. (#1407)
PgBouncer 1.24.x
2025-04-16 - PgBouncer 1.24.1 - “CVE-2025-2291 VALID UNTIL yesterday”
Security
- Fix CVE-2025-2291: Previously, auth_query ignored password VALID UNTIL when fetching hashes. PgBouncer acting as a transparent Postgres proxy could therefore accept expired passwords. The default auth_query and documented custom function examples now check VALID UNTIL. Update custom auth_query definitions accordingly. For the default auth_query, upgrade to PgBouncer 1.24.1 or configure the new default query on an earlier release.
Fixes
- Fix PAM support by reverting
pamauthentication support in HBA file. (#1291) (bug introduced in 1.24.0) - Fix bug when decrementing user connection count. This was included in the tag of 1.24.0 on GitHub, but the release tarball did not contain this fix. (#1238) (bug introduced in 1.24.0)
- Add
test_load_balance_hosts.pyto the tarball. (#1282) - Fix issues with tests to allow them to be run by Debian packagers. (#1266, #1250)
- Fix PAM support by reverting
Docs
- Update
auth_queryexample to set a safesearch_path. (#1245)
- Update
2025-01-10 - PgBouncer 1.24.0 - “New year, new bouncer”
Features
- Add support for
Type=notify-reloadfor systemd. This requires systemd version 253 or later. (#1148) - Add
KILL_CLIENTcommand to the admin console. This allows terminating a client connection by force. (#1147) - Add
max_user_client_connectionssetting, both globally and at the user level. (#1137) - Add
max_db_client_connectionssetting, both globally and at the database level. (#1138) - Add
current_client_connectionscounter toSHOW USERSandSHOW DATABASESoutput. (#1137, #1138) - Add
load_balance_hostsparameter, to support not load balancing between hosts. (#736) - Expose prepared statement usage counters in
SHOW STATS. (#1192) - Add
client_idle_timeoutsetting. (#1189) - Add user level
query_timeoutandreserve_pool_size. (#1180, #1228) - Enable
pamauthentication support in HBA file. (#326)
- Add support for
Changes
- Retain connections on RELOAD when TLS configuration is unchanged. Previously, RELOAD recycled all TLS connections and could cause a severe temporary performance drop. Connections now recycle only when TLS settings change. (#1157)
- Enable prepared statement support by default, with
max_prepared_statementsset to 200. This default change should affect only clients that use prepared statements. If you use them, read the limitations in our documentation. (#1144) - Sockets/clients/servers can now be identified by a unique ID in the admin output. Previously they could be identified by their pointer, but these would often be reused by new clients after disconnect. (#1172)
- Clearer error for empty pidfile. (#1195)
- Return original error to client in case of
server_login_retryfailure. (#1152) - Log original server error in case of error from
auth_query. (#1187) - Setting
default_pool_sizeto 0 means unlimited size. (#1227) - Change the name of the
reserve_poolsetting for databases, toreserve_pool_size. The previous name is still an alias for the new name. (#1232)
Fixes
- Handle various unlikely error cases better, such as OOM errors. These could previously cause crashes or memory leaks. (#1108, #1101, #1099, #1169, #1202)
- Correct default value for
server_tls_sslmodein sample config file. (#1133) - Remove mention in docs of invalid alias for
server_tls_protocols. (#1155) - Fix bug when using
auth_queryand replication connections together. This bug would cause connection failures in such setups. (#1166) - Ignore client cancel requests while PgBouncer is configuring server setting. (#298)
PgBouncer 1.23.x
2024-08-02 - PgBouncer 1.23.1 - “Everything is put back in order”
- Fixes
- Fix a possible segmentation fault after PgBouncer reloads its configuration. (#1105) (bug introduced in 1.23.0)
- Fix all known put_in_order crashes. (#1120) (new crashes were introduced in 1.23.0)
- Add missing files to release tarball that are required for testing. (#1124) (missing files were introduced in 1.23.0)
2024-07-03 - PgBouncer 1.23.0 - “Into the new beginnings”
Features
- Add rolling restarts. SIGTERM now waits for all clients to disconnect before shutdown, instead of stopping PgBouncer immediately. This permits rolling restarts behind a load balancer or on a shared port with
so_reuseport. This is a minor breaking change. If a Dockerfile or Systemd service file requires the old SIGTERM behavior, use SIGQUIT. (#902) - Add user name maps for
certandpeerauthentication. The connecting user no longer has to be the database user. These maps work similarly to Postgres maps, with exceptions listed in the documentation. (#996) - Add support for replication connections through PgBouncer. (#876)
- Add rolling restarts. SIGTERM now waits for all clients to disconnect before shutdown, instead of stopping PgBouncer immediately. This permits rolling restarts behind a load balancer or on a shared port with
Changes
- Improve
SHOW USERSoutput listing the connections. (#1040) - Allow
pool_sizeconfiguration per user. (#1049) - Allow
server_lifetimeconfiguration per database. (#1057) - Add support for listing dynamically created users in the output of
SHOW USERS. (#1052) - Add support for
alladdress type in hba configuration. (#1078) - Add support for automatically restarting when using systemd. (#1080)
- Increase c-ares minimum version requirement to 1.9.0 (#1076)
- Improve
Fixes
- Fix issues handling large and partial startup packets. (#1058)
- Add support for
--config=valueformat in options startup parameter. (#1064) - Fix
avg_wait_timemetric calculation. (#727) - Add support for negotiating the postgres protocol version with the client. (#1007)
- Add outstanding request for
auth_query. (#1034) - Multiple documentation and CI improvements.
PgBouncer 1.22.x
2024-03-04 - PgBouncer 1.22.1 - “It’s summer in Bangalore”
- Fixes
2024-01-31 - PgBouncer 1.22.0 - “DEALLOCATE ALL”
Features
Changes
Fixes
PgBouncer 1.21.x
2023-10-16 - PgBouncer 1.21.0 - “The one with prepared statements”
Features
Add protocol-level named prepared statements, a frequently requested PgBouncer feature. Prepared statements can greatly reduce CPU use in PgBouncer and PostgreSQL. Synthetic benchmarks showed query throughput gains from 15% to 250%, depending on workload. To enable support, set
max_prepared_statementsabove zero; the correct value depends on workload, but 100 is probably reasonable. See the docs onmax_prepared_statementsfor behavior, limitations, and tuning.Then configure your client library to use prepared statements, following its documentation. Although this feature received extensive testing before release, its complexity can still cause bugs or performance problems. Report any problems that you find. (#845)
Changes
- Improve security of OpenSSL settings, the defaults used were VERY outdated. With this release the defaults are now the same as the OpenSSL defaults of the system that runs PgBouncer. (#948 & libusual/#41)
- PgBouncer now uses OpenSSL to calculate MD5 hashes when possible. This is necessary to use PgBouncer in a FIPS compliant way. (#949)
- Maintain
min_pool_sizefor pools with a forced user even if no clients are connected to PgBouncer (#947) - Change
peer_idencoding in cancellation tokens. Peering no longer works across the v1.21.0 boundary. All peers must run versions either before this boundary or at/after it. (#945)
Fixes
- Fix crash with error message: “FATAL in function client_proto(): bad client state: 6/7” (#928) (bug introduced in 1.18.0)
- Fix crash with error message: “FATAL in function server_proto(): server in bad state: 11” (#927) (bug introduced in 1.18.0)
- Reduce cancellation sending log level (#903)
- Fix slog log prefix for peers (#922)
- Fix typos in docs (#932)
- Fix errors pointed out by static analyzer (#943)
- Don’t kill all waiting clients on temporary FATAL errors during login (#946)
- Use auto-database when database in
auth_dbnameis not explicitly configured (#921)
Cleanup
- Remove support for udns (#938)
PgBouncer 1.20.x
2023-08-09 - PgBouncer 1.20.1 - “Optional options”
- Fixes
2023-07-20 - PgBouncer 1.20.0 - “A funny name goes here”
Deprecations
- Deprecate online restart. It has received little recent maintenance, has known issues, and often does not support new features. Use
so_reuseportandpeersto run multiple PgBouncer processes on one port. Restart them one at a time so that a process always listens on the required port. (#894)
- Deprecate online restart. It has received little recent maintenance, has known issues, and often does not support new features. Use
Features
- Add
track_extra_parametersto track more transaction-pooling parameters. Previously, PgBouncer tracked onlyapplication_name,DateStyle,TimeZone, andstandard_conforming_strings. It now also tracksIntervalStyleby default. Additional settings must be reported by PostgreSQL to clients. Citus 12.0+ makes PostgreSQL reportsearch_path, so Citus users can add it totrack_extra_parameters. (#867) - Forward SQLSTATE in authentication phase. This allows the detection of database not existing, which is done by Npgsql (a .NET data provider for PostgreSQL). (#814)
- Change default
server_tls_sslmodetoprefer. (#866) - Add the
optionsstartup parameter. This enables thePGOPTIONSenvironment variable used bypsqlandlibpq. It can set PostgreSQL parameters at startup, but only parameters tracked throughtrack_extra_parameters. (#878)
- Add
Fixes
- Don’t crash when the
pgbounceradmin database is used as auth_dbname. It’s still not supported, but this now gives a clear error instead of crashing. (#817) - Fix name of
peer_cacheinSHOW MEM. It was incorrectly showing up asdb_cachebefore. (#864) - Fix src/dst confusion in log. PgBouncer was logging a source IP when it meant to log the destination IP. (#880)
- Only log admin connections over unix sockets when
log_connectionsis set to1. (#883)
- Don’t crash when the
PgBouncer 1.19.x
2023-05-31 - PgBouncer 1.19.1 - “Sunny Spring”
This is a minor release that fixes a few recently introduced bugs:
- Fixes
2023-05-04 - PgBouncer 1.19.0 - “The old-fashioned, human-generated kind”
Features
- Add
auth_dbnameoption, which specifies against which database to run theauth_query. (#764) - Add the
SHOW STATEcommand, which shows if PgBouncer is active, paused or suspended. (#528) - Add peering between PgBouncer processes. Cancellation requests can then work across multiple PgBouncer processes behind one load balancer. (#666)
- Add a dedicated
cancel_wait_timeoutsetting, which determines after how long to give up on forwarding a cancel request. Default is 10 seconds. (#833) - New testing framework (#792)
- Add
Fixes
- Fix possible memory leak on TLS handshake failure. (#796)
- Give more accurate error messages for unsupported command-line options on Windows. (#620)
- Fix calling
disconnect_serveron a server inBEING_CANCELEDstate. (#815) (introduced in 1.18.0) - Don’t exit with a non-zero status when a
SIGTERMis received. (#834) - Fail hard during startup when a socket could not be created in
unix_socket_dir. (#830) - Fail hard during startup when none of the addresses in
listen_addrcould be listened on. (#838) - Give more warning messages with more information when
sbuf_connectfails. This is especially useful when failing to create Unix sockets. (#837)
Cleanups
- Various CI updates for better performance
- Removed AppVeyor
PgBouncer 1.18.x
2022-12-12 - PgBouncer 1.18.0 - “No real mystery”
Features
Fixes
- Fail
sbuf_send_pendingoperation if destination socket is closed (#652) - Fix a few possible crashes (#700, #730)
- Fix for overflow bug in comma-separated host list feature, causing connection to get re-routed to Unix socket (#747)
- Don’t evict connections to achieve
min_pool_size(#648) - Fix
SHOW HELPwith PostgreSQL 15 (#769) - Fix a query cancellation race. A cancel request could arrive after its target query finished and cancel another client’s query instead. (#717)
- Fail
Cleanups
- Various CI updates
PgBouncer 1.17.x
2022-03-23 - PgBouncer 1.17.0 - “A line has been drawn”
Features
- A database definition can specify a comma-separated host list. The hosts will be connected to in a round-robin manner.
- When connecting to a non-existing database, the error (“no such database”) is now reported after authentication. This prevents unauthenticated clients from probing what databases exist. (This is similar to the change in version 1.15.0 to report missing users after authentication.)
- Don’t send server disconnect errors to the client before login. This could reveal not-quite-public information, such as configuration details, to a client that is not logged in yet.
- Increase the maximum password length again because the previous limit was still insufficient.
- Remove automatic
auth_filereload. Theauth_fileis now reread only on configuration file reload, no longer automatically as soon as it is changed. - The Windows build now includes a version-information resource file.
- The Windows builds created on CI are now statically linked, so they can be used directly without requiring any dependencies.
Fixes
- OpenSSL 3 support has been fixed. Previous releases would crash.
- Do not apply fast-fail before authentication, to avoid reporting server errors to unauthenticated clients. This also fixes SCRAM pass-through cases that need a client authentication exchange to repair a server connection through reauthentication. Fast-fail still applies immediately after authentication, so observed behavior is usually unchanged.
- Change
auth_typein samplepgbouncer.initomd5to match the built-in default. Some deploy this file as the default configuration file, so check if this changed configuration still makes sense for you. - Fix crash at exit in assert-enabled builds.
- Correct
tcp_defer_acceptdocumentation and behavior. The documented default was incorrect, and “show config” sometimes showed the wrong value. If configured on an unsupported platform, it now reports an error, consistent with other platform-specific socket options. - Fix build with c-ares on Windows. c-ares >=1.18.0 is now required on Windows.
Cleanups
- Most deprecation warnings from Autoconf >=2.70 have been cleaned up. Older Autoconf versions are still supported.
- Cirrus CI use has been expanded to more platforms.
- Travis CI support has been removed.
- Update locations to search for default root CA file, to cover more platforms, such as Fedora/RHEL/CentOS.
- Python scripts now all use
python3by default. Python 2 compatibility is no longer maintained. - The test suite scripts use
command -vinstead ofwhich, which is deprecated. - Several error messages have been reworded to make it clearer which command or configuration setting they relate to.
- The test suite scripts no longer require GNU sed.
make checknow works on Windows (but not the SSL test suite yet).- Document that the admin console only supports the simple query protocol, and give better error messages about this.
PgBouncer 1.16.x
2021-11-11 - PgBouncer 1.16.1 - “Test of depth against quiet efficiency”
This is a minor release with a security fix.
Make PgBouncer acting as a server reject extraneous data after an SSL or GSS encryption handshake.
An attacker able to inject data into the TCP connection could insert cleartext at the start of an apparently encrypted database session. This could send forged SQL commands to the server if PgBouncer required no authentication data. SSL certificate authentication could allow such a setup. (CVE-2021-3935)
2021-08-09 - PgBouncer 1.16.0 - “Fended off a jaguar”
Features
- Support hot reloading of TLS settings. When the configuration file is reloaded, changed TLS settings automatically take effect.
- Add support for abstract Unix-domain sockets. Prefix a
Unix-domain socket path with
@to use a socket in the abstract namespace. This matches the corresponding PostgreSQL 14 feature. - The maximum lengths of passwords and user names have been increased to 996 and 128, respectively. Various cloud services require this.
- The minimum pool size can now be set per database, similar to the regular pool size and the reserve pool size.
- The number of pending query cancellations is shown in
SHOW POOLS.
Fixes
- Enforce configuration errors more consistently. Previously, some paths logged errors and continued instead of failing startup. These errors now cause startup failure as intended. Existing invalid configurations might therefore stop working.
- Fix query cancellation that could remain blocked for a long time. Cancel requests can now exceed pool size by a factor of two, which should prevent this delay. (#542, #543)
- Mixed use of md5 and scram via hba has been fixed.
- The build with c-ares on Windows has been fixed.
- Fix the causes of “FIXME: query end, but query_start == 0” messages. These messages should no longer appear. (#565)
- Fix reloading of
default_pool_size,min_pool_size, andres_pool_size. Reloading these settings previously didn’t work.
Cleanups
- Cirrus CI is now used instead of Travis CI.
- As usual, many tests have been added.
- Replace “unclean server” with clearer messages: “client disconnect while server was not ready” or “client disconnect before everything was sent to the server”. The first can occur when a client disconnects while its server has an open transaction block. The old message confused some users.
- You can no longer use “pgbouncer” as a database name. This name is reserved for the admin console, and using it as a normal database name never really worked right. This is now explicitly prohibited.
- Errors sent to clients before the connection is closed are now labeled as FATAL instead of just ERROR. Some clients were confused otherwise. (#564)
- Fix compiler warnings with GCC 11. (#623)
PgBouncer 1.15.x
2020-11-19 - PgBouncer 1.15.0 - “Ich hab noch einen Koffer in Berlin”
Features
- Return only a generic authentication failure to clients; details remain in the PgBouncer log. For nonexistent users, complete the authentication exchange and return the same failure. This prevents clients from probing user names or other authentication details, as in PostgreSQL.
- Don’t log anything if client disconnects immediately. This avoids log spam when monitoring systems just open a TCP/IP connection but don’t send anything before disconnecting.
- Use systemd native logging when stderr goes to the systemd journal. This avoids duplicate timestamps and PIDs. It also adds metadata such as severity, which remains useful if the journal is forwarded to syslog.
- A subset of the test suite can now be run under Windows.
SHOW CONFIGnow also shows the default values of the settings.
Fixes
- Fix the
so_reuseportoption on FreeBSD. The original code in PgBouncer 1.12.0 didn’t actually work on FreeBSD. (#504) - Repair compilation on systems with older systemd versions. This was broken in 1.14.0. (#505)
- The makefile target to build Windows binary zip packages has been repaired.
- Long command-line options now also work on Windows.
- Fix the behavior of the global
auth_usersetting. The old behavior was confusing and fragile as it depended on the order in the configuration file. This is no longer the case. (#391, #393)
- Fix the
Cleanups
- Improve test stability and portability.
- Modernize Autoconf-related code.
- Disable deprecation compiler warnings from OpenSSL 3.0.0.
PgBouncer 1.14.x
2020-06-11 - PgBouncer 1.14.0 - “La ritrovata magia”
Features
- Add SCRAM authentication pass-through. This allows using
encrypted SCRAM secrets in PgBouncer (either in
userlist.txtor fromauth_query) for logging into servers. - Add support for systemd socket activation. This is especially
useful to let systemd handle the creation of the Unix-domain
sockets on systems where access to
/var/run/postgresqlis restricted. - Add support for Unix-domain sockets on Windows.
- Add SCRAM authentication pass-through. This allows using
encrypted SCRAM secrets in PgBouncer (either in
Cleanups
- Add an alternative smaller sample configuration file
pgbouncer-minimal.inifor testing or deployment.
- Add an alternative smaller sample configuration file
PgBouncer 1.13.x
2020-04-27 - PgBouncer 1.13.0 - “My favourite game”
Features
- Add configuration setting
tcp_user_timeout, to set the corresponding socket option. client_tls_protocolsandserver_tls_protocolsnow default tosecure, which means only TLS 1.2 and TLS 1.3 are enabled. Older versions are still supported, they are just not turned on by default.- Add support for systemd service notifications. Right now, this
allows using
Type=notifyservice units. More integration is planned for future versions.
- Add configuration setting
Fixes
- Fix multiline log messages (libusual #24)
- Handle null user names returned from
auth_queryproperly (#340)
Cleanups
- The Debian packaging files under
debianhave been removed. It is recommended to use the packages from https://apt.postgresql.org/. - Numerous fixes and improvements in the test suite
- The tests no longer try to use sudo by default. This can now be
activated explicitly by setting the environment variable
USE_SUDO. - The libevent API use was updated to use version 2 style interfaces and to no longer use deprecated interfaces from version 1.
- The Debian packaging files under
PgBouncer 1.12.x
2019-10-17 - PgBouncer 1.12.0 - “It’s about learning and getting better”
This release contains a variety of minor enhancements and fixes.
Features
- Add a setting to turn on the
SO_REUSEPORTsocket option. On some operating systems, this allows running multiple PgBouncer instances on the same host listening on the same port and having the kernel distribute the connections automatically. - Add a setting to use a
resolv.conffile separate from the operating system. This allows setting custom DNS servers and perhaps other DNS options. - Send the output of
SHOW VERSIONas a normal result row instead of a NOTICE message. This makes it easier to consume and is consistent with otherSHOWcommands.
- Add a setting to turn on the
Fixes
- Send statistics columns as
numericinstead ofbigint. This avoids some client libraries failing on values that overflow thebigintrange. (#360, #401) - Fix issue with PAM users losing their password. (#285)
- Accept clients that offer SCRAM channel binding, such as PostgreSQL 11+ clients. Previously, they could fail to connect in some cases. PgBouncer still does not support channel binding; this change permits clients that offer it.
- Fix compilation with newer versions of musl-libc (used by Alpine Linux).
- Send statistics columns as
Cleanups
- Add
make checktarget. This allows running all the tests from a single command. - Remove references to the PostgreSQL wiki. All information is now either in the PgBouncer documentation or on the web site.
- Remove support for Libevent version 1.x. Libevent 2.x is now required. Libevent is now detected using pkg-config.
- Fix compiler warnings on macOS and Windows. The build on these platforms should now be free of warnings.
- Fix some warnings from LLVM scan-build.
- Add
PgBouncer 1.11.x
2019-08-27 - PgBouncer 1.11.0 - “Instinct for Greatness”
- Features
- Add support for SCRAM authentication for clients and servers. A
new authentication type
scram-sha-256is added. - Handle
auth_type=passwordwhen the stored password is md5, like a PostgreSQL server would. (#129) - Add option
log_statsto disable printing stats to log. (#287) - Add time zone to log timestamps.
- Put PID into [brackets] in log prefix.
- Add support for SCRAM authentication for clients and servers. A
new authentication type
- Fixes
- Fix OpenSSL configure test when running against newer OpenSSL with
-Werror. - Fix wait time computation with
auth_user. This would either crash or report garbage values for wait time. (#393) - Handle GSSENCRequest packet, added in PostgreSQL 12. It doesn’t do anything right now, but it avoids confusing error messages about “bad packet header”.
- Fix OpenSSL configure test when running against newer OpenSSL with
- Cleanups
- Many improvements in the test suite and several new tests
- Fix several compiler warnings on Windows.
- Expand documentation of the
[users]section and add to example config file. (#330)
PgBouncer 1.10.x
2019-07-01 - PgBouncer 1.10.0 - “Afraid of the World”
- Features
- Allow TLS protocol settings to enable or disable TLS 1.3. TLS 1.3 support previously depended on the OpenSSL library, but these settings did not include it.
- Fixes
- Fix TLS 1.3 support. This was broken with OpenSSL 1.1.1 and 1.1.1a (but not before or after).
- Fix a rare crash in
SHOW FDS(#311). - Fix an issue that could lead to prolonged downtime if many cancel requests arrive (#329).
- Avoid “unexpected response from login query” after a postgres reload (#220).
- Fix
idle_transaction_timeoutcalculation (#125). The bug would lead to premature timeouts in specific situations.
- Cleanups
- Make various log and error messages more precise.
- Fix issues found by Coverity (none had a significant impact in practice).
- Improve and document all test scripts.
- Add additional SHOW commands to the documentation.
- Convert the documentation from rst to Markdown.
- Python scripts in the source tree are all compatible with Python 3 now.
PgBouncer 1.9.x
2018-08-13 - PgBouncer 1.9.0 - “Chaos Survival”
- Features
- RECONNECT command
- WAIT_CLOSE command
- Fast close - Disconnect a server in session pool mode immediately if it is in “close_needed” (reconnect) mode.
- Add close_needed column to SHOW SERVERS
- Fixes
- Avoid double-free in parse_filename
- Avoid NULL pointer deref in parse_line
- Cleanups
- Port mkauth.py to Python 3
- Improve signals documentation
- Improve quick start documentation
- Document SET command
- Correct list of required software
- Fix -Wimplicit-fallthrough warnings
- Add missing documentation for various SHOW fields
- Document reconnect behavior on reload and DNS change
- Document that KILL requires RESUME afterwards
- Clarify documentation of server_lifetime
- Typos and capitalization fixes in messages and docs
- Fix psql invocation in tests
- Various other test setup improvements
PgBouncer 1.8.x
2017-12-20 - PgBouncer 1.8.1 - “Ground-and-pound Mentality”
- Fixes
- Include file
include/pam.hinto distribution tarball. This prevented the 1.8 tarball from building at all.
- Include file
2017-12-19 - PgBouncer 1.8 - “Confident at the Helm”
- Features
- Support PAM authentication. (Enable with
--with-pam.) - Add
pausedanddisabledfields toSHOW DATABASESoutput. - Add
maxwait_usfield toSHOW POOLSoutput. - Add
waitandwait_usfields toSHOWcommands output. - Add new commands
SHOW STATS_TOTALSandSHOW STATS_AVERAGES. - Track queries and transactions separately in
SHOW STATS. The fieldstotal_requests,avg_req, andavg_queryhave been replaced by new fields. - Add
wait_timetoSHOW STATS.
- Support PAM authentication. (Enable with
- Fixes
- Cleanups
auth_usersetting is now also allowed globally, not only per database. (#142)- Set console client and server encoding to
UTF8.
PgBouncer 1.7.x
2016-02-26 - PgBouncer 1.7.2 - “Finally Airborne”
- Fixes
- Fix crash on stale pidfile removal. Problem introduced in 1.7.1.
- Disable cleanup - it breaks takeover and is not useful for production loads. Problem introduced in 1.7.1.
- After takeover, wait until pidfile is gone before booting. Slow shutdown due to memory cleanup exposed existing race. (#113)
- Cleanups
2016-02-18 - PgBouncer 1.7.1 - “Forward To Five Friends Or Else”
WARNING: Since 1.7, PgBouncer does not execute server_reset_query in transaction pooling mode. The 1.7 announcement did not sufficiently highlight this change. If your applications require the old behavior, enable server_reset_query_always.
This release investigated a suspected TLS memory leak, but no leak was found. The Debian/wheezy libssl build uses 600k per connection instead of the expected 20-30k. Consider this overhead when using TLS.
- Fixes
- TLS: Rename sslmode “disabled” to “disable” as that is what PostgreSQL uses.
- TLS:
client_tls_sslmode=verify-ca/-fullnow reject connections without client certificate. (#104) - TLS:
client_tls_sslmode=allow/requiredo validate client certificate if sent. Previously they left cert validation unconfigured so connections with client cert failed. (#105) - Fix memleak when freeing database.
- Fix potential memleak in tls_handshake().
- Fix EOF handling in tls_handshake().
- Fix too small memset in asn1_time_parse compat.
- Fix non-TLS (
--without-openssl) build. (#101) - Fix various issues with Windows build. (#100)
- Cleanups
- TLS: Use SSL_MODE_RELEASE_BUFFERS to decrease memory usage of inactive connections.
- Clean allocated memory on exit. Helps to run memory-leak checkers.
- Improve
server_reset_querydocumentation. (#110) - Add TLS options to sample config.
2015-12-18 - PgBouncer 1.7 - “Colors Vary After Resurrection”
- Features
- Support TLS connections. OpenSSL/LibreSSL is used as backend implementation.
- Support authentication via TLS client certificate.
- Support “peer” authentication on Unix sockets.
- Support Host Based Access control file, like pg_hba.conf in Postgres. This allows to configure TLS for network connections and “peer” authentication for local connections.
- Cleanups
- Set the default
query_wait_timeoutto 120s. The previous default, 0, allowed an unlimited wait. PgBouncer now drops clients whose pending query cannot obtain a server connection within the limit. - Disable
server_reset_query_alwaysby default. Now reset query is used only in pools that are in session mode. - Increase pkt_buf to 4096 bytes to improve TLS performance. The effect probably depends on load. Since v1.2, packet buffers are separate from connections and allocated lazily from a pool, so this should be safe.
- Support pipelining count expected ReadyForQuery packets. This avoids releasing server too early. Fixes #52.
- Improved sbuf_loopcnt logic - socket is guarateed to be reprocessed even if there are no event from socket. Required for TLS as it has it’s own buffering.
- Adapt system tests to work with modern BSD and MacOS. (Eric Radman)
- Remove crypt auth. It’s obsolete and not supported by PostgreSQL since 8.4.
- Fix plain “–with-cares” configure option - without argument it was broken.
- Set the default
PgBouncer 1.6.x
2015-09-03 - PgBouncer 1.6.1 - “Studio Audience Approves”
Features
New setting:
server_reset_query_always. When set, disablesserver_reset_queryuse on non-session pools. PgBouncer introduces per-pool pool_mode, but session-pooling and transaction-pooling should not use same reset query. In fact, transaction-pooling should not use any reset query.It is set in 1.6.x, but will be disabled in 1.7.
Fixes
[SECURITY] Remove invalid assignment of
auth_user. (#69) Whenauth_useris set and client asks non-existing username, client will log in asauth_user. Not good.Skip NoticeResponse in handle_auth_response. Otherwise verbose log levels on server cause login failures.
console: Fill
auth_userwhen auth_type=any. Otherwise logging can crash (#67).Various portability fixes (OpenBSD, Solaris, OSX).
2015-08-01 - PgBouncer 1.6 - “Zombies of the future”
Features
Load user password hash from postgres database. New parameters:
auth_user user to use for connecting same db and fetching user info. Can be set per-database too.
auth_query SQL query to run under auth_user. Default: “SELECT usename, passwd FROM pg_shadow WHERE usename=$1”
(Cody Cutrer)
Pooling mode can be configured both per-database and per-user. (Cody Cutrer)
Per-database and per-user connection limits: max_db_connections and max_user_connections. (Cody Cutrer / Pavel Stehule)
Add DISABLE/ENABLE commands to prevent new connections. (William Grant)
Add c-ares as a DNS backend. It supports /etc/hosts refresh, SOA lookup, large replies through TCP or EDNS+UDP, and IPv6. It is now preferred and will probably become the only backend, replacing libraries with incomplete support.
c-ares versions <= 1.10 have a CNAME bug when IPv6 is enabled. Upstream has fixed it. As a workaround, PgBouncer uses c-ares <= 1.10 in IPv4-only mode. Other backends will remain until c-ares >1.10, still unreleased at this point, has been available for some time.
Show remote_pid in SHOW CLIENTS/SERVERS. Available for clients that connect over unix sockets and both tcp and unix socket server. In case of tcp-server, the pid is taken from cancel key.
Add separate config param (dns_nxdomain_ttl) for controlling negative dns caching. (Cody Cutrer)
Add the client host IP address and port to application_name. This is enabled by a config parameter application_name_add_host which defaults to ‘off’. (Andrew Dunstan)
Config files have ‘%include FILENAME’ directive to allow configuration to be split into several files. (Andrew Dunstan)
Cleanups
- log: wrap ipv6 address with []
- log: On connect to server, show local ip and port
- win32: use gnu-style for long args: –foo
- Allow numbers in hostname, always try to parse with inet_pton
- Fix deallocate_all() in FAQ
- Fix incorrect keyword in example config file (Magnus Hagander)
- Allow comments (with ‘;’) in auth files. (Guillaume Aubert)
- Fix spelling mistakes in log messages and comments. (Dmitriy Olshevskiy)
Fixes
- fix launching new connections during maintenance (Cody Cutrer)
- don’t load auth file twice at boot (Cody Cutrer)
- Proper invalidation for autodbs
- ipv6: Set IPV6_V6ONLY on listen socket.
- win32: Don’t set SO_REUSEADDR on listen socket.
- Fix IPv6 address memcpy
- Fix cancellation of waiting clients. (Mathieu Fenniak)
- Small bug fix, must check calloc result (Heikki Linnakangas)
- Add newline at the end of the PID file (Peter Eisentraut)
- Don’t allow new server connections when PAUSE
was issued. (Petr Jelinek) - Fix ‘bad packet’ during login when header is delayed. (Michał Trojnara, Marko Kreen)
- Fix errors detected by Coverty. (Euler Taveira)
- Disable server_idle_timeout when server count gets below min_pool (#60) (Marko Kreen)
PgBouncer 1.5.x
2015-04-09 - PgBouncer 1.5.5 - “Play Dead To Win”
- Fixes
- Fix remote crash - invalid packet order causes lookup of NULL pointer. Not exploitable, just DoS.
2012-11-28 - PgBouncer 1.5.4 - “No Leaks, Potty-Training Successful”
- Fixes
- DNS: Fix memory leak in getaddrinfo_a() backend.
- DNS: Fix memory leak in udns backend.
- DNS: Fix stats calculation.
- DNS: Improve error message handling for getaddrinfo_a().
- Fix win32 compile.
- Fix compiler dependency support check in configure.
- Few documentation fixes.
2012-09-12 - PgBouncer 1.5.3 - “Quantum Toaster”
Critical fix
Overlong database names can crash PgBouncer. Remote clients can trigger this when autodbs are enabled.
The original checks assumed that all names came from configuration files, so fatal() was acceptable. With ‘*’ in [databases], autodbs accept database names from the network. This allowed remote shutdown.
Minor Features
- max_packet_size - config parameter to tune maximum packet size that is allowed through. Default is kept same: (2G-1), but now it can be made smaller.
- In case of unparsable packet header, show it in hex in log and error message.
Fixes
- AntiMake used $(relpath) and $(abspath) for path manipulation. Builds failed when the source path contained symlinks. The code now operates on plain strings.
- console: now SET can be used to set empty string values.
- config.txt: show that all timeouts can be set in floats. This is well-hidden feature introduced in 1.4.
2012-05-29 - PgBouncer 1.5.2 - “Don’t Chew, Just Swallow”
- Fixes
- Interpret reserve_pool_timeout in seconds as intended. Previously, it used microseconds and activated the reserve pool almost immediately when the pool filled. (Noticed by Keyur Govande)
2012-04-17 - PgBouncer 1.5.1 - “Abort, Retry, Ignore?”
- Features
- Parameters to tune permissions on unix socket: unix_socket_mode=0777, unix_socket_group=’’.
- Fixes
- Allow empty string for server-side variable - this is needed to get “application_name” properly working, as it’s the only parameter that does not have server-side default.
- If connect string changes, require refresh of server parameters. Previously PgBouncer continued with old parameters, which breaks in case of Postgres upgrade.
- If autodb connect string changes, drop old connections.
- cf_setint: Use strtol() instead atoi() to parse integer config parameters. It allows hex, octal and better error detection.
- Use sigqueue() to detect union sigval existence - fixes compilation on HPUX.
- Remove ‘git’ command from Makefile, it throws random errors in case of plain-tarball build.
- Document stats_period parameter. This tunes the period for stats output.
- Require Asciidoc >= 8.4, seems docs are not compatible with earlier versions anymore.
- Stop trying to retry on EINTR from close().
2012-01-05 - PgBouncer 1.5 - “Bouncing Satisfied Clients Since 2007”
If you use more than 8 IPs behind one DNS name, you now need to use EDNS0 protocol to query. Only getaddrinfo_a()/getaddrinfo() and UDNS backends support it, libevent 1.x/2.x does not. To enable it for libc, add ‘options edns0’ to /etc/resolv.conf.
GNU Make 3.81+ is required for building.
- Features
- Detect DNS reply changes and invalidate connections to IPs no longer present in latest reply. (Petr Jelinek)
- Add DNS zone serial-based hostname invalidation. With dns_zone_check_period set, PgBouncer queries all DNS zones for SOA and queries all hostnames when the serial changes. This gives deterministic invalidation even when normal lookups do not occur. It requires the new UDNS backend.
- New SHOW DNS_HOSTS, SHOW DNS_ZONES commands to examine DNS cache.
- New param: min_pool_size - avoids dropping all connections when there is no load. (Filip Rembiałkowski)
- idle_in_transaction_timeout - kill transaction if idle too long. Not set by default.
- New libudns backend for DNS lookups. More featureful than evdns. Use –with-udns to activate. Does not work with IPv6 yet.
- KILL command, to immediately kill all connections for one database. (Michael Tharp)
- Move to Antimake build system to have better looking Makefiles. Now GNU Make 3.81+ is required for building.
- Fixes
- DNS now works with IPv6 hostnames.
- Don’t change connection state when NOTIFY arrives from server.
- Various documentation fixes. (Dan McGee)
- Console: Support ident quoting with “”. Originally we did not have any commands that took database names, so no quoting was needed.
- Console: allow numbers at the start of word regex. Trying to use strict parser makes things too complex here.
- Don’t expire auto DBs that are paused. (Michael Tharp)
- Create auto databases as needed when doing PAUSE. (Michael Tharp)
- Fix wrong log message issued by RESUME command. (Peter Eisentraut)
- When user= without password= is in database connect string, password will be taken from userlist.
- Parse ‘*’ properly in takeover code.
- autogen.sh: work with older autoconf/automake.
- Fix run-as-service crash on win32 due to bad basename() from mingw/msvc runtime. Now compat basename() is always used.
PgBouncer 1.4.x
2011-06-16 - PgBouncer 1.4.2 - “Strike-First Algorithm”
Affected OS-es: *BSD, Solaris, Win32.
- Portability Fixes
- Give CFLAGS to linker. Needed when using pthread-based getaddrinfo_a() fallback.
- lib/find_modules.sh: Replace split() with index()+substr(). This should make it work with older AWKs.
- <usual/endian.h>: Ignore system htoX/Xtoh defines. There may be only subset of macros defined.
- <usual/signal.h>: Separate compat sigval from compat sigevent
- <usual/socket.h>: Include <sys/uio.h> to get iovec
- <usual/time.h>: Better function autodetection on win32
- <usual/base_win32.h>: Remove duplicate sigval/sigevent declaration
2011-04-01 - PgBouncer 1.4.1 - “It Was All An Act”
Features
- Support listening/connect for IPv6 addresses. (Hannu Krosing)
- Multiple listen addresses in ’listen_addr’. For each getaddrinfo() is called, so names can also be used.
- console: Send PgBouncer version as ‘server_version’ to client.
Important Fixes
Disable getaddrinfo_a() on glibc < 2.9 as it crashes on older versions.
Affected systems include RHEL/CentOS 5.x (glibc 2.5) and Ubuntu 8.04 (glibc 2.7). Debian/lenny (glibc 2.7) has a non-crashing getaddrinfo_a(), but the build cannot reliably detect this exception.
Use libevent 2.x on these systems. The fallback getaddrinfo_a() is not intended for production. Read the new ‘DNS lookup support’ section in README for backend selection details.
(Hubert Depesz Lubaczewski, Dominique Hermsdorff, David Sommerseth)
Default to –enable-evdns if libevent 2.x is used.
Turn on tcp_keepalive by default, as that’s what Postgres also does. (Hubert Depesz Lubaczewski)
Set default server_reset_query to DISCARD ALL to be compatible with Postgres by default.
win32: Fix crashes with NULL unix socket addr. (Hiroshi Saito)
Fix autodb cleanup confusion between databases and pools. Previously, one empty pool marked the database idle. Later cleanup could then kill a database with active users.
Reported-By: Hubert Depesz Lubaczewski
Fixes
- Make compat getaddrinfo_a() non-blocking, by using single parallel thread to do lookups.
- Enable pthread compilation if compat getaddrinfo_a is used.
- release_server missed setting ->last_lifetime_disconnect on lifetime disconnect. (Emmanuel Courreges)
- win32: fix auth file on DOS line endings - load_file() did not take account of file shringage when loading. (Rich Schaaf)
- <usual/endian.h>: add autoconf detection for enc/dec functions so it would not create conflicts on BSD. (James Pye)
- Don’t crash when config file does not exist. (Lou Picciano)
- Don’t crash on DNS lookup failure when logging on noise level (-v -v). (Hubert Depesz Lubaczewski, Dominique Hermsdorff)
- Use backticks instead of $(cmd) in find_modules.sh to make it more portable. (Lou Picciano)
- Use ‘awk’ instead of ‘sed’ in find_modules.sh to make it more portable. (Giorgio Valoti)
- Log active async DNS backend info on startup.
- Fix –disable-evdns to mean ’no’ instead ‘yes’.
- Mention in docs that -R requires unix_socket_dir.
- Discuss server_reset_query in faq.txt.
- Restore lost memset in slab allocator
- Various minor portability fixes in libusual.
2011-01-11 - PgBouncer 1.4 - “Gore Code”
Features
Async DNS lookup - instead of resolving hostnames at reload time, the names are now resolved at connect time, with configurable caching. (See dns_max_ttl parameter.)
By default it uses getaddrinfo_a() (glibc) as backend, if it does not exist, then getaddrinfo_a() is emulated via blocking(!) getaddrinfo().
When –enable-evdns argument to configure, libevent’s evdns is used as backend. It is not used by default, because libevent 1.3/1.4 contain buggy implementation. Only evdns in libevent 2.0 seems OK.
New config var: syslog_ident, to tune syslog name.
Proper support for
application_namestartup parameter.Command line long options (Guillaume Lelarge)
Solaris portability fixes (Hubert Depesz Lubaczewski)
Add disable_pqexec to disable Simple Query Protocol where required. Applications must then use only Extended Query Protocol.
Postgres compat: if database name is empty in startup packet, use user name as database.
Fixes
- DateStyle and TimeZone server params need to use exact case.
- Console: send datetime, timezone and stdstr server params to client.
Internal cleanups
- Use libusual library for low-level utility functions.
- Remove fixed-length limit from server params.
PgBouncer 1.3.x
2010-09-09 - PgBouncer 1.3.4 - “Bouncer is always right”
- Fixes
- Apply fast-fail logic at connect time. So if server is failing, the clients get error when connecting.
- Don’t tag automatically generated databases for checking on reload time, otherwise they get killed, because they don’t exist in config.
- Ignore application_name parameter by default. This avoids the need for all Postgres 9.0 users to add it into ignore_startup_parameters= themselves.
- Correct pg_auth quoting. ‘' is not used there.
- Better error reporting on console, show incoming query to user.
- Support OS’es (OpenBSD) where tv_sec is not time_t.
- Avoid too noisy warnings on gcc 4.5.
2010-05-10 - PgBouncer 1.3.3 - “NSFW”
- Improvements
- Make listen(2) argument configurable: listen_backlog. This is useful on OS’es, where system max allowed is configurable.
- Improve disconnect messages to show what username or dbname caused login to fail.
- Fixes
- Adjust fast-fail relaunch. Previously, permanently invalid databases or users caused retries even without waiting clients.
- Preserve errno in logging functions. Changing it could cause incorrect PgBouncer behavior at high log levels or after logging errors.
- Increase the size of various startup-related buffers to handle EDB more noisy startup.
- Detect V2 protocol startup request and give clear reason for disconnect.
2010-03-15 - PgBouncer 1.3.2 - “Boomerang Bullet”
Fixes
New config var ‘query_wait_timeout’. If client does not get server connection in this many seconds, it will be killed.
If no server connection in pool and last connect failed, then don’t put client connections on hold but send error immediately.
This together with previous fix avoids unnecessary stalls if a database has gone down.
Track libevent state in sbuf.c to avoid double event_del(). Although it usually is safe, it does not seem to work 100%. Now we should always know whether it has been called or not.
Disable maintenance during SUSPEND. Otherwise with short timeouts the old bouncer could close few connections after sending them over.
Apply client_login_timeout to clients waiting for welcome packet (first server connection). Otherwise they can stay waiting infinitely, unless there is query_timeout set.
win32: Add switch -U/-P to -regservice to let user pick account to run service under. Old automatic choice between Local Service and Local System was not reliable enough.
console: Remove \0 from end of text columns. It was hard to notice, as C clients were fine with it.
Documentation improvements. (Greg Sabino Mullane)
Clarify few login-related log messages.
Change logging level for pooler-sent errors (usually on disconnect) from INFO to WARNING, as they signify problems.
Change log message for query_timeout to “query timeout”.
2009-07-06 - PgBouncer 1.3.1 - “Now fully conforming to NSA monitoring requirements”
- Fixes
- Fix sbuf_loopcnt connection hangs. A query or result near a multiple of (pktlen*sbuf_loopcnt), 10k by default, could wait indefinitely for nonexistent extra data.
- Make database reconfigure immediate. Currently old connections could be reused after SIGHUP.
- Fix SHOW DATABASES which was broken due to column addition.
- Console access was disabled when “auth_type=any” as pgbouncer dropped username. Fix: if “auth_type=any”, allow any user to console as admin.
- Fix bad CUSTOM_ALIGN macro. Luckily it’s unused if OS already defines ALIGN macro thus seems the bug has not happened in wild.
- win32: call WSAStartup() always, not only in daemon mode as config parsing wants to resolve hosts.
- win32: put quotes around config filename in service cmdline to allow spaces in paths. Executable path does not seem to need it due to some win32 magic.
- Add STATS to SHOW HELP text.
- doc/usage.txt: the time units in console results are in microseconds, not milliseconds.
2009-02-18 - PgBouncer 1.3 - “New Ki-Smash Finishing Move”
Features
IANA assigned official PgBouncer port 6432, which is now the default. Existing individual users do not need to change ports. Package distributors should change their package default to 6432.
Dynamic database creation (David Galoyan)
Now you can define database with name “*”. If defined, it’s connect string will be used for all undefined databases. Useful mostly for test / dev environments.
Windows support (Hiroshi Saito)
PgBouncer runs on Windows 2000+ now. Command line usage stays same, except it cannot run as daemon and cannot do online reboot. To run as service, define parameter service_name in config. Then:
> pgbouncer.exe config.ini -regservice > net start SERVICE_NAMETo stop and unregister:
> net stop SERVICE_NAME > pgbouncer.exe config.ini -unregserviceTo use Windows Event Log, event DLL needs to be registered first:
> regsrv32 pgbevent.dllAfterwards you can set “syslog = 1” in config.
Minor features
Database names in config file can now be quoted with standard SQL ident quoting, to allow non-standard characters in db names.
Add ‘reserve_pool_size’ and ‘reserve_pool_timeout’. If clients wait longer than ‘reserve_pool_timeout’ seconds, PgBouncer can add ‘reserve_pool_size’ connections. Set this per pool with the ‘reserve_pool’ connection variable.
New tunable ‘sbuf_loopcnt’ to limit time spent on one socket.
On an SMP server with local Postgres and a fast network, recv()->send() can repeat without blocking. This delays other connections. Limit iterations per socket to distribute processing more evenly. At the limit, process other sockets and resume this socket on the next event loop.
Thanks to Alexander Schöcke for report and testing.
crypt() authentication is now optional, as it was removed from Postgres. If OS does not provide it, pgbouncer works fine without it.
Add milliseconds to log timestamps.
Replace old MD5 implementation with more compact one.
Update ISC licence with the FSF clarification.
Fixes
Continue cleanup after event_del() failure. Previously, PgBouncer retried because failure could indicate ENOMEM. Repeated retries caused infinite log output, which suggests libevent does not support this behavior.
The cause of the initial event_del() failure remains unknown.
–enable-debug now just toggles whether debug info is stripped from binary. It no longer plays with -fomit-frame-pointer as it’s dangerous.
Fix include order, as otherwise system includes could come before internal ones. Was problem for new md5.h include file.
Include COPYRIGHT file in .tgz…
PgBouncer 1.2.x
2008-08-08 - PgBouncer 1.2.3 - “Carefully Selected Bytes”
- Fixes
- Disable SO_ACCEPTFILTER code for BSDs which did not work.
- Include example etc/userlist.txt in tgz.
- Use ‘$(MAKE)’ instead ‘make’ for recursion (Jørgen Austvik)
- Define _GNU_SOURCE as glibc is useless otherwise.
- Let the libevent 1.1 pass link test so we can later report “1.3b+ needed”
- Detect stale pidfile and remove it.
Thanks to Devrim GÜNDÜZ and Bjoern Metzdorf for problem reports and testing.
2008-08-06 - PgBouncer 1.2.2 - “Barf-bag Included”
- Fixes
- Remove ‘drop_on_error’. This workaround for broken Postgres plan cache behavior can cause problems when queries consistently return errors.
2008-08-04 - PgBouncer 1.2.1 - “Waterproof”
- Features
- New parameter ‘drop_on_error’ - if server throws error the connection will not be reused but dropped after client finished with it. This is needed to refresh plan cache. Automatic refresh does not work even in 8.3. Defaults to 1.
- Fixes
- SHOW SOCKETS/CLIENTS/SERVERS: Don’t crash if socket has no buffer.
- Fix infinite loop on SUSPEND if suspend_timeout triggers.
- Minor cleanups
- Use <sys/uio.h> for ‘struct iovec’.
- Cancel shutdown (from SIGINT) on RESUME/SIGUSR2, otherwise it will trigger on next PAUSE.
- Proper log message if console operation is canceled.
2008-07-29 - PgBouncer 1.2 - “Ordinary Magic Flute”
PgBouncer 1.2 now requires libevent version 1.3b or newer. Older libevent versions crash with new restart code.
Features
Command line option (-u) and config parameter (user=) to support user switching at startup. Also now pgbouncer refuses to run as root.
(Jacob Coby)
More descriptive usage text (-h). (Jacob Coby)
New database option: connect_query to allow run a query on new connections before they are taken into use.
(Teodor Sigaev)
Add ‘ignore_startup_parameters’ to accept and ignore additional startup parameters. By default, only ‘database’ and ‘user’ are accepted. Other parameters cause errors. This supports JDBC clients that always set ’extra_float_digits=2’ at startup.
Logging to syslog: new parameters syslog=0/1 and syslog_facility=daemon/user/local0.
Less scary online restart (-R)
Move FD loading before fork, so it logs to console and can be canceled by ^C
Keep SHUTDOWN after fork, so ^C would be safe
A connect() is attempted to unix socket to see if anyone is listening. Now -R can be used even when no previous process was running. If there is previous process, but -R is not used, startup fails.
New console commands:
SHOW TOTALS that shows stats summary (as goes to log) plus mem usage.
SHOW ACTIVE_SOCKETS - like show sockets; but filter only active ones.
Less visible features
suspend_timeout - drop stalled conns and long logins. This brings additional safety to reboot.
When remote database throws error on logging in, notify clients.
Removing a database from config and reloading works - all connections are killed and the database is removed.
Fake some parameters on console SHOW/SET commands to be more Postgres-like. That was needed to allow psycopg to connect to console. (client_encoding/default_transaction_isolation/datestyle/timezone)
Make server_lifetime=0 disconnect server connection immediately after first use. Previously “0” made PgBouncer ignore server age. As this behavior was undocumented, there should not be any users depending on it.
Internal improvements:
Packet buffers are allocated lazily and reused. This should bring huge decrease in memory usage. This also makes realistic to use big pktbuf with lot of connections.
Lot’s of error handling improvements, PgBouncer should now survive OOM situations gracefully.
Use slab allocator for memory management.
Lots of code cleanups.
Fixes
- Drain the listening socket fully on each event loop. Previously, one accept() per loop could create a backlog under heavy connection load. This should resolve that backlog.
- Handle EINTR from connect().
- Make configure.ac compatible with autoconf 2.59.
- Solaris compatibility fixes (Magne Mæhre)
PgBouncer 1.1.x
2007-12-10 - PgBouncer 1.1.2 - “The Hammer”
- Features
- Disconnects because of server_lifetime are now separated by (server_lifetime / pool_size) seconds. This avoids pgbouncer causing reconnect floods.
- Fixes
- Online upgrade 1.0 -> 1.1 problems:
- 1.0 does not track server parameters, so they stay NULL but 1.1 did not expect it and crashed.
- If server params are unknown, but client ones are set, then issue a SET for them, instead complaining.
- Remove temp debug statements that were accidentally left in code on INFO level, so they polluted logs.
- Unbroke debian/changelog
- Online upgrade 1.0 -> 1.1 problems:
- Cleanup
- reorder struct SBuf fields to get better alignment for buffer.
2007-10-26 - PgBouncer 1.1.1 - “Breakdancing Bee”
- Fixes
- Server parameter cache could stay uninitialized, which caused unnecessary SET of them. This caused problem on 8.1 which does not allow touching standard_conforming_strings. (Thanks to Dimitri Fontaine for report & testing.)
- Some doc fixes.
- Include doc/fixman.py in .tgz.
2007-10-09 - PgBouncer 1.1 - “Mad-Hat Toolbox”
Features
Keep track of following server parameters:
client_encoding datestyle, timezone, standard_conforming_stringsDatabase connect string enhancements:
- Accept hostname in host=
- Accept custom unix socket location in host=
- Accept quoted values: password=’ asd’‘foo’
New config var: server_reset_query, to be sent immediately after release
New config var: server_round_robin, to switch between LIFO and RR.
Cancel pkt sent for idle connection does not drop it anymore.
Cancel with ^C from psql works for SUSPEND / PAUSE.
Print FD limits on startup.
When suspending, try to hit packet boundary ASAP.
Add ’timezone’ to database parameters.
Use longlived logfile fd. Reopened on SIGHUP / RELOAD;
Local connection endpoint info in SHOW SERVERS/CLIENTS/SOCKETS.
Code cleanup
- More debug log messages include socket info.
- Magic number removal and error message cleanup. (David Fetter)
- Wrapper struct for current pkt info. Removes a lot of complexity.
Fixes
- Detect invalid pkt headers better.
- auth_file modification check was broken, which made pgbouncer reload it too often.
PgBouncer 1.0.x
2007-06-18 - PgBouncer 1.0.8 - “Undead Shovel Jutsu”
- Fixes
- Fix crash in cancel packet handling. (^C from psql)
- Features
- PAUSE
; RESUME ; works now. - Cleanup of console command parsing.
- Disable expensive in-list assert check.
- PAUSE
2007-04-19 - PgBouncer 1.0.7 - “With Vitamin A-Z”
- Fixes
- Remove obsolete flushing logic that caused assertions when send() blocked between error or notice packets. PgBouncer does not actively buffer data, so this logic is unnecessary. It remained from kernel buffering with MSG_MORE.
- Additionally avoid calling recv() logic when sending unblocks.
- List search code for admin_users and stats_users mishandled partial finds. Fix it.
- Standardise UNIX socket peer UID finding to getpeereid().
2007-04-12 - PgBouncer 1.0.6 - “Daily Dose”
- Fixes
- The “Disable maintenance during the takeover” fix could disable maintenance altogether. Fix it.
- Compilation fix for FreeBSD, <sys/ucred.h> requires <sys/param.h> there. Thanks go to Robert Gogolok for report.
2007-04-11 - PgBouncer 1.0.5 - “Enough for today”
- Fixes
- Fix online-restart bugs:
- Set ->ready for idle servers.
- Remove obsolete code from use_client_socket()
- Disable maintenance during the takeover.
- Fix online-restart bugs:
2007-04-11 - PgBouncer 1.0.4 - “Last ’last’ bug”
- Fixes
- Notice from idle server tagged server dirty. release_server() did not expect it. Fix it by dropping them.
2007-04-11 - PgBouncer 1.0.3 - “Fearless Fork”
Fixes
- Some error handling was missing in login path, so dying connection there could trigger asserts.
- Cleanup of asserts in sbuf.c to catch problems earlier.
- Create core when Assert() triggers.
New stuff
- New config vars: log_connections, log_disconnections, log_pooler_errors to turn on/off noise.
- Config var: client_login_timeout to kill dead connections in login phase that could stall SUSPEND and thus online restart.
2007-03-28 - PgBouncer 1.0.2 - “Supersonic Spoon”
- Fixes
- libevent may report a deleted event inside same loop. Avoid socket reuse for one loop.
- release_server() from disconnect_client() didn’t look it the packet was actually sent.
2007-03-15 - PgBouncer 1.0.1 - “Alien technology”
Fixes
- Mixed usage of cached and non-cached time, plus unsigned usec_t typedef created spurious query_timeout errors.
- Fix rare case when socket woken up from send-wait could stay stalling.
- More fair queueing of server connections. Before, a new query could get a server connections before older one.
- Delay server release until everything is guaranteed to be sent.
Features
- SHOW SOCKETS command to have detailed info about state.
- Put PgSocket ptr to log, to help tracking one connection.
- In console, allow SELECT in place of SHOW.
- Various code cleanups.
2007-03-13 - PgBouncer 1.0 - “Tuunitud bemm”
- First public release.
7 - Community
Tutorials
How to Set Up PgBouncer for Postgres Plus Standard Server
Good overview of PgBouncer concepts.
What is the point of bouncing?
Discusses differences between pooling modes.
Support
Project page at GitHub
Issue tracker at GitHub
PgBouncer section at Stack Overflow
Chat room at Gitter
Community discussions at GitHub
8 - Frequently Asked Questions
How to connect to PgBouncer?
PgBouncer acts as a Postgres server. Configure your client to use the PgBouncer port.
How to load-balance queries between several servers?
PgBouncer supports comma-separated hosts in a database connection string. With load_balance_hosts=round-robin, new server connections use each host in turn. For example:
You can also use external tools:
DNS round-robin: Assign several IP addresses to one DNS name. PgBouncer caches all addresses and uses them in turn. It does not run a DNS lookup for every new connection. For more than 8 addresses per name, the DNS backend must support EDNS0. See DNS lookup support.
Use a TCP load balancer, such as LVS or HAProxy. Consider reducing
server_lifetimeand enablingserver_round_robinin PgBouncer. By default, idle connection reuse follows a LIFO algorithm, which may be unsuitable for load balancing.
How to failover
With comma-separated hosts and load_balance_hosts=disable, PgBouncer uses one host until a connection attempt fails. It then tries the next host. This does not detect primary or replica roles. Use external tools for failover that follows database topology changes:
DNS reconfiguration: When the IP address for a DNS name changes, PgBouncer reconnects to the new server. Set
dns_max_ttlto control the cache lifetime for each host name. Setdns_zone_check_periodto control how often PgBouncer checks a zone SOA for changes. If the SOA record changes, PgBouncer looks up all host names in that zone again.Change the host in the configuration. To reload it, send SIGHUP or run
RELOADon the console. PgBouncer detects the changed host and reconnects to the new server.Use
RECONNECTif neither preceding method applies. For example, HAProxy may route downstream connections from PgBouncer. After HAProxy changes its routing information, runRECONNECTto reopen all server connections.
How to use prepared statements with session pooling?
In session pooling, the reset query must remove old prepared statements. Use server_reset_query = DISCARD ALL; or at least DEALLOCATE ALL;.
How to use prepared statements with transaction pooling?
Since 1.21.0, PgBouncer can track prepared statements in transaction pooling. It prepares them as needed on the linked server connection. To enable support, set max_prepared_statements to a non-zero value. The default is 200. See the max_prepared_statements documentation.
PHP/PDO compatibility with PgBouncer prepared statements depends on its version (#991). Compatibility requires PHP 8.4+ and libpq 17. For older versions, we recommend an upgrade or disabling prepared statements on the client.
Disabling prepared statements in JDBC
For JDBC, add prepareThreshold=0 to the connection string.
Disabling prepared statements in PHP/PDO
To disable server-side prepared statements, set PDO::ATTR_EMULATE_PREPARES to true. You can set it when you connect:
$db = new PDO("dsn", "user", "pass", array(PDO::ATTR_EMULATE_PREPARES => true));
or later:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
How to upgrade PgBouncer without dropping connections?
Use a rolling restart. Follow the SHUTDOWN WAIT_FOR_CLIENTS procedure.
How to know which client is on which server connection?
Use the SHOW CLIENTS and SHOW SERVERS commands on the console.
Use
ptrandlinkto map local client connection to server connection.Use
addrandportof client connection to identify TCP connection from client.Use
local_addrandlocal_portto identify TCP connection to server.
Should PgBouncer be installed on the web server or database server?
It depends.
For short-lived connections, install PgBouncer on the web server to minimize connection setup latency. TCP needs several packet round trips before a connection is usable. If many hosts, such as web servers, connect to one database server, install PgBouncer on that database server. This lets PgBouncer optimize their connections together.
You can install PgBouncer on both web and database servers. Each PgBouncer hop adds a small delay to each query.
Test each arrangement against your performance requirements. Consider how its placement affects application failover when a web server or database server fails.