Skip to content

Commit 9550ea3

Browse files
committed
Add --no-index-cleanup and --no-truncate to vacuumdb.
Both INDEX_CLEANUP and TRUNCATE have been available since v12, and are enabled by default except if respectively vacuum_index_cleanup and vacuum_truncate are disabled for a given relation. This change adds support for disabling these options from vacuumdb. Author: Nathan Bossart Reviewed-by: Michael Paquier, Masahiko Sawada Discussion: https://postgr.es/m/6F7F17EF-B1F2-4681-8D03-BA96365717C0@amazon.com
1 parent 14903f2 commit 9550ea3

File tree

3 files changed

+102
-2
lines changed

3 files changed

+102
-2
lines changed

doc/src/sgml/ref/vacuumdb.sgml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,36 @@ PostgreSQL documentation
226226
</listitem>
227227
</varlistentry>
228228

229+
<varlistentry>
230+
<term><option>--no-index-cleanup</option></term>
231+
<listitem>
232+
<para>
233+
Do not remove index entries pointing to dead tuples.
234+
</para>
235+
<note>
236+
<para>
237+
This option is only available for servers running
238+
<productname>PostgreSQL</productname> 12 and later.
239+
</para>
240+
</note>
241+
</listitem>
242+
</varlistentry>
243+
244+
<varlistentry>
245+
<term><option>--no-truncate</option></term>
246+
<listitem>
247+
<para>
248+
Do not truncate empty pages at the end of the table.
249+
</para>
250+
<note>
251+
<para>
252+
This option is only available for servers running
253+
<productname>PostgreSQL</productname> 12 and later.
254+
</para>
255+
</note>
256+
</listitem>
257+
</varlistentry>
258+
229259
<varlistentry>
230260
<term><option>-P <replaceable class="parameter">parallel_degree</replaceable></option></term>
231261
<term><option>--parallel=<replaceable class="parameter">parallel_degree</replaceable></option></term>

src/bin/scripts/t/100_vacuumdb.pl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
use PostgresNode;
55
use TestLib;
6-
use Test::More tests => 49;
6+
use Test::More tests => 55;
77

88
program_help_ok('vacuumdb');
99
program_version_ok('vacuumdb');
@@ -48,6 +48,20 @@
4848
$node->command_fails(
4949
[ 'vacuumdb', '--analyze-only', '--disable-page-skipping', 'postgres' ],
5050
'--analyze-only and --disable-page-skipping specified together');
51+
$node->issues_sql_like(
52+
[ 'vacuumdb', '--no-index-cleanup', 'postgres' ],
53+
qr/statement: VACUUM \(INDEX_CLEANUP FALSE\).*;/,
54+
'vacuumdb --no-index-cleanup');
55+
$node->command_fails(
56+
[ 'vacuumdb', '--analyze-only', '--no-index-cleanup', 'postgres' ],
57+
'--analyze-only and --no-index-cleanup specified together');
58+
$node->issues_sql_like(
59+
[ 'vacuumdb', '--no-truncate', 'postgres' ],
60+
qr/statement: VACUUM \(TRUNCATE FALSE\).*;/,
61+
'vacuumdb --no-truncate');
62+
$node->command_fails(
63+
[ 'vacuumdb', '--analyze-only', '--no-truncate', 'postgres' ],
64+
'--analyze-only and --no-truncate specified together');
5165
$node->issues_sql_like(
5266
[ 'vacuumdb', '-P', 2, 'postgres' ],
5367
qr/statement: VACUUM \(PARALLEL 2\).*;/,

src/bin/scripts/vacuumdb.c

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ typedef struct vacuumingOptions
3737
int min_mxid_age;
3838
int parallel_workers; /* >= 0 indicates user specified the
3939
* parallel degree, otherwise -1 */
40+
bool do_index_cleanup;
41+
bool do_truncate;
4042
} vacuumingOptions;
4143

4244

@@ -96,6 +98,8 @@ main(int argc, char *argv[])
9698
{"skip-locked", no_argument, NULL, 5},
9799
{"min-xid-age", required_argument, NULL, 6},
98100
{"min-mxid-age", required_argument, NULL, 7},
101+
{"no-index-cleanup", no_argument, NULL, 8},
102+
{"no-truncate", no_argument, NULL, 9},
99103
{NULL, 0, NULL, 0}
100104
};
101105

