Skip to content

Commit bd01446

Browse files
committed
Try fixing restore command.
1 parent 3e49dd1 commit bd01446

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

pg_arman.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ main(int argc, char *argv[])
106106
cmd = argv[i];
107107
if(strcmp(cmd, "show") != 0 &&
108108
strcmp(cmd, "validate") != 0 &&
109-
strcmp(cmd, "delete") != 0)
109+
strcmp(cmd, "delete") != 0 &&
110+
strcmp(cmd, "restore") != 0)
110111
break;
111112
} else if (backup_id_string == NULL)
112113
backup_id_string = argv[i];
@@ -122,7 +123,12 @@ main(int argc, char *argv[])
122123
}
123124

124125
if (backup_id_string != NULL)
126+
{
125127
backup_id = base36dec(backup_id_string);
128+
if (backup_id == 0) {
129+
elog(ERROR, "wrong ID");
130+
}
131+
}
126132

127133
/* Read default configuration from file. */
128134
if (backup_path)
@@ -189,7 +195,7 @@ main(int argc, char *argv[])
189195
do_validate(current.start_time);
190196
}
191197
else if (pg_strcasecmp(cmd, "restore") == 0)
192-
return do_restore(target_time, target_xid,
198+
return do_restore(backup_id, target_time, target_xid,
193199
target_inclusive, target_tli);
194200
else if (pg_strcasecmp(cmd, "show") == 0)
195201
return do_show(backup_id, show_all);

pg_arman.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232
/* Directory/File names */
3333
#define DATABASE_DIR "database"
3434
#define RESTORE_WORK_DIR "backup"
35-
#define PG_XLOG_DIR "pg_xlog"
35+
#define PG_XLOG_DIR "pg_xlog"
3636
#define PG_TBLSPC_DIR "pg_tblspc"
3737
#define BACKUP_INI_FILE "backup.ini"
3838
#define PG_RMAN_INI_FILE "pg_arman.ini"
3939
#define MKDIRS_SH_FILE "mkdirs.sh"
4040
#define DATABASE_FILE_LIST "file_database.txt"
41-
#define PG_BACKUP_LABEL_FILE "backup_label"
41+
#define PG_BACKUP_LABEL_FILE "backup_label"
4242
#define PG_BLACK_LIST "black_list"
4343

4444
/* Direcotry/File permission */
@@ -214,7 +214,8 @@ extern void process_block_change(ForkNumber forknum, RelFileNode rnode,
214214
BlockNumber blkno);
215215

216216
/* in restore.c */
217-
extern int do_restore(const char *target_time,
217+
extern int do_restore(time_t backup_id,
218+
const char *target_time,
218219
const char *target_xid,
219220
const char *target_inclusive,
220221
TimeLineID target_tli);

restore.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ static void restore_files(void *arg);
4545

4646

4747
int
48-
do_restore(const char *target_time,
48+
do_restore(time_t backup_id,
49+
const char *target_time,
4950
const char *target_xid,
5051
const char *target_inclusive,
5152
TimeLineID target_tli)
@@ -62,6 +63,7 @@ do_restore(const char *target_time,
6263
parray *timelines;
6364
pgRecoveryTarget *rt = NULL;
6465
XLogRecPtr need_lsn;
66+
bool backup_id_found = false;
6567

6668
/* PGDATA and ARCLOG_PATH are always required */
6769
if (pgdata == NULL)
@@ -134,12 +136,21 @@ do_restore(const char *target_time,
134136
{
135137
base_backup = (pgBackup *) parray_get(backups, i);
136138

139+
if (backup_id && base_backup->start_time > backup_id)
140+
continue;
141+
142+
if (backup_id == base_backup->start_time &&
143+
base_backup->status == BACKUP_STATUS_OK
144+
)
145+
backup_id_found = true;
146+
137147
if (base_backup->backup_mode < BACKUP_MODE_FULL ||
138148
base_backup->status != BACKUP_STATUS_OK)
139149
continue;
140150

141151
if (satisfy_timeline(timelines, base_backup) &&
142-
satisfy_recovery_target(base_backup, rt))
152+
satisfy_recovery_target(base_backup, rt) &&
153+
(backup_id_found || backup_id == 0))
143154
goto base_backup_found;
144155
}
145156
/* no full backup found, cannot restore */
@@ -167,6 +178,9 @@ do_restore(const char *target_time,
167178
backup->tli != base_backup->tli)
168179
continue;
169180

181+
if (backup->backup_mode == BACKUP_MODE_FULL)
182+
break;
183+
170184
/* use database backup only */
171185
if (backup->backup_mode != BACKUP_MODE_DIFF_PAGE &&
172186
backup->backup_mode != BACKUP_MODE_DIFF_PTRACK)
@@ -462,11 +476,14 @@ create_recovery_conf(const char *target_time,
462476

463477
if (target_time)
464478
fprintf(fp, "recovery_target_time = '%s'\n", target_time);
465-
if (target_xid)
479+
else if (target_xid)
466480
fprintf(fp, "recovery_target_xid = '%s'\n", target_xid);
481+
else
482+
fprintf(fp, "recovery_target = 'immediate'\n");
483+
467484
if (target_inclusive)
468485
fprintf(fp, "recovery_target_inclusive = '%s'\n", target_inclusive);
469-
/*fprintf(fp, "recovery_target = 'immediate'\n");*/
486+
470487
fprintf(fp, "recovery_target_timeline = '%u'\n", target_tli);
471488

472489
fclose(fp);

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