aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2018-03-27 16:14:40 +0300
committerTeodor Sigaev <teodor@sigaev.ru>2018-03-27 16:14:40 +0300
commit920a5e500a119b03356fb1fb64a677eb1aa5fc6f (patch)
tree8830b4fe2fd32cbc6b81787d3aa70c4410044499
parent3ad55863e9392bff73377911ebbf9760027ed405 (diff)
downloadpostgresql-920a5e500a119b03356fb1fb64a677eb1aa5fc6f.tar.gz
postgresql-920a5e500a119b03356fb1fb64a677eb1aa5fc6f.zip
Skip temp tables from basebackup.
Do not store temp tables in basebackup, they will not be visible anyway, so, there are not reasons to store them. Author: David Steel Reviewed by: me Discussion: https://www.postgresql.org/message-id/flat/5ea4d26a-a453-c1b7-eff9-5a3ef8f8aceb@pgmasters.net
-rw-r--r--doc/src/sgml/protocol.sgml2
-rw-r--r--src/backend/replication/basebackup.c10
-rw-r--r--src/backend/storage/file/fd.c3
-rw-r--r--src/bin/pg_basebackup/t/010_pg_basebackup.pl49
-rw-r--r--src/include/storage/fd.h1
5 files changed, 61 insertions, 4 deletions
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml
index 472bd3ef693..8c488506fad 100644
--- a/doc/src/sgml/protocol.sgml
+++ b/doc/src/sgml/protocol.sgml
@@ -2565,7 +2565,7 @@ The commands accepted in replication mode are:
<para>
Various temporary files and directories created during the operation
of the PostgreSQL server, such as any file or directory beginning
- with <filename>pgsql_tmp</filename>.
+ with <filename>pgsql_tmp</filename> and temporary relations.
</para>
</listitem>
<listitem>
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index e4c45c50256..654d0832da2 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -1072,6 +1072,16 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces,
}
}
+ /* Exclude temporary relations */
+ if (isDbDir && looks_like_temp_rel_name(de->d_name))
+ {
+ elog(DEBUG2,
+ "temporary relation file \"%s\" excluded from backup",
+ de->d_name);
+
+ continue;
+ }
+
snprintf(pathbuf, sizeof(pathbuf), "%s/%s", path, de->d_name);
/* Skip pg_control here to back up it last */
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 2a18e94ff49..d30a725f900 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -325,7 +325,6 @@ static void RemovePgTempFilesInDir(const char *tmpdirname, bool missing_ok,
bool unlink_all);
static void RemovePgTempRelationFiles(const char *tsdirname);
static void RemovePgTempRelationFilesInDbspace(const char *dbspacedirname);
-static bool looks_like_temp_rel_name(const char *name);
static void walkdir(const char *path,
void (*action) (const char *fname, bool isdir, int elevel),
@@ -3192,7 +3191,7 @@ RemovePgTempRelationFilesInDbspace(const char *dbspacedirname)
}
/* t<digits>_<digits>, or t<digits>_<digits>_<forkname> */
-static bool
+bool
looks_like_temp_rel_name(const char *name)
{
int pos;
diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
index 455c7fca0df..e6018de0543 100644
--- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl
+++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
@@ -2,9 +2,10 @@ use strict;
use warnings;
use Cwd;
use Config;
+use File::Basename qw(basename dirname);
use PostgresNode;
use TestLib;
-use Test::More tests => 87;
+use Test::More tests => 93;
program_help_ok('pg_basebackup');
program_version_ok('pg_basebackup');
@@ -76,6 +77,18 @@ my $baseUnloggedPath = $node->safe_psql('postgres',
ok(-f "$pgdata/${baseUnloggedPath}_init", 'unlogged init fork in base');
ok(-f "$pgdata/$baseUnloggedPath", 'unlogged main fork in base');
+# Create files that look like temporary relations to ensure they are ignored.
+my $postgresOid = $node->safe_psql('postgres',
+ q{select oid from pg_database where datname = 'postgres'});
+
+my @tempRelationFiles = qw(t999_999 t9999_999.1 t999_9999_vm t99999_99999_vm.1);
+
+foreach my $filename (@tempRelationFiles)
+{
+ append_to_file("$pgdata/base/$postgresOid/$filename", 'TEMP_RELATION');
+}
+
+# Run base backup.
$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backup", '-X', 'none' ],
'pg_basebackup runs');
ok(-f "$tempdir/backup/PG_VERSION", 'backup was created');
@@ -112,6 +125,13 @@ ok(-f "$tempdir/backup/${baseUnloggedPath}_init",
ok(!-f "$tempdir/backup/$baseUnloggedPath",
'unlogged main fork not in backup');
+# Temp relations should not be copied.
+foreach my $filename (@tempRelationFiles)
+{
+ ok(!-f "$tempdir/backup/base/$postgresOid/$filename",
+ "base/$postgresOid/$filename not copied");
+}
+
# Make sure existing backup_label was ignored.
isnt(slurp_file("$tempdir/backup/backup_label"),
'DONOTCOPY', 'existing backup_label not copied');
@@ -206,6 +226,19 @@ SKIP:
ok(-f "$pgdata/$tblspc1UnloggedPath",
'unlogged main fork in tablespace');
+ # Create files that look like temporary relations to ensure they are ignored
+ # in a tablespace.
+ my @tempRelationFiles = qw(t888_888 t888888_888888_vm.1);
+ my $tblSpc1Id = basename(dirname(dirname($node->safe_psql('postgres',
+ q{select pg_relation_filepath('test1')}))));
+
+ foreach my $filename (@tempRelationFiles)
+ {
+ append_to_file(
+ "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename",
+ 'TEMP_RELATION');
+ }
+
$node->command_fails(
[ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ],
'plain format with tablespaces fails without tablespace mapping');
@@ -232,6 +265,20 @@ SKIP:
ok(!-f "$tempdir/tbackup/tblspc1/$tblspc1UnloggedBackupPath",
'unlogged main fork not in tablespace backup');
+ # Temp relations should not be copied.
+ foreach my $filename (@tempRelationFiles)
+ {
+ ok(!-f "$tempdir/tbackup/tblspc1/$tblSpc1Id/$postgresOid/$filename",
+ "[tblspc1]/$postgresOid/$filename not copied");
+
+ # Also remove temp relation files or tablespace drop will fail.
+ my $filepath =
+ "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename";
+
+ unlink($filepath)
+ or BAIL_OUT("unable to unlink $filepath");
+ }
+
ok( -d "$tempdir/backup1/pg_replslot",
'pg_replslot symlink copied as directory');
diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h
index 4244e7b1fd8..e49b42ce867 100644
--- a/src/include/storage/fd.h
+++ b/src/include/storage/fd.h
@@ -124,6 +124,7 @@ extern void AtEOXact_Files(void);
extern void AtEOSubXact_Files(bool isCommit, SubTransactionId mySubid,
SubTransactionId parentSubid);
extern void RemovePgTempFiles(void);
+extern bool looks_like_temp_rel_name(const char *name);
extern int pg_fsync(int fd);
extern int pg_fsync_no_writethrough(int fd);