Add pg_stat_wal statistics view.
This view shows the statistics about WAL activity. Currently it has only two columns: wal_buffers_full and stats_reset. wal_buffers_full column indicates the number of times WAL data was written to the disk because WAL buffers got full. This information is useful when tuning wal_buffers. stats_reset column indicates the time at which these statistics were last reset. pg_stat_wal view is also the basic infrastructure to expose other various statistics about WAL activity later. Bump PGSTAT_FILE_FORMAT_ID due to the change in pgstat format. Bump catalog version. Author: Masahiro Ikeda Reviewed-by: Takayuki Tsunakawa, Kyotaro Horiguchi, Amit Kapila, Fujii Masao Discussion: https://postgr.es/m/188bd3f2d2233cf97753b5ced02bb050@oss.nttdata.com
This commit is contained in:
parent
9d0bd95fa9
commit
8d9a935965
|
@ -424,6 +424,14 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser
|
|||
</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structname>pg_stat_wal</structname><indexterm><primary>pg_stat_wal</primary></indexterm></entry>
|
||||
<entry>One row only, showing statistics about WAL activity. See
|
||||
<link linkend="monitoring-pg-stat-wal-view">
|
||||
<structname>pg_stat_wal</structname></link> for details.
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structname>pg_stat_database</structname><indexterm><primary>pg_stat_database</primary></indexterm></entry>
|
||||
<entry>One row per database, showing database-wide statistics. See
|
||||
|
@ -3280,6 +3288,56 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
|
|||
|
||||
</sect2>
|
||||
|
||||
<sect2 id="monitoring-pg-stat-wal-view">
|
||||
<title><structname>pg_stat_wal</structname></title>
|
||||
|
||||
<indexterm>
|
||||
<primary>pg_stat_wal</primary>
|
||||
</indexterm>
|
||||
|
||||
<para>
|
||||
The <structname>pg_stat_wal</structname> view will always have a
|
||||
single row, containing data about WAL activity of the cluster.
|
||||
</para>
|
||||
|
||||
<table id="pg-stat-wal-view" xreflabel="pg_stat_wal">
|
||||
<title><structname>pg_stat_wal</structname> View</title>
|
||||
<tgroup cols="1">
|
||||
<thead>
|
||||
<row>
|
||||
<entry role="catalog_table_entry"><para role="column_definition">
|
||||
Column Type
|
||||
</para>
|
||||
<para>
|
||||
Description
|
||||
</para></entry>
|
||||
</row>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<row>
|
||||
<entry role="catalog_table_entry"><para role="column_definition">
|
||||
<structfield>wal_buffers_full</structfield> <type>bigint</type>
|
||||
</para>
|
||||
<para>
|
||||
Number of times WAL data was written to the disk because WAL buffers got full
|
||||
</para></entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry role="catalog_table_entry"><para role="column_definition">
|
||||
<structfield>stats_reset</structfield> <type>timestamp with time zone</type>
|
||||
</para>
|
||||
<para>
|
||||
Time at which these statistics were last reset
|
||||
</para></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
||||
</sect2>
|
||||
|
||||
<sect2 id="monitoring-pg-stat-database-view">
|
||||
<title><structname>pg_stat_database</structname></title>
|
||||
|
||||
|
@ -4668,8 +4726,9 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
|
|||
argument. The argument can be <literal>bgwriter</literal> to reset
|
||||
all the counters shown in
|
||||
the <structname>pg_stat_bgwriter</structname>
|
||||
view, or <literal>archiver</literal> to reset all the counters shown in
|
||||
the <structname>pg_stat_archiver</structname> view.
|
||||
view, <literal>archiver</literal> to reset all the counters shown in
|
||||
the <structname>pg_stat_archiver</structname> view or <literal>wal</literal>
|
||||
to reset all the counters shown in the <structname>pg_stat_wal</structname> view.
|
||||
</para>
|
||||
<para>
|
||||
This function is restricted to superusers by default, but other users
|
||||
|
|
|
@ -2196,6 +2196,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic)
|
|||
WriteRqst.Flush = 0;
|
||||
XLogWrite(WriteRqst, false);
|
||||
LWLockRelease(WALWriteLock);
|
||||
WalStats.m_wal_buffers_full++;
|
||||
TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_DONE();
|
||||
}
|
||||
/* Re-acquire WALBufMappingLock and retry */
|
||||
|
|
|
@ -979,6 +979,12 @@ CREATE VIEW pg_stat_bgwriter AS
|
|||
pg_stat_get_buf_alloc() AS buffers_alloc,
|
||||
pg_stat_get_bgwriter_stat_reset_time() AS stats_reset;
|
||||
|
||||
CREATE VIEW pg_stat_wal AS
|
||||
SELECT
|
||||
w.wal_buffers_full,
|
||||
w.stats_reset
|
||||
FROM pg_stat_get_wal() w;
|
||||
|
||||
CREATE VIEW pg_stat_progress_analyze AS
|
||||
SELECT
|
||||
S.pid AS pid, S.datid AS datid, D.datname AS datname,
|
||||
|
|
|
@ -504,6 +504,9 @@ CheckpointerMain(void)
|
|||
*/
|
||||
pgstat_send_bgwriter();
|
||||
|
||||
/* Send WAL statistics to the stats collector. */
|
||||
pgstat_send_wal();
|
||||
|
||||
/*
|
||||
* If any checkpoint flags have been set, redo the loop to handle the
|
||||
* checkpoint without sleeping.
|
||||
|
|
|
@ -135,11 +135,12 @@ char *pgstat_stat_filename = NULL;
|
|||
char *pgstat_stat_tmpname = NULL;
|
||||
|
||||
/*
|
||||
* BgWriter global statistics counters (unused in other processes).
|
||||
* Stored directly in a stats message structure so it can be sent
|
||||
* without needing to copy things around. We assume this inits to zeroes.
|
||||
* BgWriter and WAL global statistics counters.
|
||||
* Stored directly in a stats message structure so they can be sent
|
||||
* without needing to copy things around. We assume these init to zeroes.
|
||||
*/
|
||||
PgStat_MsgBgWriter BgWriterStats;
|
||||
PgStat_MsgWal WalStats;
|
||||
|
||||
/*
|
||||
* List of SLRU names that we keep stats for. There is no central registry of
|
||||
|
@ -281,6 +282,7 @@ static int localNumBackends = 0;
|
|||
*/
|
||||
static PgStat_ArchiverStats archiverStats;
|
||||
static PgStat_GlobalStats globalStats;
|
||||
static PgStat_WalStats walStats;
|
||||
static PgStat_SLRUStats slruStats[SLRU_NUM_ELEMENTS];
|
||||
|
||||
/*
|
||||
|
@ -353,6 +355,7 @@ static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len);
|
|||
static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len);
|
||||
static void pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len);
|
||||
static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len);
|
||||
static void pgstat_recv_wal(PgStat_MsgWal *msg, int len);
|
||||
static void pgstat_recv_slru(PgStat_MsgSLRU *msg, int len);
|
||||
static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len);
|
||||
static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len);
|
||||
|
@ -938,6 +941,9 @@ pgstat_report_stat(bool force)
|
|||
/* Now, send function statistics */
|
||||
pgstat_send_funcstats();
|
||||
|
||||
/* Send WAL statistics */
|
||||
pgstat_send_wal();
|
||||
|
||||
/* Finally send SLRU statistics */
|
||||
pgstat_send_slru();
|
||||
}
|
||||
|
@ -1370,11 +1376,13 @@ pgstat_reset_shared_counters(const char *target)
|
|||
msg.m_resettarget = RESET_ARCHIVER;
|
||||
else if (strcmp(target, "bgwriter") == 0)
|
||||
msg.m_resettarget = RESET_BGWRITER;
|
||||
else if (strcmp(target, "wal") == 0)
|
||||
msg.m_resettarget = RESET_WAL;
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("unrecognized reset target: \"%s\"", target),
|
||||
errhint("Target must be \"archiver\" or \"bgwriter\".")));
|
||||
errhint("Target must be \"archiver\", \"bgwriter\" or \"wal\".")));
|
||||
|
||||
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER);
|
||||
pgstat_send(&msg, sizeof(msg));
|
||||
|
@ -2674,6 +2682,21 @@ pgstat_fetch_global(void)
|
|||
return &globalStats;
|
||||
}
|
||||
|
||||
/*
|
||||
* ---------
|
||||
* pgstat_fetch_stat_wal() -
|
||||
*
|
||||
* Support function for the SQL-callable pgstat* functions. Returns
|
||||
* a pointer to the WAL statistics struct.
|
||||
* ---------
|
||||
*/
|
||||
PgStat_WalStats *
|
||||
pgstat_fetch_stat_wal(void)
|
||||
{
|
||||
backend_read_statsfile();
|
||||
|
||||
return &walStats;
|
||||
}
|
||||
|
||||
/*
|
||||
* ---------
|
||||
|
@ -4419,6 +4442,38 @@ pgstat_send_bgwriter(void)
|
|||
MemSet(&BgWriterStats, 0, sizeof(BgWriterStats));
|
||||
}
|
||||
|
||||
/* ----------
|
||||
* pgstat_send_wal() -
|
||||
*
|
||||
* Send WAL statistics to the collector
|
||||
* ----------
|
||||
*/
|
||||
void
|
||||
pgstat_send_wal(void)
|
||||
{
|
||||
/* We assume this initializes to zeroes */
|
||||
static const PgStat_MsgWal all_zeroes;
|
||||
|
||||
/*
|
||||
* This function can be called even if nothing at all has happened. In
|
||||
* this case, avoid sending a completely empty message to the stats
|
||||
* collector.
|
||||
*/
|
||||
if (memcmp(&WalStats, &all_zeroes, sizeof(PgStat_MsgWal)) == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Prepare and send the message
|
||||
*/
|
||||
pgstat_setheader(&WalStats.m_hdr, PGSTAT_MTYPE_WAL);
|
||||
pgstat_send(&WalStats, sizeof(WalStats));
|
||||
|
||||
/*
|
||||
* Clear out the statistics buffer, so it can be re-used.
|
||||
*/
|
||||
MemSet(&WalStats, 0, sizeof(WalStats));
|
||||
}
|
||||
|
||||
/* ----------
|
||||
* pgstat_send_slru() -
|
||||
*
|
||||
|
@ -4658,6 +4713,10 @@ PgstatCollectorMain(int argc, char *argv[])
|
|||
pgstat_recv_bgwriter(&msg.msg_bgwriter, len);
|
||||
break;
|
||||
|
||||
case PGSTAT_MTYPE_WAL:
|
||||
pgstat_recv_wal(&msg.msg_wal, len);
|
||||
break;
|
||||
|
||||
case PGSTAT_MTYPE_SLRU:
|
||||
pgstat_recv_slru(&msg.msg_slru, len);
|
||||
break;
|
||||
|
@ -4927,6 +4986,12 @@ pgstat_write_statsfiles(bool permanent, bool allDbs)
|
|||
rc = fwrite(&archiverStats, sizeof(archiverStats), 1, fpout);
|
||||
(void) rc; /* we'll check for error with ferror */
|
||||
|
||||
/*
|
||||
* Write WAL stats struct
|
||||
*/
|
||||
rc = fwrite(&walStats, sizeof(walStats), 1, fpout);
|
||||
(void) rc; /* we'll check for error with ferror */
|
||||
|
||||
/*
|
||||
* Write SLRU stats struct
|
||||
*/
|
||||
|
@ -5186,11 +5251,12 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep)
|
|||
HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
|
||||
|
||||
/*
|
||||
* Clear out global and archiver statistics so they start from zero in
|
||||
* case we can't load an existing statsfile.
|
||||
* Clear out global, archiver, WAL and SLRU statistics so they start from
|
||||
* zero in case we can't load an existing statsfile.
|
||||
*/
|
||||
memset(&globalStats, 0, sizeof(globalStats));
|
||||
memset(&archiverStats, 0, sizeof(archiverStats));
|
||||
memset(&walStats, 0, sizeof(walStats));
|
||||
memset(&slruStats, 0, sizeof(slruStats));
|
||||
|
||||
/*
|
||||
|
@ -5199,6 +5265,7 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep)
|
|||
*/
|
||||
globalStats.stat_reset_timestamp = GetCurrentTimestamp();
|
||||
archiverStats.stat_reset_timestamp = globalStats.stat_reset_timestamp;
|
||||
walStats.stat_reset_timestamp = globalStats.stat_reset_timestamp;
|
||||
|
||||
/*
|
||||
* Set the same reset timestamp for all SLRU items too.
|
||||
|
@ -5268,6 +5335,17 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep)
|
|||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read WAL stats struct
|
||||
*/
|
||||
if (fread(&walStats, 1, sizeof(walStats), fpin) != sizeof(walStats))
|
||||
{
|
||||
ereport(pgStatRunningInCollector ? LOG : WARNING,
|
||||
(errmsg("corrupted statistics file \"%s\"", statfile)));
|
||||
memset(&walStats, 0, sizeof(walStats));
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read SLRU stats struct
|
||||
*/
|
||||
|
@ -5578,6 +5656,7 @@ pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent,
|
|||
PgStat_StatDBEntry dbentry;
|
||||
PgStat_GlobalStats myGlobalStats;
|
||||
PgStat_ArchiverStats myArchiverStats;
|
||||
PgStat_WalStats myWalStats;
|
||||
PgStat_SLRUStats mySLRUStats[SLRU_NUM_ELEMENTS];
|
||||
FILE *fpin;
|
||||
int32 format_id;
|
||||
|
@ -5633,6 +5712,17 @@ pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent,
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read WAL stats struct
|
||||
*/
|
||||
if (fread(&myWalStats, 1, sizeof(myWalStats), fpin) != sizeof(myWalStats))
|
||||
{
|
||||
ereport(pgStatRunningInCollector ? LOG : WARNING,
|
||||
(errmsg("corrupted statistics file \"%s\"", statfile)));
|
||||
FreeFile(fpin);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read SLRU stats struct
|
||||
*/
|
||||
|
@ -6213,6 +6303,12 @@ pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len)
|
|||
memset(&archiverStats, 0, sizeof(archiverStats));
|
||||
archiverStats.stat_reset_timestamp = GetCurrentTimestamp();
|
||||
}
|
||||
else if (msg->m_resettarget == RESET_WAL)
|
||||
{
|
||||
/* Reset the WAL statistics for the cluster. */
|
||||
memset(&walStats, 0, sizeof(walStats));
|
||||
walStats.stat_reset_timestamp = GetCurrentTimestamp();
|
||||
}
|
||||
|
||||
/*
|
||||
* Presumably the sender of this message validated the target, don't
|
||||
|
@ -6427,6 +6523,18 @@ pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len)
|
|||
globalStats.buf_alloc += msg->m_buf_alloc;
|
||||
}
|
||||
|
||||
/* ----------
|
||||
* pgstat_recv_wal() -
|
||||
*
|
||||
* Process a WAL message.
|
||||
* ----------
|
||||
*/
|
||||
static void
|
||||
pgstat_recv_wal(PgStat_MsgWal *msg, int len)
|
||||
{
|
||||
walStats.wal_buffers_full += msg->m_wal_buffers_full;
|
||||
}
|
||||
|
||||
/* ----------
|
||||
* pgstat_recv_slru() -
|
||||
*
|
||||
|
|
|
@ -1697,6 +1697,42 @@ pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
|
|||
PG_RETURN_INT64(pgstat_fetch_global()->buf_alloc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns statistics of WAL activity
|
||||
*/
|
||||
Datum
|
||||
pg_stat_get_wal(PG_FUNCTION_ARGS)
|
||||
{
|
||||
#define PG_STAT_GET_WAL_COLS 2
|
||||
TupleDesc tupdesc;
|
||||
Datum values[PG_STAT_GET_WAL_COLS];
|
||||
bool nulls[PG_STAT_GET_WAL_COLS];
|
||||
PgStat_WalStats *wal_stats;
|
||||
|
||||
/* Initialise values and NULL flags arrays */
|
||||
MemSet(values, 0, sizeof(values));
|
||||
MemSet(nulls, 0, sizeof(nulls));
|
||||
|
||||
/* Initialise attributes information in the tuple descriptor */
|
||||
tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_WAL_COLS);
|
||||
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "wal_buffers_full",
|
||||
INT8OID, -1, 0);
|
||||
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "stats_reset",
|
||||
TIMESTAMPTZOID, -1, 0);
|
||||
|
||||
BlessTupleDesc(tupdesc);
|
||||
|
||||
/* Get statistics about WAL activity */
|
||||
wal_stats = pgstat_fetch_stat_wal();
|
||||
|
||||
/* Fill values and NULLs */
|
||||
values[0] = Int64GetDatum(wal_stats->wal_buffers_full);
|
||||
values[1] = TimestampTzGetDatum(wal_stats->stat_reset_timestamp);
|
||||
|
||||
/* Returns the record as Datum */
|
||||
PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns statistics of SLRU caches.
|
||||
*/
|
||||
|
|
|
@ -53,6 +53,6 @@
|
|||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 202009181
|
||||
#define CATALOG_VERSION_NO 202010021
|
||||
|
||||
#endif
|
||||
|
|
|
@ -5481,6 +5481,14 @@
|
|||
proname => 'pg_stat_get_buf_alloc', provolatile => 's', proparallel => 'r',
|
||||
prorettype => 'int8', proargtypes => '', prosrc => 'pg_stat_get_buf_alloc' },
|
||||
|
||||
{ oid => '1136', descr => 'statistics: information about WAL activity',
|
||||
proname => 'pg_stat_get_wal', proisstrict => 'f', provolatile => 's',
|
||||
proparallel => 'r', prorettype => 'record', proargtypes => '',
|
||||
proallargtypes => '{int8,timestamptz}',
|
||||
proargmodes => '{o,o}',
|
||||
proargnames => '{wal_buffers_full,stats_reset}',
|
||||
prosrc => 'pg_stat_get_wal' },
|
||||
|
||||
{ oid => '2306', descr => 'statistics: information about SLRU caches',
|
||||
proname => 'pg_stat_get_slru', prorows => '100', proisstrict => 'f',
|
||||
proretset => 't', provolatile => 's', proparallel => 'r',
|
||||
|
|
|
@ -61,6 +61,7 @@ typedef enum StatMsgType
|
|||
PGSTAT_MTYPE_ANALYZE,
|
||||
PGSTAT_MTYPE_ARCHIVER,
|
||||
PGSTAT_MTYPE_BGWRITER,
|
||||
PGSTAT_MTYPE_WAL,
|
||||
PGSTAT_MTYPE_SLRU,
|
||||
PGSTAT_MTYPE_FUNCSTAT,
|
||||
PGSTAT_MTYPE_FUNCPURGE,
|
||||
|
@ -122,7 +123,8 @@ typedef struct PgStat_TableCounts
|
|||
typedef enum PgStat_Shared_Reset_Target
|
||||
{
|
||||
RESET_ARCHIVER,
|
||||
RESET_BGWRITER
|
||||
RESET_BGWRITER,
|
||||
RESET_WAL
|
||||
} PgStat_Shared_Reset_Target;
|
||||
|
||||
/* Possible object types for resetting single counters */
|
||||
|
@ -436,6 +438,16 @@ typedef struct PgStat_MsgBgWriter
|
|||
PgStat_Counter m_checkpoint_sync_time;
|
||||
} PgStat_MsgBgWriter;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgWal Sent by backends and background processes to update WAL statistics.
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgWal
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
PgStat_Counter m_wal_buffers_full;
|
||||
} PgStat_MsgWal;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgSLRU Sent by a backend to update SLRU statistics.
|
||||
* ----------
|
||||
|
@ -596,6 +608,7 @@ typedef union PgStat_Msg
|
|||
PgStat_MsgAnalyze msg_analyze;
|
||||
PgStat_MsgArchiver msg_archiver;
|
||||
PgStat_MsgBgWriter msg_bgwriter;
|
||||
PgStat_MsgWal msg_wal;
|
||||
PgStat_MsgSLRU msg_slru;
|
||||
PgStat_MsgFuncstat msg_funcstat;
|
||||
PgStat_MsgFuncpurge msg_funcpurge;
|
||||
|
@ -614,7 +627,7 @@ typedef union PgStat_Msg
|
|||
* ------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BC9D
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BC9E
|
||||
|
||||
/* ----------
|
||||
* PgStat_StatDBEntry The collector's data per database
|
||||
|
@ -745,6 +758,15 @@ typedef struct PgStat_GlobalStats
|
|||
TimestampTz stat_reset_timestamp;
|
||||
} PgStat_GlobalStats;
|
||||
|
||||
/*
|
||||
* WAL statistics kept in the stats collector
|
||||
*/
|
||||
typedef struct PgStat_WalStats
|
||||
{
|
||||
PgStat_Counter wal_buffers_full;
|
||||
TimestampTz stat_reset_timestamp;
|
||||
} PgStat_WalStats;
|
||||
|
||||
/*
|
||||
* SLRU statistics kept in the stats collector
|
||||
*/
|
||||
|
@ -1265,6 +1287,11 @@ extern char *pgstat_stat_filename;
|
|||
*/
|
||||
extern PgStat_MsgBgWriter BgWriterStats;
|
||||
|
||||
/*
|
||||
* WAL statistics counter is updated by backends and background processes
|
||||
*/
|
||||
extern PgStat_MsgWal WalStats;
|
||||
|
||||
/*
|
||||
* Updated by pgstat_count_buffer_*_time macros
|
||||
*/
|
||||
|
@ -1464,6 +1491,7 @@ extern void pgstat_twophase_postabort(TransactionId xid, uint16 info,
|
|||
|
||||
extern void pgstat_send_archiver(const char *xlog, bool failed);
|
||||
extern void pgstat_send_bgwriter(void);
|
||||
extern void pgstat_send_wal(void);
|
||||
|
||||
/* ----------
|
||||
* Support functions for the SQL-callable functions to
|
||||
|
@ -1478,6 +1506,7 @@ extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid);
|
|||
extern int pgstat_fetch_stat_numbackends(void);
|
||||
extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void);
|
||||
extern PgStat_GlobalStats *pgstat_fetch_global(void);
|
||||
extern PgStat_WalStats *pgstat_fetch_stat_wal(void);
|
||||
extern PgStat_SLRUStats *pgstat_fetch_slru(void);
|
||||
|
||||
extern void pgstat_count_slru_page_zeroed(int slru_idx);
|
||||
|
|
|
@ -2129,6 +2129,9 @@ pg_stat_user_tables| SELECT pg_stat_all_tables.relid,
|
|||
pg_stat_all_tables.autoanalyze_count
|
||||
FROM pg_stat_all_tables
|
||||
WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
|
||||
pg_stat_wal| SELECT w.wal_buffers_full,
|
||||
w.stats_reset
|
||||
FROM pg_stat_get_wal() w(wal_buffers_full, stats_reset);
|
||||
pg_stat_wal_receiver| SELECT s.pid,
|
||||
s.status,
|
||||
s.receive_start_lsn,
|
||||
|
|
|
@ -76,6 +76,13 @@ select count(*) >= 0 as ok from pg_prepared_xacts;
|
|||
t
|
||||
(1 row)
|
||||
|
||||
-- There must be only one record
|
||||
select count(*) = 1 as ok from pg_stat_wal;
|
||||
ok
|
||||
----
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- This is to record the prevailing planner enable_foo settings during
|
||||
-- a regression test run.
|
||||
select name, setting from pg_settings where name like 'enable%';
|
||||
|
|
|
@ -37,6 +37,9 @@ select count(*) = 0 as ok from pg_prepared_statements;
|
|||
-- See also prepared_xacts.sql
|
||||
select count(*) >= 0 as ok from pg_prepared_xacts;
|
||||
|
||||
-- There must be only one record
|
||||
select count(*) = 1 as ok from pg_stat_wal;
|
||||
|
||||
-- This is to record the prevailing planner enable_foo settings during
|
||||
-- a regression test run.
|
||||
select name, setting from pg_settings where name like 'enable%';
|
||||
|
|
|
@ -1841,6 +1841,7 @@ PgStat_MsgTabpurge
|
|||
PgStat_MsgTabstat
|
||||
PgStat_MsgTempFile
|
||||
PgStat_MsgVacuum
|
||||
PgStat_MsgWal
|
||||
PgStat_SLRUStats
|
||||
PgStat_Shared_Reset_Target
|
||||
PgStat_Single_Reset_Type
|
||||
|
@ -1852,6 +1853,7 @@ PgStat_TableCounts
|
|||
PgStat_TableEntry
|
||||
PgStat_TableStatus
|
||||
PgStat_TableXactStatus
|
||||
PgStat_WalStats
|
||||
PgXmlErrorContext
|
||||
PgXmlStrictness
|
||||
Pg_finfo_record
|
||||
|
|
Loading…
Reference in New Issue