Skip to content

Commit 37da8b0

Browse files
committed
Add main files and rename ini to conf.
1 parent 188bbdd commit 37da8b0

File tree

2 files changed

+583
-0
lines changed

2 files changed

+583
-0
lines changed

pg_probackup.c

Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* pg_probackup.c: Backup/Recovery manager for PostgreSQL.
4+
*
5+
* Copyright (c) 2009-2013, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
6+
*
7+
*-------------------------------------------------------------------------
8+
*/
9+
10+
#include "pg_probackup.h"
11+
#include "streamutil.h"
12+
13+
#include <stdio.h>
14+
#include <stdlib.h>
15+
#include <time.h>
16+
#include <sys/stat.h>
17+
18+
const char *PROGRAM_VERSION = "1.0";
19+
const char *PROGRAM_URL = "https://github.com/postgrespro/pg_probackup";
20+
const char *PROGRAM_EMAIL = "https://github.com/postgrespro/pg_probackup/issues";
21+
22+
/* path configuration */
23+
char *backup_path;
24+
char *pgdata;
25+
char arclog_path[MAXPGPATH];
26+
27+
/* common configuration */
28+
bool check = false;
29+
30+
/* directory configuration */
31+
pgBackup current;
32+
33+
/* backup configuration */
34+
static bool smooth_checkpoint;
35+
static int keep_data_generations = KEEP_INFINITE;
36+
static int keep_data_days = KEEP_INFINITE;
37+
int num_threads = 1;
38+
bool stream_wal = false;
39+
bool from_replica = false;
40+
static bool backup_logs = false;
41+
bool progress = false;
42+
bool delete_wal = false;
43+
44+
/* restore configuration */
45+
static char *target_time;
46+
static char *target_xid;
47+
static char *target_inclusive;
48+
static TimeLineID target_tli;
49+
50+
/* show configuration */
51+
static bool show_all = false;
52+
53+
static void opt_backup_mode(pgut_option *opt, const char *arg);
54+
55+
static pgut_option options[] =
56+
{
57+
/* directory options */
58+
{ 's', 'D', "pgdata", &pgdata, SOURCE_ENV },
59+
{ 's', 'B', "backup-path", &backup_path, SOURCE_ENV },
60+
/* common options */
61+
/* { 'b', 'c', "check", &check },*/
62+
{ 'i', 'j', "threads", &num_threads },
63+
{ 'b', 8, "stream", &stream_wal },
64+
{ 'b', 11, "progress", &progress },
65+
/* backup options */
66+
{ 'b', 10, "backup-pg-log", &backup_logs },
67+
{ 'f', 'b', "backup-mode", opt_backup_mode, SOURCE_ENV },
68+
{ 'b', 'C', "smooth-checkpoint", &smooth_checkpoint, SOURCE_ENV },
69+
{ 's', 'S', "slot", &replication_slot, SOURCE_ENV },
70+
/* options with only long name (keep-xxx) */
71+
/* { 'i', 1, "keep-data-generations", &keep_data_generations, SOURCE_ENV },
72+
{ 'i', 2, "keep-data-days", &keep_data_days, SOURCE_ENV },*/
73+
/* restore options */
74+
{ 's', 3, "time", &target_time, SOURCE_ENV },
75+
{ 's', 4, "xid", &target_xid, SOURCE_ENV },
76+
{ 's', 5, "inclusive", &target_inclusive, SOURCE_ENV },
77+
{ 'u', 6, "timeline", &target_tli, SOURCE_ENV },
78+
/* catalog options */
79+
{ 'b', 'a', "show-all", &show_all },
80+
/* delete options */
81+
{ 'b', 12, "wal", &delete_wal },
82+
{ 0 }
83+
};
84+
85+
/*
86+
* Entry point of pg_probackup command.
87+
*/
88+
int
89+
main(int argc, char *argv[])
90+
{
91+
const char *cmd = NULL;
92+
const char *backup_id_string = NULL;
93+
time_t backup_id = 0;
94+
int i;
95+
96+
/* do not buffer progress messages */
97+
setvbuf(stdout, 0, _IONBF, 0); /* TODO: remove this */
98+
99+
/* initialize configuration */
100+
catalog_init_config(&current);
101+
102+
/* overwrite configuration with command line arguments */
103+
i = pgut_getopt(argc, argv, options);
104+
105+
for (; i < argc; i++)
106+
{
107+
if (cmd == NULL)
108+
{
109+
cmd = argv[i];
110+
if(strcmp(cmd, "show") != 0 &&
111+
strcmp(cmd, "validate") != 0 &&
112+
strcmp(cmd, "delete") != 0 &&
113+
strcmp(cmd, "restore") != 0 &&
114+
strcmp(cmd, "delwal") != 0)
115+
break;
116+
} else if (backup_id_string == NULL)
117+
backup_id_string = argv[i];
118+
else
119+
elog(ERROR, "too many arguments");
120+
}
121+
122+
/* command argument (backup/restore/show/...) is required. */
123+
if (cmd == NULL)
124+
{
125+
help(false);
126+
return 1;
127+
}
128+
129+
if (backup_id_string != NULL)
130+
{
131+
backup_id = base36dec(backup_id_string);
132+
if (backup_id == 0) {
133+
elog(ERROR, "wrong ID");
134+
}
135+
}
136+
137+
/* Read default configuration from file. */
138+
if (backup_path)
139+
{
140+
char path[MAXPGPATH];
141+
/* Check if backup_path is directory. */
142+
struct stat stat_buf;
143+
int rc = stat(backup_path, &stat_buf);
144+
145+
/* If rc == -1, there is no file or directory. So it's OK. */
146+
if (rc != -1 && !S_ISDIR(stat_buf.st_mode))
147+
elog(ERROR, "-B, --backup-path must be a path to directory");
148+
149+
join_path_components(path, backup_path, PG_RMAN_INI_FILE);
150+
pgut_readopt(path, options, ERROR);
151+
152+
/* setup stream options */
153+
if (pgut_dbname != NULL)
154+
dbname = pstrdup(pgut_dbname);
155+
if (host != NULL)
156+
dbhost = pstrdup(host);
157+
if (port != NULL)
158+
dbport = pstrdup(port);
159+
if (username != NULL)
160+
dbuser = pstrdup(username);
161+
}
162+
163+
/* BACKUP_PATH is always required */
164+
if (backup_path == NULL)
165+
elog(ERROR, "required parameter not specified: BACKUP_PATH (-B, --backup-path)");
166+
167+
/* path must be absolute */
168+
if (backup_path != NULL && !is_absolute_path(backup_path))
169+
elog(ERROR, "-B, --backup-path must be an absolute path");
170+
if (pgdata != NULL && !is_absolute_path(pgdata))
171+
elog(ERROR, "-D, --pgdata must be an absolute path");
172+
173+
join_path_components(arclog_path, backup_path, "wal");
174+
175+
/* setup exclusion list for file search */
176+
for (i = 0; pgdata_exclude[i]; i++); /* find first empty slot */
177+
178+
pgdata_exclude[i++] = arclog_path;
179+
180+
if(!backup_logs)
181+
pgdata_exclude[i++] = "pg_log";
182+
183+
if (target_time != NULL && target_xid != NULL)
184+
elog(ERROR, "You can't specify recovery-target-time and recovery-target-xid at the same time");
185+
186+
/* do actual operation */
187+
if (pg_strcasecmp(cmd, "init") == 0)
188+
return do_init();
189+
else if (pg_strcasecmp(cmd, "backup") == 0)
190+
{
191+
pgBackupOption bkupopt;
192+
int res;
193+
bkupopt.smooth_checkpoint = smooth_checkpoint;
194+
bkupopt.keep_data_generations = keep_data_generations;
195+
bkupopt.keep_data_days = keep_data_days;
196+
197+
/* Do the backup */
198+
res = do_backup(bkupopt);
199+
if (res != 0)
200+
return res;
201+
202+
do_validate(current.start_time);
203+
}
204+
else if (pg_strcasecmp(cmd, "restore") == 0)
205+
return do_restore(backup_id, target_time, target_xid,
206+
target_inclusive, target_tli);
207+
else if (pg_strcasecmp(cmd, "show") == 0)
208+
return do_show(backup_id, show_all);
209+
else if (pg_strcasecmp(cmd, "validate") == 0)
210+
return do_validate(backup_id);
211+
else if (pg_strcasecmp(cmd, "delete") == 0)
212+
return do_delete(backup_id);
213+
else if (pg_strcasecmp(cmd, "delwal") == 0)
214+
return do_deletewal(backup_id, true);
215+
else
216+
elog(ERROR, "invalid command \"%s\"", cmd);
217+
218+
return 0;
219+
}
220+
221+
void
222+
pgut_help(bool details)
223+
{
224+
printf(_("%s manage backup/recovery of PostgreSQL database.\n\n"), PROGRAM_NAME);
225+
printf(_("Usage:\n"));
226+
printf(_(" %s OPTION init\n"), PROGRAM_NAME);
227+
printf(_(" %s OPTION backup\n"), PROGRAM_NAME);
228+
printf(_(" %s OPTION restore\n"), PROGRAM_NAME);
229+
printf(_(" %s OPTION show [ID]\n"), PROGRAM_NAME);
230+
printf(_(" %s OPTION validate [ID]\n"), PROGRAM_NAME);
231+
printf(_(" %s OPTION delete ID\n"), PROGRAM_NAME);
232+
printf(_(" %s OPTION delwal [ID]\n"), PROGRAM_NAME);
233+
234+
if (!details)
235+
return;
236+
237+
printf(_("\nCommon Options:\n"));
238+
printf(_(" -D, --pgdata=PATH location of the database storage area\n"));
239+
printf(_(" -B, --backup-path=PATH location of the backup storage area\n"));
240+
/*printf(_(" -c, --check show what would have been done\n"));*/
241+
printf(_(" -j, --threads=NUM num threads for backup and restore\n"));
242+
printf(_(" --progress show progress copy files\n"));
243+
printf(_("\nBackup options:\n"));
244+
printf(_(" -b, --backup-mode=MODE full,page,ptrack\n"));
245+
printf(_(" -C, --smooth-checkpoint do smooth checkpoint before backup\n"));
246+
printf(_(" --stream use stream for save/restore WAL during backup\n"));
247+
/*printf(_(" --keep-data-generations=N keep GENERATION of full data backup\n"));
248+
printf(_(" --keep-data-days=DAY keep enough data backup to recover to DAY days age\n"));*/
249+
printf(_(" --backup-pg-log start backup pg_log directory\n"));
250+
printf(_(" -S, --slot=SLOTNAME replication slot to use\n"));
251+
printf(_("\nRestore options:\n"));
252+
printf(_(" --time time stamp up to which recovery will proceed\n"));
253+
printf(_(" --xid transaction ID up to which recovery will proceed\n"));
254+
printf(_(" --inclusive whether we stop just after the recovery target\n"));
255+
printf(_(" --timeline recovering into a particular timeline\n"));
256+
printf(_("\nCatalog options:\n"));
257+
printf(_(" -a, --show-all show deleted backup too\n"));
258+
printf(_("\nDelete options:\n"));
259+
printf(_(" --wal remove unnecessary wal archives also\n"));
260+
}
261+
262+
static void
263+
opt_backup_mode(pgut_option *opt, const char *arg)
264+
{
265+
current.backup_mode = parse_backup_mode(arg);
266+
}

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