@@ -77,7 +77,7 @@ static void backup_cleanup(bool fatal, void *userdata);
77
77
static void backup_disconnect (bool fatal , void * userdata );
78
78
79
79
static void backup_files (void * arg );
80
- static void do_backup_database ( parray * backup_list );
80
+ static void do_backup_instance ( void );
81
81
82
82
static void pg_start_backup (const char * label , bool smooth , pgBackup * backup );
83
83
static void pg_switch_wal (PGconn * conn );
@@ -116,10 +116,11 @@ static void confirm_block_size(const char *name, int blcksz);
116
116
117
117
118
118
/*
119
- * Take a backup of database.
119
+ * Take a backup of a single postgresql instance.
120
+ * Move files from 'pgdata' to a subdirectory in 'backup_path'.
120
121
*/
121
122
static void
122
- do_backup_database ( parray * backup_list )
123
+ do_backup_instance ( void )
123
124
{
124
125
size_t i ;
125
126
char database_path [MAXPGPATH ];
@@ -144,15 +145,32 @@ do_backup_database(parray *backup_list)
144
145
145
146
/*
146
147
* In incremental backup mode ensure that already-validated
147
- * backup on current timeline exists.
148
+ * backup on current timeline exists and get its filelist .
148
149
*/
149
150
if (current .backup_mode == BACKUP_MODE_DIFF_PAGE ||
150
151
current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
151
152
{
153
+ parray * backup_list ;
154
+ /* get list of backups already taken */
155
+ backup_list = catalog_get_backup_list (INVALID_BACKUP_ID );
156
+ if (backup_list == NULL )
157
+ elog (ERROR , "Failed to get backup list." );
158
+
152
159
prev_backup = catalog_get_last_data_backup (backup_list , current .tli );
153
160
if (prev_backup == NULL )
154
161
elog (ERROR , "Valid backup on current timeline is not found. "
155
162
"Create new FULL backup before an incremental one." );
163
+ parray_free (backup_list );
164
+
165
+ pgBackupGetPath (prev_backup , prev_backup_filelist_path , lengthof (prev_backup_filelist_path ),
166
+ DATABASE_FILE_LIST );
167
+ prev_backup_filelist = dir_read_file_list (pgdata , prev_backup_filelist_path );
168
+
169
+ /* If lsn is not NULL, only pages with higher lsn will be copied. */
170
+ prev_backup_start_lsn = prev_backup -> start_lsn ;
171
+ current .parent_backup = prev_backup -> start_time ;
172
+
173
+ pgBackupWriteBackupControlFile (& current );
156
174
}
157
175
158
176
/* Clear ptrack files for FULL and PAGE backup */
@@ -200,24 +218,6 @@ do_backup_database(parray *backup_list)
200
218
pthread_mutex_unlock (& start_stream_mut );
201
219
}
202
220
203
- /*
204
- * To take incremental backup get the filelist of the last completed database
205
- */
206
- if (current .backup_mode == BACKUP_MODE_DIFF_PAGE ||
207
- current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
208
- {
209
- Assert (prev_backup );
210
- pgBackupGetPath (prev_backup , prev_backup_filelist_path , lengthof (prev_backup_filelist_path ),
211
- DATABASE_FILE_LIST );
212
- prev_backup_filelist = dir_read_file_list (pgdata , prev_backup_filelist_path );
213
-
214
- /* If lsn is not NULL, only pages with higher lsn will be copied. */
215
- prev_backup_start_lsn = prev_backup -> start_lsn ;
216
-
217
- current .parent_backup = prev_backup -> start_time ;
218
- pgBackupWriteBackupControlFile (& current );
219
- }
220
-
221
221
/* initialize backup list */
222
222
backup_files_list = parray_new ();
223
223
@@ -394,9 +394,6 @@ do_backup_database(parray *backup_list)
394
394
int
395
395
do_backup (void )
396
396
{
397
- parray * backup_list ;
398
- bool is_ptrack_support ;
399
-
400
397
/* PGDATA and BACKUP_MODE are always required */
401
398
if (pgdata == NULL )
402
399
elog (ERROR , "required parameter not specified: PGDATA "
@@ -422,15 +419,18 @@ do_backup(void)
422
419
current .stream = stream_wal ;
423
420
424
421
/* ptrack backup checks */
425
- is_ptrack_support = pg_ptrack_support ();
426
- if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK && !is_ptrack_support )
427
- elog (ERROR , "This PostgreSQL instance does not support ptrack" );
428
-
429
- if (is_ptrack_support )
422
+ if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
430
423
{
431
- is_ptrack_enable = pg_ptrack_enable ();
432
- if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK && !is_ptrack_enable )
433
- elog (ERROR , "Ptrack is disabled" );
424
+ bool is_ptrack_support = pg_ptrack_support ();
425
+
426
+ if (!is_ptrack_support )
427
+ elog (ERROR , "This PostgreSQL instance does not support ptrack" );
428
+ else
429
+ {
430
+ is_ptrack_enable = pg_ptrack_enable ();
431
+ if (!is_ptrack_enable )
432
+ elog (ERROR , "Ptrack is disabled" );
433
+ }
434
434
}
435
435
436
436
/* archiving check */
@@ -460,11 +460,6 @@ do_backup(void)
460
460
*/
461
461
check_system_identifiers ();
462
462
463
- /* get list of backups already taken */
464
- backup_list = catalog_get_backup_list (INVALID_BACKUP_ID );
465
- if (backup_list == NULL )
466
- elog (ERROR , "Failed to get backup list." );
467
-
468
463
elog (LOG , "Backup start. backup-mode = %s, stream = %s" ,
469
464
pgBackupGetBackupMode (& current ), current .stream ? "true" : "false" );
470
465
@@ -483,7 +478,7 @@ do_backup(void)
483
478
pgut_atexit_push (backup_cleanup , NULL );
484
479
485
480
/* backup data */
486
- do_backup_database ( backup_list );
481
+ do_backup_instance ( );
487
482
pgut_atexit_pop (backup_cleanup , NULL );
488
483
489
484
/* compute size of wal files of this backup stored in the archive */
0 commit comments