diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml index 667093f060..5fcdfe210a 100644 --- a/doc/src/sgml/ref/pg_waldump.sgml +++ b/doc/src/sgml/ref/pg_waldump.sgml @@ -125,6 +125,18 @@ PostgreSQL documentation + + + + + + Do not print any output, except for errors. This option can be useful + when you want to know whether a range of WAL records can be + successfully parsed but don't care about the record contents. + + + + diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 279acfa044..7c80b5288f 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -40,6 +40,7 @@ typedef struct XLogDumpPrivate typedef struct XLogDumpConfig { /* display options */ + bool quiet; bool bkp_details; int stop_after_records; int already_displayed_records; @@ -720,6 +721,7 @@ usage(void) printf(_(" -p, --path=PATH directory in which to find log segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n")); + printf(_(" -q, --quiet do not print any output, except for errors\n")); printf(_(" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" " use --rmgr=list to list valid resource manager names\n")); printf(_(" -s, --start=RECPTR start reading at WAL location RECPTR\n")); @@ -755,6 +757,7 @@ main(int argc, char **argv) {"help", no_argument, NULL, '?'}, {"limit", required_argument, NULL, 'n'}, {"path", required_argument, NULL, 'p'}, + {"quiet", no_argument, NULL, 'q'}, {"rmgr", required_argument, NULL, 'r'}, {"start", required_argument, NULL, 's'}, {"timeline", required_argument, NULL, 't'}, @@ -794,6 +797,7 @@ main(int argc, char **argv) private.endptr = InvalidXLogRecPtr; private.endptr_reached = false; + config.quiet = false; config.bkp_details = false; config.stop_after_records = -1; config.already_displayed_records = 0; @@ -810,7 +814,7 @@ main(int argc, char **argv) goto bad_argument; } - while ((option = getopt_long(argc, argv, "be:fn:p:r:s:t:x:z", + while ((option = getopt_long(argc, argv, "be:fn:p:qr:s:t:x:z", long_options, &optindex)) != -1) { switch (option) @@ -840,6 +844,9 @@ main(int argc, char **argv) case 'p': waldir = pg_strdup(optarg); break; + case 'q': + config.quiet = true; + break; case 'r': { int i; @@ -1075,11 +1082,14 @@ main(int argc, char **argv) config.filter_by_xid != record->xl_xid) continue; - /* process the record */ - if (config.stats == true) - XLogDumpCountRecord(&config, &stats, xlogreader_state); - else - XLogDumpDisplayRecord(&config, xlogreader_state); + /* perform any per-record work */ + if (!config.quiet) + { + if (config.stats == true) + XLogDumpCountRecord(&config, &stats, xlogreader_state); + else + XLogDumpDisplayRecord(&config, xlogreader_state); + } /* check whether we printed enough */ config.already_displayed_records++;