@@ -117,9 +121,11 @@ main(int argc, char *argv[])
117121
int concurrentCons = 1;
118122
int tbl_count = 0;
119123

120-
/* initialize options to all false */
124+
/* initialize options */
121125
memset(&vacopts, 0, sizeof(vacopts));
122126
vacopts.parallel_workers = -1;
127+
vacopts.do_index_cleanup = true;
128+
vacopts.do_truncate = true;
123129

124130
pg_logging_init(argv[0]);
125131
progname = get_progname(argv[0]);
@@ -223,6 +229,12 @@ main(int argc, char *argv[])
223229
exit(1);
224230
}
225231
break;
232+
case 8:
233+
vacopts.do_index_cleanup = false;
234+
break;
235+
case 9:
236+
vacopts.do_truncate = false;
237+
break;
226238
default:
227239
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
228240
exit(1);
@@ -267,6 +279,18 @@ main(int argc, char *argv[])
267279
"disable-page-skipping");
268280
exit(1);
269281
}
282+
if (!vacopts.do_index_cleanup)
283+
{
284+
pg_log_error("cannot use the \"%s\" option when performing only analyze",
285+
"no-index-cleanup");
286+
exit(1);
287+
}
288+
if (!vacopts.do_truncate)
289+
{
290+
pg_log_error("cannot use the \"%s\" option when performing only analyze",
291+
"no-truncate");
292+
exit(1);
293+
}
270294
/* allow 'and_analyze' with 'analyze_only' */
271295
}
272296

@@ -412,6 +436,22 @@ vacuum_one_database(const char *dbname, vacuumingOptions *vacopts,
412436
exit(1);
413437
}
414438

439+
if (!vacopts->do_index_cleanup && PQserverVersion(conn) < 120000)
440+
{
441+
PQfinish(conn);
442+
pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
443+
"no-index-cleanup", "12");
444+
exit(1);
445+
}
446+
447+
if (!vacopts->do_truncate && PQserverVersion(conn) < 120000)
448+
{
449+
PQfinish(conn);
450+
pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
451+
"no-truncate", "12");
452+
exit(1);
453+
}
454+
415455
if (vacopts->skip_locked && PQserverVersion(conn) < 120000)
416456
{
417457
PQfinish(conn);
@@ -832,6 +872,20 @@ prepare_vacuum_command(PQExpBuffer sql, int serverVersion,
832872
appendPQExpBuffer(sql, "%sDISABLE_PAGE_SKIPPING", sep);
833873
sep = comma;
834874
}
875+
if (!vacopts->do_index_cleanup)
876+
{
877+
/* INDEX_CLEANUP is supported since v12 */
878+
Assert(serverVersion >= 120000);
879+
appendPQExpBuffer(sql, "%sINDEX_CLEANUP FALSE", sep);
880+
sep = comma;
881+
}
882+
if (!vacopts->do_truncate)
883+
{
884+
/* TRUNCATE is supported since v12 */
885+
Assert(serverVersion >= 120000);
886+
appendPQExpBuffer(sql, "%sTRUNCATE FALSE", sep);
887+
sep = comma;
888+
}
835889
if (vacopts->skip_locked)
836890
{
837891
/* SKIP_LOCKED is supported since v12 */
@@ -930,6 +984,8 @@ help(const char *progname)
930984
printf(_(" -j, --jobs=NUM use this many concurrent connections to vacuum\n"));
931985
printf(_(" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"));
932986
printf(_(" --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"));
987+
printf(_(" --no-index-cleanup don't remove index entries that point to dead tuples\n"));
988+
printf(_(" --no-truncate don't truncate empty pages at the end of the table\n"));
933989
printf(_(" -P, --parallel=PARALLEL_DEGREE use this many background workers for vacuum, if available\n"));
934990
printf(_(" -q, --quiet don't write any messages\n"));
935991
printf(_(" --skip-locked skip relations that cannot be immediately locked\n"));

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy