New SQL functons pg_backup_in_progress() and pg_backup_start_time()
Darold Gilles, reviewed by Gabriele Bartolini and others, rebased by Marco Nenciarini. Stylistic cleanup and OID fixes by me.
This commit is contained in:
parent
cd80073445
commit
68de499bda
@ -14455,6 +14455,12 @@ SELECT set_config('log_statement_stats', 'off', false);
|
|||||||
<indexterm>
|
<indexterm>
|
||||||
<primary>pg_stop_backup</primary>
|
<primary>pg_stop_backup</primary>
|
||||||
</indexterm>
|
</indexterm>
|
||||||
|
<indexterm>
|
||||||
|
<primary>pg_is_in_backup</primary>
|
||||||
|
</indexterm>
|
||||||
|
<indexterm>
|
||||||
|
<primary>pg_backup_start_time</primary>
|
||||||
|
</indexterm>
|
||||||
<indexterm>
|
<indexterm>
|
||||||
<primary>pg_switch_xlog</primary>
|
<primary>pg_switch_xlog</primary>
|
||||||
</indexterm>
|
</indexterm>
|
||||||
@ -14519,6 +14525,20 @@ SELECT set_config('log_statement_stats', 'off', false);
|
|||||||
<entry><type>text</type></entry>
|
<entry><type>text</type></entry>
|
||||||
<entry>Finish performing on-line backup (restricted to superusers or replication roles)</entry>
|
<entry>Finish performing on-line backup (restricted to superusers or replication roles)</entry>
|
||||||
</row>
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>
|
||||||
|
<literal><function>pg_is_in_backup()</function></literal>
|
||||||
|
</entry>
|
||||||
|
<entry><type>bool</type></entry>
|
||||||
|
<entry>True if an on-line exclusive backup is still in progress.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>
|
||||||
|
<literal><function>pg_backup_start_time()</function></literal>
|
||||||
|
</entry>
|
||||||
|
<entry><type>timestamp with time zone</type></entry>
|
||||||
|
<entry>Get start time of an online exclusive backup in progress.</entry>
|
||||||
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry>
|
<entry>
|
||||||
<literal><function>pg_switch_xlog()</function></literal>
|
<literal><function>pg_switch_xlog()</function></literal>
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "utils/numeric.h"
|
#include "utils/numeric.h"
|
||||||
#include "utils/guc.h"
|
#include "utils/guc.h"
|
||||||
#include "utils/timestamp.h"
|
#include "utils/timestamp.h"
|
||||||
|
#include "storage/fd.h"
|
||||||
|
|
||||||
static void validate_xlog_location(char *str);
|
static void validate_xlog_location(char *str);
|
||||||
|
|
||||||
@ -563,3 +563,74 @@ pg_xlog_location_diff(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
PG_RETURN_NUMERIC(result);
|
PG_RETURN_NUMERIC(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns bool with current on-line backup mode, a global state.
|
||||||
|
*/
|
||||||
|
Datum
|
||||||
|
pg_is_in_backup(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
PG_RETURN_BOOL(BackupInProgress());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns start time of an online exclusive backup.
|
||||||
|
*
|
||||||
|
* When there's no exclusive backup in progress, the function
|
||||||
|
* returns NULL.
|
||||||
|
*/
|
||||||
|
Datum
|
||||||
|
pg_backup_start_time(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
Datum xtime;
|
||||||
|
FILE *lfp;
|
||||||
|
char fline[MAXPGPATH];
|
||||||
|
char backup_start_time[30];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See if label file is present
|
||||||
|
*/
|
||||||
|
lfp = AllocateFile(BACKUP_LABEL_FILE, "r");
|
||||||
|
if (lfp == NULL)
|
||||||
|
{
|
||||||
|
if (errno != ENOENT)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode_for_file_access(),
|
||||||
|
errmsg("could not read file \"%s\": %m",
|
||||||
|
BACKUP_LABEL_FILE)));
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse the file to find the the START TIME line.
|
||||||
|
*/
|
||||||
|
backup_start_time[0] = '\0';
|
||||||
|
while (fgets(fline, sizeof(fline), lfp) != NULL)
|
||||||
|
{
|
||||||
|
if (sscanf(fline, "START TIME: %25[^\n]\n", backup_start_time) == 1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close the backup label file.
|
||||||
|
*/
|
||||||
|
if (ferror(lfp) || FreeFile(lfp))
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode_for_file_access(),
|
||||||
|
errmsg("could not read file \"%s\": %m", BACKUP_LABEL_FILE)));
|
||||||
|
|
||||||
|
if (strlen(backup_start_time) == 0)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||||
|
errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert the time string read from file to TimestampTz form.
|
||||||
|
*/
|
||||||
|
xtime = DirectFunctionCall3(timestamptz_in,
|
||||||
|
CStringGetDatum(backup_start_time),
|
||||||
|
ObjectIdGetDatum(InvalidOid),
|
||||||
|
Int32GetDatum(-1));
|
||||||
|
|
||||||
|
PG_RETURN_DATUM(xtime);
|
||||||
|
}
|
||||||
|
@ -282,5 +282,7 @@ extern Datum pg_xlog_replay_pause(PG_FUNCTION_ARGS);
|
|||||||
extern Datum pg_xlog_replay_resume(PG_FUNCTION_ARGS);
|
extern Datum pg_xlog_replay_resume(PG_FUNCTION_ARGS);
|
||||||
extern Datum pg_is_xlog_replay_paused(PG_FUNCTION_ARGS);
|
extern Datum pg_is_xlog_replay_paused(PG_FUNCTION_ARGS);
|
||||||
extern Datum pg_xlog_location_diff(PG_FUNCTION_ARGS);
|
extern Datum pg_xlog_location_diff(PG_FUNCTION_ARGS);
|
||||||
|
extern Datum pg_is_in_backup(PG_FUNCTION_ARGS);
|
||||||
|
extern Datum pg_backup_start_time(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
#endif /* XLOG_INTERNAL_H */
|
#endif /* XLOG_INTERNAL_H */
|
||||||
|
@ -53,6 +53,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 201204301
|
#define CATALOG_VERSION_NO 201206141
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2936,6 +2936,10 @@ DATA(insert OID = 2172 ( pg_start_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2
|
|||||||
DESCR("prepare for taking an online backup");
|
DESCR("prepare for taking an online backup");
|
||||||
DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
|
DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
|
||||||
DESCR("finish taking an online backup");
|
DESCR("finish taking an online backup");
|
||||||
|
DATA(insert OID = 3813 ( pg_is_in_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_is_in_backup _null_ _null_ _null_ ));
|
||||||
|
DESCR("true if server is in online backup");
|
||||||
|
DATA(insert OID = 3814 ( pg_backup_start_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ pg_backup_start_time _null_ _null_ _null_ ));
|
||||||
|
DESCR("start time of an online backup");
|
||||||
DATA(insert OID = 2848 ( pg_switch_xlog PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_switch_xlog _null_ _null_ _null_ ));
|
DATA(insert OID = 2848 ( pg_switch_xlog PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_switch_xlog _null_ _null_ _null_ ));
|
||||||
DESCR("switch to new xlog file");
|
DESCR("switch to new xlog file");
|
||||||
DATA(insert OID = 3098 ( pg_create_restore_point PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "25" _null_ _null_ _null_ _null_ pg_create_restore_point _null_ _null_ _null_ ));
|
DATA(insert OID = 3098 ( pg_create_restore_point PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "25" _null_ _null_ _null_ _null_ pg_create_restore_point _null_ _null_ _null_ ));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user