PostgreSQL Error 57000: operator intervention
PostgreSQL error code 57000 (operator_intervention) is a parent error class that signals a database session or query was forcefully interrupted by an external agent — typically a DBA, system administrator, or an automated timeout policy. It is rarely seen in isolation; instead, you'll most often encounter its child error codes such as 57014 (query_canceled) or 57P01 (admin_shutdown). Understanding this error class is critical for building resilient applications on top of PostgreSQL.
Top 3 Causes
1. Manual Session Termination by a DBA
The most common cause is a DBA calling pg_cancel_backend() or pg_terminate_backend() to kill a long-running query or a blocking session. This is routine operational work, but it can surprise application code that doesn't handle these interruptions gracefully.
-- Find long-running queries (over 5 minutes)
SELECT pid, now() - query_start AS duration, state, query
FROM pg_stat_activity
WHERE state = 'active'
AND (now() - query_start) > INTERVAL '5 minutes';
-- Cancel just the query (session stays alive)
SELECT pg_cancel_backend(12345);
-- Terminate the entire session (triggers rollback)
SELECT pg_terminate_backend(12345);
2. statement_timeout or lock_timeout Exceeded
When a query runs longer than the configured statement_timeout, PostgreSQL automatically raises error 57014 (a child of 57000). Similarly, if a transaction waits longer than lock_timeout to acquire a lock, it is aborted. Misconfigured or overly aggressive timeout values are a frequent culprit in production incidents.
-- Check current timeout settings
SHOW statement_timeout;
SHOW lock_timeout;
-- Set timeouts at the role level (recommended approach)
ALTER ROLE app_user SET statement_timeout = '30s';
ALTER ROLE batch_user SET statement_timeout = '2h';
-- Override for a specific transaction only
BEGIN;
SET LOCAL statement_timeout = '60min';
UPDATE large_table SET status = 'processed' WHERE batch_id = 42;
COMMIT;
-- Identify queries that are waiting on locks
SELECT pid, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE wait_event_type = 'Lock';
3. Server Shutdown or Restart (admin_shutdown / crash_shutdown)
When a PostgreSQL server is stopped via pg_ctl stop or systemctl stop postgresql, all active sessions receive error 57P01 (admin_shutdown). If the server crashes unexpectedly, sessions encounter 57P02 (crash_shutdown) during recovery. Both are subclasses of 57000 and can catch application code off guard during planned maintenance windows.
-- Check how many connections exist and their states
SELECT state, count(*) AS cnt
FROM pg_stat_activity
GROUP BY state
ORDER BY cnt DESC;
-- Gracefully notify users before shutdown (set a custom message)
-- Then perform a fast shutdown
-- $ pg_ctl stop -m fast
-- After restart, confirm recovery is complete
SELECT pg_is_in_recovery();
-- Simple health-check query for connection pool probes
SELECT 1 AS alive;
Quick Fix Solutions
-
Retry logic: Catch
57000-class errors at the application layer and implement exponential backoff with a defined maximum retry count. -
Tune timeouts per role: Use
ALTER ROLEto apply appropriatestatement_timeoutvalues for different workload types instead of using a single global value. - Connection pool health checks: Configure PgBouncer or your application pool to detect stale connections after a server restart and reconnect automatically.
- Separate OLTP from batch: Route long-running batch jobs through a dedicated role or connection pool with relaxed timeout settings to avoid collateral cancellations.
Prevention Tips
1. Implement role-based timeout tiers
Never rely on a single global timeout. Define explicit tiers so that OLTP, analytics, and batch workloads each have suitable limits without interfering with one another.
ALTER ROLE oltp_role SET statement_timeout = '30s';
ALTER ROLE analyst_role SET statement_timeout = '10min';
ALTER ROLE etl_role SET statement_timeout = '6h';
ALTER SYSTEM SET idle_in_transaction_session_timeout = '5min';
SELECT pg_reload_conf();
2. Always distinguish retriable errors in application code
Error code 57000 and its children are generally retriable — the data is still consistent and no corruption occurred. Make sure your error handling layer explicitly checks for SQLSTATE codes in the 57xxx range and retries safely, while non-retriable errors (e.g., 23xxx integrity violations) are surfaced immediately to the user.
Related Error Codes
| Code | Name | Summary |
|---|---|---|
57014 |
query_canceled |
Timeout exceeded or explicit cancel |
57P01 |
admin_shutdown |
Clean server shutdown |
57P02 |
crash_shutdown |
Server crash / unclean shutdown |
57P03 |
cannot_connect_now |
Server starting up or in recovery |
57P04 |
database_dropped |
Connected DB was dropped |
📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.
Top comments (0)