]> granicus.if.org Git - postgresql/commitdiff
Skip temp tables from basebackup.
authorTeodor Sigaev <teodor@sigaev.ru>
Tue, 27 Mar 2018 13:14:40 +0000 (16:14 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Tue, 27 Mar 2018 13:14:40 +0000 (16:14 +0300)
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

doc/src/sgml/protocol.sgml
src/backend/replication/basebackup.c
src/backend/storage/file/fd.c
src/bin/pg_basebackup/t/010_pg_basebackup.pl
src/include/storage/fd.h

index 472bd3ef693b4448b6d32334227c79609d094e0f..8c488506fadf4a414436c38de7665676de40cc23 100644 (file)
@@ -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>
index e4c45c50256b39148af60df5431819f25881e49b..654d0832da2ac0043a57d47c9b0d239454d63747 100644 (file)
@@ -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 */
index 2a18e94ff49bff3b7c83e5f16ac288caa75ea8ce..d30a725f9009aec46fbbd6fb73383f0efef615f9 100644 (file)
@@ -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;
index 455c7fca0df91db186dade2acd63cf0460bd7195..e6018de0543dd6714092be88169604d245f1a0a7 100644 (file)
@@ -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');
 
index 4244e7b1fd8595916b9fe24617aadf61c314c56d..e49b42ce867a0f8ab49644a7a29b257f6158b580 100644 (file)
@@ -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);