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)