diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 9ab070adffba..ccc5b9d7a255 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -24916,6 +24916,22 @@ SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n);
+
+
+
+ pg_postmaster_open_time
+
+ pg_postmaster_open_time ()
+ timestamp with time zone
+
+
+ Returns the time when the server was open to connections. On a standby
+ this will be the time when the server was open to read-only connections.
+ In single-user mode this returns the time the server was ready to accept
+ user commands.
+
+
+
diff --git a/src/backend/postmaster/launch_backend.c b/src/backend/postmaster/launch_backend.c
index bf6b55ee8304..bad35abfe6e8 100644
--- a/src/backend/postmaster/launch_backend.c
+++ b/src/backend/postmaster/launch_backend.c
@@ -111,6 +111,7 @@ typedef struct
ProcSignalHeader *ProcSignal;
pid_t PostmasterPid;
TimestampTz PgStartTime;
+ TimestampTz PgOpenStartTime;
TimestampTz PgReloadTime;
pg_time_t first_syslogger_file_time;
bool redirection_done;
@@ -771,6 +772,7 @@ save_backend_variables(BackendParameters *param,
param->PostmasterPid = PostmasterPid;
param->PgStartTime = PgStartTime;
+ param->PgOpenStartTime = PgOpenStartTime;
param->PgReloadTime = PgReloadTime;
param->first_syslogger_file_time = first_syslogger_file_time;
@@ -1031,6 +1033,7 @@ restore_backend_variables(BackendParameters *param)
PostmasterPid = param->PostmasterPid;
PgStartTime = param->PgStartTime;
+ PgOpenStartTime = param->PgOpenStartTime;
PgReloadTime = param->PgReloadTime;
first_syslogger_file_time = param->first_syslogger_file_time;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 17fed96fe20c..7a820997617a 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -2342,6 +2342,11 @@ process_pm_child_exit(void)
*/
StartWorkerNeeded = true;
+ /*
+ * Remember time when database was open to connections
+ */
+ PgOpenStartTime = GetCurrentTimestamp();
+
/* at this point we are really open for business */
ereport(LOG,
(errmsg("database system is ready to accept connections")));
@@ -3737,6 +3742,11 @@ process_pm_pmsignal(void)
ereport(LOG,
(errmsg("database system is ready to accept read-only connections")));
+ /*
+ * Remember time when database was open to connections
+ */
+ PgOpenStartTime = GetCurrentTimestamp();
+
/* Report status */
AddToDataDirLockFile(LOCK_FILE_LINE_PM_STATUS, PM_STATUS_READY);
#ifdef USE_SYSTEMD
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 6ae9f38f0c84..ee9bfdd604cc 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -4157,6 +4157,11 @@ PostgresSingleUserMain(int argc, char *argv[],
*/
PgStartTime = GetCurrentTimestamp();
+ /*
+ * Remember when stand-alone was open to user commands.
+ */
+ PgOpenStartTime = GetCurrentTimestamp();
+
/*
* Create a per-backend PGPROC struct in shared memory. We must do this
* before we can use LWLocks.
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 347089b76264..0badfd215c97 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -53,6 +53,9 @@
/* Set at postmaster start */
TimestampTz PgStartTime;
+/* Set when database is open to connections */
+TimestampTz PgOpenStartTime;
+
/* Set at configuration reload */
TimestampTz PgReloadTime;
@@ -1629,6 +1632,12 @@ pg_postmaster_start_time(PG_FUNCTION_ARGS)
PG_RETURN_TIMESTAMPTZ(PgStartTime);
}
+Datum
+pg_postmaster_open_time(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TIMESTAMPTZ(PgOpenStartTime);
+}
+
Datum
pg_conf_load_time(PG_FUNCTION_ARGS)
{
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 37a484147a8f..b5155150a3a4 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8741,6 +8741,12 @@
prorettype => 'timestamptz', proargtypes => '',
prosrc => 'pg_postmaster_start_time' },
+# open to connections start time function
+{ oid => '8600', descr => 'open connections start time',
+ proname => 'pg_postmaster_open_time', provolatile => 's',
+ prorettype => 'timestamptz', proargtypes => '',
+ prosrc => 'pg_postmaster_open_time' },
+
# config reload time function
{ oid => '2034', descr => 'configuration load time',
proname => 'pg_conf_load_time', provolatile => 's', proparallel => 'r',
diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h
index 8c205859c3be..7960d15f37fe 100644
--- a/src/include/utils/timestamp.h
+++ b/src/include/utils/timestamp.h
@@ -98,6 +98,9 @@ TimestampDifferenceMicroseconds(TimestampTz start_time,
/* Set at postmaster start */
extern PGDLLIMPORT TimestampTz PgStartTime;
+/* Set when database is open to connections */
+extern PGDLLIMPORT TimestampTz PgOpenStartTime;
+
/* Set at configuration reload */
extern PGDLLIMPORT TimestampTz PgReloadTime;