1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2024-11-24 08:52:38 +02:00

Rename project to pg_probackup.

This commit is contained in:
stalkerg 2016-11-16 20:34:21 +03:00
parent 054226d2db
commit 188bbdd593
29 changed files with 231 additions and 1231 deletions

View File

@ -1,4 +1,4 @@
PROGRAM = pg_arman PROGRAM = pg_probackup
OBJS = backup.o \ OBJS = backup.o \
catalog.o \ catalog.o \
data.o \ data.o \
@ -7,7 +7,7 @@ OBJS = backup.o \
fetch.o \ fetch.o \
init.o \ init.o \
parray.o \ parray.o \
pg_arman.o \ pg_probackup.o \
restore.o \ restore.o \
show.o \ show.o \
status.o \ status.o \
@ -25,7 +25,7 @@ EXTRA_CLEAN = datapagemap.c datapagemap.h xlogreader.c receivelog.c receivelog.h
REGRESS = init option show delete backup restore REGRESS = init option show delete backup restore
all: checksrcdir datapagemap.h logging.h receivelog.h streamutil.h pg_arman all: checksrcdir datapagemap.h logging.h receivelog.h streamutil.h pg_probackup
MAKE_GLOBAL="../../src/Makefile.global" MAKE_GLOBAL="../../src/Makefile.global"
TEST_GLOBAL:=$(shell test -e ../../src/Makefile.global) TEST_GLOBAL:=$(shell test -e ../../src/Makefile.global)
@ -45,7 +45,7 @@ endif
else else
#TODO: fix me #TODO: fix me
REGRESS = REGRESS =
subdir=contrib/pg_arman subdir=contrib/pg_probackup
top_builddir=../.. top_builddir=../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk include $(top_srcdir)/contrib/contrib-global.mk

View File

@ -1,10 +1,7 @@
pg_arman fork from Postgres Professional pg_probackup fork of pg_arman by Postgres Professional
======================================== ========================================
This repository contains fork of pg_arman by Postgres Professional with pg_probackup is a backup and recovery manager for PostgreSQL servers able to do
block level incremental backup support.
pg_arman is a backup and recovery manager for PostgreSQL servers able to do
differential and full backup as well as restore a cluster to a differential and full backup as well as restore a cluster to a
state defined by a given recovery target. It is designed to perform state defined by a given recovery target. It is designed to perform
periodic backups of an existing PostgreSQL server, combined with WAL periodic backups of an existing PostgreSQL server, combined with WAL
@ -28,13 +25,13 @@ Download
-------- --------
The latest version of this software can be found on the project website at The latest version of this software can be found on the project website at
https://github.com/postgrespro/pg_arman. Original fork of pg_arman can be https://github.com/postgrespro/pg_probackup. Original fork of pg_probackup can be
found at https://github.com/michaelpq/pg_arman. found at https://github.com/michaelpq/pg_arman.
Installation Installation
------------ ------------
Compiling pg_arman requires a PostgreSQL installation to be in place Compiling pg_probackup requires a PostgreSQL installation to be in place
as well as a raw source tree. Pass the path to the PostgreSQL source tree as well as a raw source tree. Pass the path to the PostgreSQL source tree
to make, in the top_srcdir variable: to make, in the top_srcdir variable:
@ -42,23 +39,23 @@ to make, in the top_srcdir variable:
In addition, you must have pg_config in $PATH. In addition, you must have pg_config in $PATH.
The current version of pg_arman is compatible with PostgreSQL 9.5 and The current version of pg_probackup is compatible with PostgreSQL 9.5 and
upper versions. upper versions.
Platforms Platforms
--------- ---------
pg_arman has been tested on Linux and Unix-based platforms. pg_probackup has been tested on Linux and Unix-based platforms.
Documentation Documentation
------------- -------------
All the documentation you can find [here](doc/pg_arman.md). All the documentation you can find [here](doc/pg_probackup.md).
Regression tests Regression tests
---------------- ----------------
The test suite of pg_arman is available in the code tree and can be The test suite of pg_probackup is available in the code tree and can be
launched in a way similar to common PostgreSQL extensions and modules: launched in a way similar to common PostgreSQL extensions and modules:
make installcheck make installcheck
@ -85,7 +82,7 @@ of these approach is requirement to have WAL archive.
some overhead to PostgreSQL performance. On our experiments it appears to be some overhead to PostgreSQL performance. On our experiments it appears to be
less than 3%. less than 3%.
These two approaches were implemented in this fork of pg_arman. The second These two approaches were implemented in this fork of pg_probackup. The second
approach requires [patch for PostgreSQL 9.5](https://gist.github.com/stalkerg/44703dbcbac1da08f448b7e6966646c0) or approach requires [patch for PostgreSQL 9.5](https://gist.github.com/stalkerg/44703dbcbac1da08f448b7e6966646c0) or
[patch for PostgreSQL 10](https://gist.github.com/stalkerg/ab833d94e2f64df241f1835651e06e4b). [patch for PostgreSQL 10](https://gist.github.com/stalkerg/ab833d94e2f64df241f1835651e06e4b).
@ -101,29 +98,29 @@ You need to enable WAL archive by adding following lines to postgresql.conf:
``` ```
wal_level = archive wal_level = archive
archive_command = 'test ! -f /home/postgres/backup/arman/wal/%f && cp %p /home/postgres/backup/arman/wal/%f' archive_command = 'test ! -f /home/postgres/backup/wal/%f && cp %p /home/postgres/backup/wal/%f'
``` ```
Example backup (assuming PostgreSQL is running): Example backup (assuming PostgreSQL is running):
```bash ```bash
# Init pg_aramn backup folder # Init pg_aramn backup folder
pg_arman init -B /home/postgres/backup/pgarman pg_probackup init -B /home/postgres/backup
# Make full backup with 2 thread and verbose mode. # Make full backup with 2 thread and verbose mode.
pg_arman backup -B /home/postgres/backup/pgarman -D /home/postgres/pgdata/arman -b full -v -j 2 pg_probackup backup -B /home/postgres/backup -D /home/postgres/pgdata -b full -v -j 2
# Show backups information # Show backups information
pg_arman show -B /home/postgres/backup/pgarman pg_probackup show -B /home/postgres/backup
# Now you can insert or update some data in your database # Now you can insert or update some data in your database
# Then start the incremental backup. # Then start the incremental backup.
pg_arman backup -B /home/postgres/backup/pgarman -D /home/postgres/pgdata/arman -b page -v -j 2 pg_probackup backup -B /home/postgres/backup -D /home/postgres/pgdata -b page -v -j 2
# You should see that increment is really small # You should see that increment is really small
pg_arman show -B /home/postgres/backup/pgarman pg_probackup show -B /home/postgres/backup
``` ```
For restore after remove your pgdata you can use: For restore after remove your pgdata you can use:
``` ```
pg_arman restore -B /home/postgres/backup/pgarman -D /home/postgres/pgdata/arman -j 4 --verbose pg_probackup restore -B /home/postgres/backup -D /home/postgres/pgdata -j 4 --verbose
``` ```
### Retrieving changed blocks from ptrack ### Retrieving changed blocks from ptrack
@ -134,33 +131,33 @@ The advantage of this approach is that you don't have to save WAL archive. You
ptrack_enable = on ptrack_enable = on
``` ```
Also, some WALs still need to be fetched in order to get consistent backup. pg_arman can fetch them trough the streaming replication protocol. Thus, you also need to [enable streaming replication connection](https://wiki.postgresql.org/wiki/Streaming_Replication). Also, some WALs still need to be fetched in order to get consistent backup. pg_probackup can fetch them trough the streaming replication protocol. Thus, you also need to [enable streaming replication connection](https://wiki.postgresql.org/wiki/Streaming_Replication).
Example backup (assuming PostgreSQL is running): Example backup (assuming PostgreSQL is running):
```bash ```bash
# Init pg_aramn backup folder # Init pg_aramn backup folder
pg_arman init -B /home/postgres/backup/pgarman pg_probackup init -B /home/postgres/backup
# Make full backup with 2 thread and verbose mode. # Make full backup with 2 thread and verbose mode.
pg_arman backup -B /home/postgres/backup/pgarman -D /home/postgres/pgdata/arman -b full -v -j 2 --stream pg_probackup backup -B /home/postgres/backup -D /home/postgres/pgdata -b full -v -j 2 --stream
# Show backups information # Show backups information
pg_arman show -B /home/postgres/backup/pgarman pg_probackup show -B /home/postgres/backup
# Now you can insert or update some data in your database # Now you can insert or update some data in your database
# Then start the incremental backup. # Then start the incremental backup.
pg_arman backup -B /home/postgres/backup/pgarman -D /home/postgres/pgdata/arman -b ptrack -v -j 2 --stream pg_probackup backup -B /home/postgres/backup -D /home/postgres/pgdata -b ptrack -v -j 2 --stream
# You should see that increment is really small # You should see that increment is really small
pg_arman show -B /home/postgres/backup/pgarman pg_probackup show -B /home/postgres/backup
``` ```
For restore after remove your pgdata you can use: For restore after remove your pgdata you can use:
``` ```
pg_arman restore -B /home/postgres/backup/pgarman -D /home/postgres/pgdata/arman -j 4 --verbose --stream pg_probackup restore -B /home/postgres/backup -D /home/postgres/pgdata -j 4 --verbose --stream
``` ```
License License
------- -------
pg_arman can be distributed under the PostgreSQL license. See COPYRIGHT pg_probackup can be distributed under the PostgreSQL license. See COPYRIGHT
file for more information. pg_arman is a fork of the existing project file for more information. pg_arman is a fork of the existing project
pg_rman, initially created and maintained by NTT and Itagaki Takahiro. pg_rman, initially created and maintained by NTT and Itagaki Takahiro.

View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -35,7 +35,7 @@ static int server_version = 0;
static bool in_backup = false; /* TODO: more robust logic */ static bool in_backup = false; /* TODO: more robust logic */
static int standby_message_timeout = 10 * 1000; /* 10 sec = default */ static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
static XLogRecPtr stop_backup_lsn = InvalidXLogRecPtr; static XLogRecPtr stop_backup_lsn = InvalidXLogRecPtr;
const char *progname = "pg_arman"; const char *progname = "pg_probackup";
/* list of files contained in backup */ /* list of files contained in backup */
parray *backup_files_list; parray *backup_files_list;
@ -161,7 +161,7 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
/* notify start of backup to PostgreSQL server */ /* notify start of backup to PostgreSQL server */
time2iso(label, lengthof(label), current.start_time); time2iso(label, lengthof(label), current.start_time);
strncat(label, " with pg_arman", lengthof(label)); strncat(label, " with pg_probackup", lengthof(label));
pg_start_backup(label, smooth_checkpoint, &current); pg_start_backup(label, smooth_checkpoint, &current);
/* start stream replication */ /* start stream replication */
@ -476,7 +476,7 @@ do_backup(pgBackupOption bkupopt)
elog(ERROR, "cannot lock backup catalog"); elog(ERROR, "cannot lock backup catalog");
else if (ret == 1) else if (ret == 1)
elog(ERROR, elog(ERROR,
"another pg_arman is running, skipping this backup"); "another pg_probackup is running, skipping this backup");
/* initialize backup result */ /* initialize backup result */
current.status = BACKUP_STATUS_RUNNING; current.status = BACKUP_STATUS_RUNNING;

View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <dirent.h> #include <dirent.h>
#include <fcntl.h> #include <fcntl.h>
@ -28,7 +28,7 @@ static pgBackup *catalog_read_ini(const char *path);
static int lock_fd = -1; static int lock_fd = -1;
/* /*
* Lock of the catalog with pg_arman.ini file and return 0. * Lock of the catalog with pg_probackup.conf file and return 0.
* If the lock is held by another one, return 1 immediately. * If the lock is held by another one, return 1 immediately.
*/ */
int int

2
data.c
View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>

View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <dirent.h> #include <dirent.h>
#include <unistd.h> #include <unistd.h>
@ -34,7 +34,7 @@ do_delete(time_t backup_id)
elog(ERROR, "can't lock backup catalog."); elog(ERROR, "can't lock backup catalog.");
else if (ret == 1) else if (ret == 1)
elog(ERROR, elog(ERROR,
"another pg_arman is running, stop delete."); "another pg_probackup is running, stop delete.");
/* Get complete list of backups */ /* Get complete list of backups */
backup_list = catalog_get_backup_list(0); backup_list = catalog_get_backup_list(0);
@ -109,7 +109,7 @@ int do_deletewal(time_t backup_id, bool strict)
elog(ERROR, "can't lock backup catalog."); elog(ERROR, "can't lock backup catalog.");
else if (ret == 1) else if (ret == 1)
elog(ERROR, elog(ERROR,
"another pg_arman is running, stop delete."); "another pg_probackup is running, stop delete.");
backup_list = catalog_get_backup_list(0); backup_list = catalog_get_backup_list(0);
for (i = 0; i < parray_num(backup_list); i++) for (i = 0; i < parray_num(backup_list); i++)

2
dir.c
View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <libgen.h> #include <libgen.h>
#include <unistd.h> #include <unistd.h>

View File

@ -1,414 +0,0 @@
# pg_arman(1)
## NAME
pg_arman - Backup and recovery manager for PostgreSQL
## SYNOPSIS
```
pg_arman [ OPTIONS ]
{ init |
backup |
restore |
show [ ID] |
validate [ ID ] |
delete ID }
```
ID is the base36 id from start time of the target backup.
## DESCRIPTION
pg_arman is a utility program to backup and restore PostgreSQL database.
It proposes the following features:
- Backup while database runs including tablespaces with just one
command
- Recovery from backup with just one command, with customized targets
to facilitate the use of PITR.
- Support for full and differential backup + ptrack differential backup
- Management of backups with integrated catalog
## COMMANDS
pg_arman supports the following commands. See also **OPTIONS** for more
details.
* **init**:
Initialize a backup catalog.
* **backup**:
Take an online backup.
* **restore**:
Perform restore.
* **show**:
Show backup history. The timeline option shows timeline of the backup and the parent's timeline for each backup.
* **validate**:
Validate backup files.
* **delete**:
Delete backup files.
### INITIALIZATION
First, you need to create "a backup catalog" to store backup files and
their metadata. It is recommended to setup archive_mode and archive_command
in postgresql.conf before initializing the backup catalog. If the variables
are initialized, pg_arman can adjust the config file to the setting. In this
case, you have to specify the database cluster path for PostgreSQL. Please
specify it in PGDATA environmental variable or -D/--pgdata option.
```
$ pg_arman init -B /path/to/backup/
```
### BACKUP
Backup target can be one of the following types:
- Full backup, backup a whole database cluster.
- Differential backup, backup only files or pages modified after the last
verified backup. A scan of the WAL records since the last backup up to the
LSN position of pg_start_backup is done and all the blocks touched are
recorded and tracked as part of the backup. As the WAL segments scanned
need to be located in the WAL archive, the last segment after pg_start_backup
has been run needs to be forcibly switched.
- ptrack differential backup, use bitmap ptrack file for detect changed pages.
For use it you need set ptrack_enable option to "on".
It is recommended to verify backup files as soon as possible after backup.
Unverified backup cannot be used in restore and in differential backups.
### RESTORE
PostgreSQL server should be stopped before performing a restore. If database
cluster still exists, restore command will save unarchived transaction log
and delete all database files. You can retry recovery until a new backup is
taken. After restoring files, pg_arman creates recovery.conf in $PGDATA. The
conf file contains parameters for recovery. It is as well possible to modify
the file manually.
It is recommended to take a full backup as soon as possible after recovery
has succeeded.
If "--timeline" is not specifed, the last checkpoint's
TimeLineID in control file ($PGDATA/global/pg_control) will be the restore
target. If pg_control is not present, TimeLineID in the full backup used by
the restore will be a restore target.
### EXAMPLES
To reduce the number of command line arguments, you can set BACKUP_PATH,
an environment variable, to the absolute path of the backup catalog and
write default configuration into ${BACKUP_PATH}/pg_arman.ini.
```
$ cat $BACKUP_PATH/pg_arman.ini
ARCLOG_PATH = /home/postgres/arclog
BACKUP_MODE = FULL
KEEP_DATA_GENERATIONS = 3
KEEP_DATA_DAYS = 120
```
### TAKE A BACKUP
This example takes a full backup of the whole database. Then, it validates
all unvalidated backups.
```
$ pg_arman backup --backup-mode=full
$ pg_arman validate
```
### RESTORE FROM A BACKUP
Here are some commands to restore from a backup:
```
$ pg_ctl stop -m immediate
$ pg_arman restore
$ pg_ctl start
```
### SHOW A BACKUP
```
$ pg_arman show
==========================================================================================
ID Recovery time Mode Current TLI Parent TLI Time Data Backup Status
==========================================================================================
OFX1LH 2013-12-25 03:02:31 PAGE 1 0 0m 203kB 67MB DONE
OFX1KL 2013-12-25 03:02:31 PAGE 1 0 0m 0B 0B ERROR
OFX1KA 2013-12-25 03:02:25 FULL 1 0 0m 33MB 364MB OK
```
The fields are:
* Start: start time of backup
* Mode: Mode of backup: FULL (full) or PAGE (page differential) or PTRACK (differential by ptrack)
* Current TLI: current timeline of backup
* Parent TLI: parent timeline of backup
* Time: total time necessary to take this backup
* Data: size of data files
* Log: size of read server log files
* Backup: size of backup (= written size)
* Status: status of backup. Possible values are:
* OK : backup is done and validated.
* DONE : backup is done, but not validated yet.
* RUNNING : backup is running
* DELETING : backup is being deleted.
* DELETED : backup has been deleted.
* ERROR : backup is unavailable because some errors occur during backup.
* CORRUPT : backup is unavailable because it is broken.
When a ID is specified, more details about a backup is retrieved:
```
$ pg_arman show OFX1LH
# configuration
BACKUP_MODE=FULL
# result
TIMELINEID=1
START_LSN=0/08000020
STOP_LSN=0/080000a0
START_TIME='2011-11-27 19:15:45'
END_TIME='2011-11-27 19:19:02'
RECOVERY_XID=1759
RECOVERY_TIME='2011-11-27 19:15:53'
DATA_BYTES=25420184
BLOCK_SIZE=8192
XLOG_BLOCK_SIZE=8192
STATUS=OK
```
You can check the "RECOVERY_XID" and "RECOVERY_TIME" which are used for
restore option "--xid", "--time".
The delete command deletes backup files not required by recovery after
the specified ID. This command also cleans up in the WAL archive the
WAL segments that are no longer needed to restore from the remaining
backups.
### OPTIONS
pg_arman accepts the following command line parameters. Some of them can
be also specified as environment variables. See also *PARAMETERS* for the
details.
### COMMON OPTIONS
As a general rule, paths for data location need to be specified as
absolute paths; relative paths are not allowed.
**-D** PATH / **--pgdata**=PATH:
The absolute path of database cluster. Required on backup and
restore.
**-A** PATH / **--arclog-path**=PATH:
The absolute path of archive WAL directory. Required for restore
and show command.
**-B** PATH / **--backup-path**=PATH:
The absolute path of backup catalog. This option is mandatory.
**-c** / **--check**:
If specifed, pg_arman doesn't perform actual jobs but only checks
parameters and required resources. The option is typically used with
--verbose option to verify the operation.
### BACKUP OPTIONS
**-b** BACKUPMODE / **--backup-mode**=BACKUPMODE:
Specify backup target files. Available options are: "full",
"page", "ptrack".
**-C** / **--smooth-checkpoint**:
Checkpoint is performed on every backups. If the option is specified,
do smooth checkpoint then. See also the second argument for
pg_start_backup().
**--validate**:
Validate a backup just after taking it. Other backups taken
previously are ignored.
**--keep-data-generations**=NUMBER / **--keep-data-days**=DAYS:
Specify how long backuped data files will be kept.
--keep-data-generations means number of backup generations.
--keep-data-days means days to be kept.
Only files exceeded one of those settings are deleted.
**-j**=NUMBER / **--threads**=NUMBER:
Number of threads for backup.
**--stream**:
Enable stream replication for save WAL during backup process.
### RESTORE OPTIONS
The parameters whose name start are started with --recovery refer to
the same parameters as the ones in recovery.confin recovery.conf.
**--timeline**=_TIMELINE_:
Specifies recovering into a particular timeline. If not specified,
the current timeline is used.
**--time**=TIMESTAMP:
This parameter specifies the timestamp up to which recovery will
proceed.
**--xid**=XID:
This parameter specifies the transaction ID up to which recovery
will proceed.
**--inclusive**:
Specifies whether server pauses when recovery target is reached.
**-j**=NUMBER / **--threads**=NUMBER:
Number of threads for restore.
**--stream**:
Restore without recovery.conf and use pg_xlog WALs. Before you need
backup with **--stream** option. This option will disable all **--recovery-**
options.
### CATALOG OPTIONS
**-a** / **--show-all**:
Show all existing backups, including the deleted ones.
### CONNECTION OPTIONS
Parameters to connect PostgreSQL server.
**-d** DBNAME / **--dbname**=DBNAME:
The database name to execute pg_start_backup() and pg_stop_backup().
**-h** HOSTNAME / **--host**=HOSTNAME:
Specifies the host name of the machine on which the server is running.
If the value begins with a slash, it is used as the directory for the
Unix domain socket.
**-p** PORT / **--port**=PORT:
Specifies the TCP port or local Unix domain socket file extension on
which the server is listening for connections.
**-U** USERNAME / **--username**=USERNAME:
User name to connect as.
**-w** / **--no-password**:
Never issue a password prompt. If the server requires password
authentication and a password is not available by other means such as
a .pgpass file, the connection attempt will fail. This option can be
useful in batch jobs and scripts where no user is present to enter a
password.
**-W** / **--password**:
Force pg_arman to prompt for a password before connecting to a database.
This option is never essential, since pg_arman will automatically
prompt for a password if the server demands password authentication.
However, pg_arman will waste a connection attempt in order to find out
if the server wants a password. In some cases it is worth typing -W
to avoid the extra connection attempt.
### DELETE OPTIONS
**--wal**:
Remove unnecessary wal archives also.
### GLOBAL OPTIONS
**--help**:
Print help, then exit.
**-V** / **--version**:
Print version information, then exit.
**-v** / **--verbose**:
If specified, pg_arman works in verbose mode.
## PARAMETERS
Some of parameters can be specified as command line arguments, environment
variables or in configuration file as follows:
```
Short Long Env File
-h --host PGHOST No
-p --port PGPORT No
-d --dbname PGDATABASE No
-U --username PGUSER No
PGPASSWORD No
-w --password No
-W --no-password No
-D --pgdata PGDATA Yes
-B --backup-path BACKUP_PATH Yes
-A --arclog-path ARCLOG_PATH Yes
-b --backup-mode BACKUP_MODE Yes
-C --smooth-checkpoint SMOOTH_CHECKPOINT Yes
--validate VALIDATE Yes
--keep-data-generations KEEP_DATA_GENERATIONS Yes
--keep-data-days KEEP_DATA_DAYS Yes
--timeline RECOVERY_TARGET_TIMELINE Yes
--xid RECOVERY_TARGET_XID Yes
--time RECOVERY_TARGET_TIME Yes
--inclusive RECOVERY_TARGET_INCLUSIVE Yes
```
Variable names in configuration file are the same as long names or names
of environment variables. The password can not be specified in command
line and configuration file for security reason.
This utility, like most other PostgreSQL utilities, also uses the
environment variables supported by libpq (see Environment Variables).
## RESTRICTIONS
pg_arman has the following restrictions.
- Requires to read database cluster directory and write backup catalog
directory. It is usually necessary to mount the disk where backup
catalog is placed with NFS or related from database server.
- Major versions of pg_arman and server should match.
- Block sizes of pg_arman and server should match.
- If there are some unreadable files/directories in data folder of server
WAL directory or archived WAL directory, the backup or restore will fail
depending on the backup mode selected.
## DETAILS
### RECOVERY TO POINT-IN-TIME
pg_arman can recover to point-in-time if timeline, transaction ID, or
timestamp is specified in recovery.conf. xlogdump is a contrib module of
PostgreSQL core that allows checking in the content of WAL files and
determine when to recover. This might help.
### CONFIGURATION FILE
Setting parameters in configuration file is done as "name=value". Quotes
are required if the value contains whitespaces. Comments should start with
"#" and are automatically ignored. Whitespaces and tabs are ignored
excluding values.
### RESTRICTIONS
* pg_arman is aimed at working with PostgreSQL 9.5 and newer versions.
* For ptrack feature you need special version of Postgres and set wal_level to
archive or hot_standby and ptrack_enable.
* For stream feature you need configure streaming replication in your postgres.
### EXIT CODE
pg_arman returns exit codes for each error status.
```
Code Name Description
0 SUCCESS Operation succeeded.
1 ERROR Generic error
2 FATAL Exit because of repeated errors
3 PANIC Unknown critical condition
```
## AUTHOR ##
pg_arman is a fork of pg_arman that was originally written by NTT, now
developed and maintained by Michael Paquier.
Threads, WAL diff, ptrack diff, stream WAL and some other features developed by
Yury Zhuravlev aka stalkerg from PostgresPro.
Please report bug reports at <https://github.com/postgrespro/pg_arman/issues>.

View File

@ -4,21 +4,21 @@
0 0
results/init/backup/ results/init/backup/
results/init/backup/backups/ results/init/backup/backups/
results/init/backup/pg_arman.ini results/init/backup/pg_probackup.conf
results/init/backup/wal/ results/init/backup/wal/
###### INIT COMMAND TEST-0002 ###### ###### INIT COMMAND TEST-0002 ######
###### success with archive_command and log_directory ###### ###### success with archive_command and log_directory ######
0 0
results/init/backup/ results/init/backup/
results/init/backup/backups/ results/init/backup/backups/
results/init/backup/pg_arman.ini results/init/backup/pg_probackup.conf
results/init/backup/wal/ results/init/backup/wal/
###### INIT COMMAND TEST-0003 ###### ###### INIT COMMAND TEST-0003 ######
###### success without archive_command ###### ###### success without archive_command ######
0 0
results/init/backup/ results/init/backup/
results/init/backup/backups/ results/init/backup/backups/
results/init/backup/pg_arman.ini results/init/backup/pg_probackup.conf
results/init/backup/wal/ results/init/backup/wal/
###### INIT COMMAND TEST-0004 ###### ###### INIT COMMAND TEST-0004 ######
###### failure with backup catalog already existed ###### ###### failure with backup catalog already existed ######

View File

@ -1,16 +1,16 @@
\! bash sql/option.sh \! bash sql/option.sh
###### COMMAND OPTION TEST-0001 ###### ###### COMMAND OPTION TEST-0001 ######
###### help option ###### ###### help option ######
pg_arman manage backup/recovery of PostgreSQL database. pg_probackup manage backup/recovery of PostgreSQL database.
Usage: Usage:
pg_arman OPTION init pg_probackup OPTION init
pg_arman OPTION backup pg_probackup OPTION backup
pg_arman OPTION restore pg_probackup OPTION restore
pg_arman OPTION show [ID] pg_probackup OPTION show [ID]
pg_arman OPTION validate [ID] pg_probackup OPTION validate [ID]
pg_arman OPTION delete ID pg_probackup OPTION delete ID
pg_arman OPTION delwal [ID] pg_probackup OPTION delwal [ID]
Common Options: Common Options:
-D, --pgdata=PATH location of the database storage area -D, --pgdata=PATH location of the database storage area
@ -51,13 +51,13 @@ Generic options:
--help show this help, then exit --help show this help, then exit
--version output version information, then exit --version output version information, then exit
Read the website for details. <https://github.com/stalkerg/pg_arman> Read the website for details. <https://github.com/postgrespro/pg_probackup>
Report bugs to <https://github.com/stalkerg/pg_arman/issues>. Report bugs to <https://github.com/postgrespro/pg_probackup/issues>.
1 1
###### COMMAND OPTION TEST-0002 ###### ###### COMMAND OPTION TEST-0002 ######
###### version option ###### ###### version option ######
pg_arman 0.1 pg_probackup 1.0
1 1
###### COMMAND OPTION TEST-0003 ###### ###### COMMAND OPTION TEST-0003 ######
@ -81,33 +81,33 @@ ERROR: required backup ID not specified
1 1
###### COMMAND OPTION TEST-0008 ###### ###### COMMAND OPTION TEST-0008 ######
###### syntax error in pg_arman.ini ###### ###### syntax error in pg_probackup.conf ######
WARNING: syntax error in " = INFINITE" WARNING: syntax error in " = INFINITE"
ERROR: Required parameter not specified: BACKUP_MODE (-b, --backup-mode) ERROR: Required parameter not specified: BACKUP_MODE (-b, --backup-mode)
1 1
###### COMMAND OPTION TEST-0009 ###### ###### COMMAND OPTION TEST-0009 ######
###### invalid value in pg_arman.ini ###### ###### invalid value in pg_probackup.conf ######
ERROR: invalid backup-mode "" ERROR: invalid backup-mode ""
1 1
###### COMMAND OPTION TEST-0010 ###### ###### COMMAND OPTION TEST-0010 ######
###### invalid value in pg_arman.ini ###### ###### invalid value in pg_probackup.conf ######
ERROR: invalid option "KEEP_DATA_GENERATIONS" ERROR: invalid option "KEEP_DATA_GENERATIONS"
1 1
###### COMMAND OPTION TEST-0011 ###### ###### COMMAND OPTION TEST-0011 ######
###### invalid value in pg_arman.ini ###### ###### invalid value in pg_probackup.conf ######
ERROR: option -C, --smooth-checkpoint should be a boolean: 'FOO' ERROR: option -C, --smooth-checkpoint should be a boolean: 'FOO'
1 1
###### COMMAND OPTION TEST-0012 ###### ###### COMMAND OPTION TEST-0012 ######
###### invalid option in pg_arman.ini ###### ###### invalid option in pg_probackup.conf ######
ERROR: invalid option "TIMELINEID" ERROR: invalid option "TIMELINEID"
1 1
###### COMMAND OPTION TEST-0013 ###### ###### COMMAND OPTION TEST-0013 ######
###### check priority of several pg_arman.ini files ###### ###### check priority of several pg_probackup.conf files ######
ERROR: invalid backup-mode "ENV_PATH" ERROR: invalid backup-mode "ENV_PATH"
1 1

View File

@ -19,7 +19,7 @@
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include "pg_arman.h" #include "pg_probackup.h"
/* /*
* Read a file into memory. The file to be read is <datadir>/<path>. * Read a file into memory. The file to be read is <datadir>/<path>.

6
init.c
View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <unistd.h> #include <unistd.h>
#include <dirent.h> #include <dirent.h>
@ -58,11 +58,11 @@ do_init(void)
parse_postgresql_conf(path, &log_directory, &archive_command); parse_postgresql_conf(path, &log_directory, &archive_command);
} }
/* create pg_arman.ini */ /* create pg_probackup.conf */
join_path_components(path, backup_path, PG_RMAN_INI_FILE); join_path_components(path, backup_path, PG_RMAN_INI_FILE);
fp = fopen(path, "wt"); fp = fopen(path, "wt");
if (fp == NULL) if (fp == NULL)
elog(ERROR, "cannot create pg_arman.ini: %s", strerror(errno)); elog(ERROR, "cannot create pg_probackup.conf: %s", strerror(errno));
join_path_components(arclog_path_dir, backup_path, "wal"); join_path_components(arclog_path_dir, backup_path, "wal");
dir_create_dir(arclog_path_dir, DIR_PERMISSION); dir_create_dir(arclog_path_dir, DIR_PERMISSION);

View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
/* members of struct parray are hidden from client. */ /* members of struct parray are hidden from client. */
struct parray struct parray

View File

@ -11,7 +11,7 @@
#include "postgres_fe.h" #include "postgres_fe.h"
#include "pg_arman.h" #include "pg_probackup.h"
#include <unistd.h> #include <unistd.h>

View File

@ -1,266 +0,0 @@
/*-------------------------------------------------------------------------
*
* pg_arman.c: Backup/Recovery manager for PostgreSQL.
*
* Copyright (c) 2009-2013, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
*
*-------------------------------------------------------------------------
*/
#include "pg_arman.h"
#include "streamutil.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
const char *PROGRAM_VERSION = "0.1";
const char *PROGRAM_URL = "https://github.com/stalkerg/pg_arman";
const char *PROGRAM_EMAIL = "https://github.com/stalkerg/pg_arman/issues";
/* path configuration */
char *backup_path;
char *pgdata;
char arclog_path[MAXPGPATH];
/* common configuration */
bool check = false;
/* directory configuration */
pgBackup current;
/* backup configuration */
static bool smooth_checkpoint;
static int keep_data_generations = KEEP_INFINITE;
static int keep_data_days = KEEP_INFINITE;
int num_threads = 1;
bool stream_wal = false;
bool from_replica = false;
static bool backup_logs = false;
bool progress = false;
bool delete_wal = false;
/* restore configuration */
static char *target_time;
static char *target_xid;
static char *target_inclusive;
static TimeLineID target_tli;
/* show configuration */
static bool show_all = false;
static void opt_backup_mode(pgut_option *opt, const char *arg);
static pgut_option options[] =
{
/* directory options */
{ 's', 'D', "pgdata", &pgdata, SOURCE_ENV },
{ 's', 'B', "backup-path", &backup_path, SOURCE_ENV },
/* common options */
/* { 'b', 'c', "check", &check },*/
{ 'i', 'j', "threads", &num_threads },
{ 'b', 8, "stream", &stream_wal },
{ 'b', 11, "progress", &progress },
/* backup options */
{ 'b', 10, "backup-pg-log", &backup_logs },
{ 'f', 'b', "backup-mode", opt_backup_mode, SOURCE_ENV },
{ 'b', 'C', "smooth-checkpoint", &smooth_checkpoint, SOURCE_ENV },
{ 's', 'S', "slot", &replication_slot, SOURCE_ENV },
/* options with only long name (keep-xxx) */
/* { 'i', 1, "keep-data-generations", &keep_data_generations, SOURCE_ENV },
{ 'i', 2, "keep-data-days", &keep_data_days, SOURCE_ENV },*/
/* restore options */
{ 's', 3, "time", &target_time, SOURCE_ENV },
{ 's', 4, "xid", &target_xid, SOURCE_ENV },
{ 's', 5, "inclusive", &target_inclusive, SOURCE_ENV },
{ 'u', 6, "timeline", &target_tli, SOURCE_ENV },
/* catalog options */
{ 'b', 'a', "show-all", &show_all },
/* delete options */
{ 'b', 12, "wal", &delete_wal },
{ 0 }
};
/*
* Entry point of pg_arman command.
*/
int
main(int argc, char *argv[])
{
const char *cmd = NULL;
const char *backup_id_string = NULL;
time_t backup_id = 0;
int i;
/* do not buffer progress messages */
setvbuf(stdout, 0, _IONBF, 0); /* TODO: remove this */
/* initialize configuration */
catalog_init_config(&current);
/* overwrite configuration with command line arguments */
i = pgut_getopt(argc, argv, options);
for (; i < argc; i++)
{
if (cmd == NULL)
{
cmd = argv[i];
if(strcmp(cmd, "show") != 0 &&
strcmp(cmd, "validate") != 0 &&
strcmp(cmd, "delete") != 0 &&
strcmp(cmd, "restore") != 0 &&
strcmp(cmd, "delwal") != 0)
break;
} else if (backup_id_string == NULL)
backup_id_string = argv[i];
else
elog(ERROR, "too many arguments");
}
/* command argument (backup/restore/show/...) is required. */
if (cmd == NULL)
{
help(false);
return 1;
}
if (backup_id_string != NULL)
{
backup_id = base36dec(backup_id_string);
if (backup_id == 0) {
elog(ERROR, "wrong ID");
}
}
/* Read default configuration from file. */
if (backup_path)
{
char path[MAXPGPATH];
/* Check if backup_path is directory. */
struct stat stat_buf;
int rc = stat(backup_path, &stat_buf);
/* If rc == -1, there is no file or directory. So it's OK. */
if (rc != -1 && !S_ISDIR(stat_buf.st_mode))
elog(ERROR, "-B, --backup-path must be a path to directory");
join_path_components(path, backup_path, PG_RMAN_INI_FILE);
pgut_readopt(path, options, ERROR);
/* setup stream options */
if (pgut_dbname != NULL)
dbname = pstrdup(pgut_dbname);
if (host != NULL)
dbhost = pstrdup(host);
if (port != NULL)
dbport = pstrdup(port);
if (username != NULL)
dbuser = pstrdup(username);
}
/* BACKUP_PATH is always required */
if (backup_path == NULL)
elog(ERROR, "required parameter not specified: BACKUP_PATH (-B, --backup-path)");
/* path must be absolute */
if (backup_path != NULL && !is_absolute_path(backup_path))
elog(ERROR, "-B, --backup-path must be an absolute path");
if (pgdata != NULL && !is_absolute_path(pgdata))
elog(ERROR, "-D, --pgdata must be an absolute path");
join_path_components(arclog_path, backup_path, "wal");
/* setup exclusion list for file search */
for (i = 0; pgdata_exclude[i]; i++); /* find first empty slot */
pgdata_exclude[i++] = arclog_path;
if(!backup_logs)
pgdata_exclude[i++] = "pg_log";
if (target_time != NULL && target_xid != NULL)
elog(ERROR, "You can't specify recovery-target-time and recovery-target-xid at the same time");
/* do actual operation */
if (pg_strcasecmp(cmd, "init") == 0)
return do_init();
else if (pg_strcasecmp(cmd, "backup") == 0)
{
pgBackupOption bkupopt;
int res;
bkupopt.smooth_checkpoint = smooth_checkpoint;
bkupopt.keep_data_generations = keep_data_generations;
bkupopt.keep_data_days = keep_data_days;
/* Do the backup */
res = do_backup(bkupopt);
if (res != 0)
return res;
do_validate(current.start_time);
}
else if (pg_strcasecmp(cmd, "restore") == 0)
return do_restore(backup_id, target_time, target_xid,
target_inclusive, target_tli);
else if (pg_strcasecmp(cmd, "show") == 0)
return do_show(backup_id, show_all);
else if (pg_strcasecmp(cmd, "validate") == 0)
return do_validate(backup_id);
else if (pg_strcasecmp(cmd, "delete") == 0)
return do_delete(backup_id);
else if (pg_strcasecmp(cmd, "delwal") == 0)
return do_deletewal(backup_id, true);
else
elog(ERROR, "invalid command \"%s\"", cmd);
return 0;
}
void
pgut_help(bool details)
{
printf(_("%s manage backup/recovery of PostgreSQL database.\n\n"), PROGRAM_NAME);
printf(_("Usage:\n"));
printf(_(" %s OPTION init\n"), PROGRAM_NAME);
printf(_(" %s OPTION backup\n"), PROGRAM_NAME);
printf(_(" %s OPTION restore\n"), PROGRAM_NAME);
printf(_(" %s OPTION show [ID]\n"), PROGRAM_NAME);
printf(_(" %s OPTION validate [ID]\n"), PROGRAM_NAME);
printf(_(" %s OPTION delete ID\n"), PROGRAM_NAME);
printf(_(" %s OPTION delwal [ID]\n"), PROGRAM_NAME);
if (!details)
return;
printf(_("\nCommon Options:\n"));
printf(_(" -D, --pgdata=PATH location of the database storage area\n"));
printf(_(" -B, --backup-path=PATH location of the backup storage area\n"));
/*printf(_(" -c, --check show what would have been done\n"));*/
printf(_(" -j, --threads=NUM num threads for backup and restore\n"));
printf(_(" --progress show progress copy files\n"));
printf(_("\nBackup options:\n"));
printf(_(" -b, --backup-mode=MODE full,page,ptrack\n"));
printf(_(" -C, --smooth-checkpoint do smooth checkpoint before backup\n"));
printf(_(" --stream use stream for save/restore WAL during backup\n"));
/*printf(_(" --keep-data-generations=N keep GENERATION of full data backup\n"));
printf(_(" --keep-data-days=DAY keep enough data backup to recover to DAY days age\n"));*/
printf(_(" --backup-pg-log start backup pg_log directory\n"));
printf(_(" -S, --slot=SLOTNAME replication slot to use\n"));
printf(_("\nRestore options:\n"));
printf(_(" --time time stamp up to which recovery will proceed\n"));
printf(_(" --xid transaction ID up to which recovery will proceed\n"));
printf(_(" --inclusive whether we stop just after the recovery target\n"));
printf(_(" --timeline recovering into a particular timeline\n"));
printf(_("\nCatalog options:\n"));
printf(_(" -a, --show-all show deleted backup too\n"));
printf(_("\nDelete options:\n"));
printf(_(" --wal remove unnecessary wal archives also\n"));
}
static void
opt_backup_mode(pgut_option *opt, const char *arg)
{
current.backup_mode = parse_backup_mode(arg);
}

View File

@ -1,317 +0,0 @@
/*-------------------------------------------------------------------------
*
* pg_arman.h: Backup/Recovery manager for PostgreSQL.
*
* Copyright (c) 2009-2013, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
*
*-------------------------------------------------------------------------
*/
#ifndef PG_RMAN_H
#define PG_RMAN_H
#include "postgres_fe.h"
#include <limits.h>
#include "libpq-fe.h"
#include "pgut/pgut.h"
#include "access/xlogdefs.h"
#include "access/xlog_internal.h"
#include "catalog/pg_control.h"
#include "utils/pg_crc.h"
#include "parray.h"
#include "datapagemap.h"
#include "storage/bufpage.h"
#include "storage/block.h"
#include "storage/checksum.h"
/* Query to fetch current transaction ID */
#define TXID_CURRENT_SQL "SELECT txid_current();"
#define TXID_CURRENT_IF_SQL "SELECT txid_snapshot_xmax(txid_current_snapshot());"
/* Directory/File names */
#define DATABASE_DIR "database"
#define BACKUPS_DIR "backups"
#define PG_XLOG_DIR "pg_xlog"
#define PG_TBLSPC_DIR "pg_tblspc"
#define BACKUP_INI_FILE "backup.ini"
#define PG_RMAN_INI_FILE "pg_arman.ini"
#define MKDIRS_SH_FILE "mkdirs.sh"
#define DATABASE_FILE_LIST "file_database.txt"
#define PG_BACKUP_LABEL_FILE "backup_label"
#define PG_BLACK_LIST "black_list"
/* Direcotry/File permission */
#define DIR_PERMISSION (0700)
#define FILE_PERMISSION (0600)
/* backup mode file */
typedef struct pgFile
{
time_t mtime; /* time of last modification */
mode_t mode; /* protection (file type and permission) */
size_t size; /* size of the file */
size_t read_size; /* size of the portion read (if only some pages are
backed up partially, it's different from size) */
size_t write_size; /* size of the backed-up file. BYTES_INVALID means
that the file existed but was not backed up
because not modified since last backup. */
pg_crc32 crc; /* CRC value of the file, regular file only */
char *linked; /* path of the linked file */
bool is_datafile; /* true if the file is PostgreSQL data file */
char *path; /* path of the file */
char *ptrack_path;
int segno; /* Segment number for ptrack */
volatile uint32 lock;
datapagemap_t pagemap;
} pgFile;
#define IsValidTime(tm) \
((tm.tm_sec >= 0 && tm.tm_sec <= 60) && /* range check for tm_sec (0-60) */ \
(tm.tm_min >= 0 && tm.tm_min <= 59) && /* range check for tm_min (0-59) */ \
(tm.tm_hour >= 0 && tm.tm_hour <= 23) && /* range check for tm_hour(0-23) */ \
(tm.tm_mday >= 1 && tm.tm_mday <= 31) && /* range check for tm_mday(1-31) */ \
(tm.tm_mon >= 0 && tm.tm_mon <= 11) && /* range check for tm_mon (0-23) */ \
(tm.tm_year + 1900 >= 1900)) /* range check for tm_year(70-) */
/* Effective data size */
#define MAPSIZE (BLCKSZ - MAXALIGN(SizeOfPageHeaderData))
/* Backup status */
/* XXX re-order ? */
typedef enum BackupStatus
{
BACKUP_STATUS_INVALID, /* the pgBackup is invalid */
BACKUP_STATUS_OK, /* completed backup */
BACKUP_STATUS_RUNNING, /* running backup */
BACKUP_STATUS_ERROR, /* aborted because of unexpected error */
BACKUP_STATUS_DELETING, /* data files are being deleted */
BACKUP_STATUS_DELETED, /* data files have been deleted */
BACKUP_STATUS_DONE, /* completed but not validated yet */
BACKUP_STATUS_CORRUPT /* files are corrupted, not available */
} BackupStatus;
typedef enum BackupMode
{
BACKUP_MODE_INVALID,
BACKUP_MODE_DIFF_PAGE, /* differential page backup */
BACKUP_MODE_DIFF_PTRACK, /* differential page backup with ptrack system*/
BACKUP_MODE_FULL /* full backup */
} BackupMode;
/*
* pg_arman takes backup into the directroy $BACKUP_PATH/<date>/<time>.
*
* status == -1 indicates the pgBackup is invalid.
*/
typedef struct pgBackup
{
/* Backup Level */
BackupMode backup_mode;
/* Status - one of BACKUP_STATUS_xxx */
BackupStatus status;
/* Timestamp, etc. */
TimeLineID tli;
XLogRecPtr start_lsn;
XLogRecPtr stop_lsn;
time_t start_time;
time_t end_time;
time_t recovery_time;
uint32 recovery_xid;
/* Different sizes (-1 means nothing was backed up) */
/*
* Amount of raw data. For a full backup, this is the total amount of
* data while for a differential backup this is just the difference
* of data taken.
*/
int64 data_bytes;
/* data/wal block size for compatibility check */
uint32 block_size;
uint32 wal_block_size;
uint32 checksum_version;
bool stream;
} pgBackup;
typedef struct pgBackupOption
{
bool smooth_checkpoint;
int keep_data_generations;
int keep_data_days;
} pgBackupOption;
/* special values of pgBackup */
#define KEEP_INFINITE (INT_MAX)
#define BYTES_INVALID (-1)
typedef struct pgTimeLine
{
TimeLineID tli;
XLogRecPtr end;
} pgTimeLine;
typedef struct pgRecoveryTarget
{
bool time_specified;
time_t recovery_target_time;
bool xid_specified;
unsigned int recovery_target_xid;
bool recovery_target_inclusive;
} pgRecoveryTarget;
typedef union DataPage
{
PageHeaderData page_data;
char data[BLCKSZ];
} DataPage;
/*
* return pointer that exceeds the length of prefix from character string.
* ex. str="/xxx/yyy/zzz", prefix="/xxx/yyy", return="zzz".
*/
#define JoinPathEnd(str, prefix) \
((strlen(str) <= strlen(prefix)) ? "" : str + strlen(prefix) + 1)
/*
* Return timeline, xlog ID and record offset from an LSN of the type
* 0/B000188, usual result from pg_stop_backup() and friends.
*/
#define XLogDataFromLSN(data, xlogid, xrecoff) \
sscanf(data, "%X/%X", xlogid, xrecoff)
/* path configuration */
extern char *backup_path;
extern char *pgdata;
extern char arclog_path[MAXPGPATH];
/* common configuration */
extern bool check;
/* current settings */
extern pgBackup current;
/* exclude directory list for $PGDATA file listing */
extern const char *pgdata_exclude[];
/* backup file list from non-snapshot */
extern parray *backup_files_list;
extern int num_threads;
extern bool stream_wal;
extern bool from_replica;
extern bool progress;
extern bool delete_wal;
/* in backup.c */
extern int do_backup(pgBackupOption bkupopt);
extern BackupMode parse_backup_mode(const char *value);
extern void check_server_version(void);
extern bool fileExists(const char *path);
extern void process_block_change(ForkNumber forknum, RelFileNode rnode,
BlockNumber blkno);
/* in restore.c */
extern int do_restore(time_t backup_id,
const char *target_time,
const char *target_xid,
const char *target_inclusive,
TimeLineID target_tli);
/* in init.c */
extern int do_init(void);
/* in show.c */
extern int do_show(time_t backup_id, bool show_all);
/* in delete.c */
extern int do_delete(time_t backup_id);
extern void pgBackupDelete(int keep_generations, int keep_days);
extern int do_deletewal(time_t backup_id, bool strict);
/* in fetch.c */
extern char *slurpFile(const char *datadir,
const char *path,
size_t *filesize,
bool safe);
/* in validate.c */
extern int do_validate(time_t backup_id);
extern void pgBackupValidate(pgBackup *backup,
bool size_only,
bool for_get_timeline);
/* in catalog.c */
extern pgBackup *catalog_get_backup(time_t timestamp);
extern parray *catalog_get_backup_list(time_t backup_id);
extern pgBackup *catalog_get_last_data_backup(parray *backup_list,
TimeLineID tli);
extern int catalog_lock(void);
extern void catalog_unlock(void);
extern void catalog_init_config(pgBackup *backup);
extern void pgBackupWriteConfigSection(FILE *out, pgBackup *backup);
extern void pgBackupWriteResultSection(FILE *out, pgBackup *backup);
extern void pgBackupWriteIni(pgBackup *backup);
extern void pgBackupGetPath(const pgBackup *backup, char *path, size_t len, const char *subdir);
extern int pgBackupCreateDir(pgBackup *backup);
extern void pgBackupFree(void *backup);
extern int pgBackupCompareId(const void *f1, const void *f2);
extern int pgBackupCompareIdDesc(const void *f1, const void *f2);
/* in dir.c */
extern void dir_list_file(parray *files, const char *root, const char *exclude[], bool omit_symlink, bool add_root);
extern void dir_list_file_internal(parray *files, const char *root, const char *exclude[],
bool omit_symlink, bool add_root, parray *black_list);
extern void dir_print_mkdirs_sh(FILE *out, const parray *files, const char *root);
extern void dir_print_file_list(FILE *out, const parray *files, const char *root, const char *prefix);
extern parray *dir_read_file_list(const char *root, const char *file_txt);
extern int dir_create_dir(const char *path, mode_t mode);
extern void dir_copy_files(const char *from_root, const char *to_root);
extern pgFile *pgFileNew(const char *path, bool omit_symlink);
extern void pgFileDelete(pgFile *file);
extern void pgFileFree(void *file);
extern pg_crc32 pgFileGetCRC(pgFile *file);
extern int pgFileComparePath(const void *f1, const void *f2);
extern int pgFileComparePathDesc(const void *f1, const void *f2);
extern int pgFileCompareSize(const void *f1, const void *f2);
extern int pgFileCompareMtime(const void *f1, const void *f2);
extern int pgFileCompareMtimeDesc(const void *f1, const void *f2);
/* in data.c */
extern bool backup_data_file(const char *from_root, const char *to_root,
pgFile *file, const XLogRecPtr *lsn);
extern void restore_data_file(const char *from_root, const char *to_root,
pgFile *file, pgBackup *backup);
extern bool copy_file(const char *from_root, const char *to_root,
pgFile *file);
extern bool calc_file(pgFile *file);
/* parsexlog.c */
extern void extractPageMap(const char *datadir, XLogRecPtr startpoint,
TimeLineID tli, XLogRecPtr endpoint);
/* in util.c */
extern TimeLineID get_current_timeline(bool safe);
extern void sanityChecks(void);
extern void time2iso(char *buf, size_t len, time_t time);
extern const char *status2str(BackupStatus status);
extern void remove_trailing_space(char *buf, int comment_mark);
extern void remove_not_digit(char *buf, size_t len, const char *str);
extern XLogRecPtr get_last_ptrack_lsn(void);
extern uint32 get_data_checksum_version(bool safe);
extern char *base36enc(long unsigned int value);
extern long unsigned int base36dec(const char *text);
/* in status.c */
extern bool is_pg_running(void);
#endif /* PG_RMAN_H */

View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -84,7 +84,7 @@ do_restore(time_t backup_id,
elog(ERROR, "cannot lock backup catalog."); elog(ERROR, "cannot lock backup catalog.");
else if (ret == 1) else if (ret == 1)
elog(ERROR, elog(ERROR,
"another pg_arman is running, stop restore."); "another pg_probackup is running, stop restore.");
/* confirm the PostgreSQL server is not running */ /* confirm the PostgreSQL server is not running */
if (is_pg_running()) if (is_pg_running())
@ -484,7 +484,7 @@ create_recovery_conf(time_t backup_id,
elog(ERROR, "cannot open recovery.conf \"%s\": %s", path, elog(ERROR, "cannot open recovery.conf \"%s\": %s", path,
strerror(errno)); strerror(errno));
fprintf(fp, "# recovery.conf generated by pg_arman %s\n", fprintf(fp, "# recovery.conf generated by pg_probackup %s\n",
PROGRAM_VERSION); PROGRAM_VERSION);
fprintf(fp, "restore_command = 'cp %s/%%f %%p'\n", arclog_path); fprintf(fp, "restore_command = 'cp %s/%%f %%p'\n", arclog_path);

2
show.c
View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
static void show_backup_list(FILE *out, parray *backup_list, bool show_all); static void show_backup_list(FILE *out, parray *backup_list, bool show_all);
static void show_backup_detail(FILE *out, pgBackup *backup); static void show_backup_detail(FILE *out, pgBackup *backup);

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
#============================================================================ #============================================================================
# This is a test script for backup command of pg_arman. # This is a test script for backup command of pg_probackup.
#============================================================================ #============================================================================
# Load common rules # Load common rules
@ -11,37 +11,37 @@ init_backup
echo '###### BACKUP COMMAND TEST-0001 ######' echo '###### BACKUP COMMAND TEST-0001 ######'
echo '###### full backup mode ######' echo '###### full backup mode ######'
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0001-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0001-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0001-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0001-run.log 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001.log 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001.log 2>&1
grep -c OK ${TEST_BASE}/TEST-0001.log grep -c OK ${TEST_BASE}/TEST-0001.log
grep OK ${TEST_BASE}/TEST-0001.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' grep OK ${TEST_BASE}/TEST-0001.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'
echo '###### BACKUP COMMAND TEST-0002 ######' echo '###### BACKUP COMMAND TEST-0002 ######'
echo '###### page-level backup mode ######' echo '###### page-level backup mode ######'
pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0002-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0002-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0002-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0002-run.log 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002.log 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002.log 2>&1
grep -c OK ${TEST_BASE}/TEST-0002.log grep -c OK ${TEST_BASE}/TEST-0002.log
grep OK ${TEST_BASE}/TEST-0002.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' grep OK ${TEST_BASE}/TEST-0002.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'
echo '###### BACKUP COMMAND TEST-0003 ######' echo '###### BACKUP COMMAND TEST-0003 ######'
echo '###### full backup with smooth checkpoint ######' echo '###### full backup with smooth checkpoint ######'
init_catalog init_catalog
pg_arman backup -B ${BACKUP_PATH} -b full -C -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0003-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -C -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0003-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0003-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0003-run.log 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0003.log 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0003.log 2>&1
grep -c OK ${TEST_BASE}/TEST-0003.log grep -c OK ${TEST_BASE}/TEST-0003.log
grep OK ${TEST_BASE}/TEST-0003.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' grep OK ${TEST_BASE}/TEST-0003.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'
#echo '###### BACKUP COMMAND TEST-0004 ######' #echo '###### BACKUP COMMAND TEST-0004 ######'
#echo '###### full backup with keep-data-generations and keep-data-days ######' #echo '###### full backup with keep-data-generations and keep-data-days ######'
#init_catalog #init_catalog
#pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $? #pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $?
#pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $? #pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $?
#pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $? #pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $?
#pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1 #pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1
#pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0004-before.log 2>&1 #pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0004-before.log 2>&1
#NUM_OF_FULL_BACKUPS_BEFORE=`grep OK ${TEST_BASE}/TEST-0004-before.log | grep FULL | wc -l | sed 's/^ *//'` #NUM_OF_FULL_BACKUPS_BEFORE=`grep OK ${TEST_BASE}/TEST-0004-before.log | grep FULL | wc -l | sed 's/^ *//'`
#if [ ${NUM_OF_FULL_BACKUPS_BEFORE} -gt 2 ] ; then #if [ ${NUM_OF_FULL_BACKUPS_BEFORE} -gt 2 ] ; then
# echo "The number of existing full backups validated is greater than 2." # echo "The number of existing full backups validated is greater than 2."
@ -55,9 +55,9 @@ grep OK ${TEST_BASE}/TEST-0003.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'
## The actual value of NUM_OF_FULL_BACKUPS_BEFORE can vary on env, so commented out as default. ## The actual value of NUM_OF_FULL_BACKUPS_BEFORE can vary on env, so commented out as default.
##echo "Number of existing full backups validated: ${NUM_OF_FULL_BACKUPS_BEFORE}" ##echo "Number of existing full backups validated: ${NUM_OF_FULL_BACKUPS_BEFORE}"
#grep OK ${TEST_BASE}/TEST-0004-before.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' #grep OK ${TEST_BASE}/TEST-0004-before.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'
#pg_arman backup -B ${BACKUP_PATH} -b full --keep-data-days=-1 --keep-data-generations=1 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0005-run.log 2>&1;echo $? #pg_probackup backup -B ${BACKUP_PATH} -b full --keep-data-days=-1 --keep-data-generations=1 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0005-run.log 2>&1;echo $?
#pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0005-run.log 2>&1 #pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0005-run.log 2>&1
#pg_arman show --show-all -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0004-after.log 2>&1 #pg_probackup show --show-all -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0004-after.log 2>&1
#NUM_OF_FULL_BACKUPS_AFTER=`grep OK ${TEST_BASE}/TEST-0004-after.log | grep FULL | wc -l | sed 's/^ *//'` #NUM_OF_FULL_BACKUPS_AFTER=`grep OK ${TEST_BASE}/TEST-0004-after.log | grep FULL | wc -l | sed 's/^ *//'`
#echo "Number of remaining full backups validated: ${NUM_OF_FULL_BACKUPS_AFTER}" #echo "Number of remaining full backups validated: ${NUM_OF_FULL_BACKUPS_AFTER}"
#NUM_OF_DELETED_BACKUPS=`grep DELETED ${TEST_BASE}/TEST-0004-after.log | wc -l | sed 's/^ *//'` #NUM_OF_DELETED_BACKUPS=`grep DELETED ${TEST_BASE}/TEST-0004-after.log | wc -l | sed 's/^ *//'`
@ -68,42 +68,42 @@ echo '###### BACKUP COMMAND TEST-0005 ######'
echo '###### switch backup mode from page to full ######' echo '###### switch backup mode from page to full ######'
init_catalog init_catalog
echo 'page-level backup without validated full backup' echo 'page-level backup without validated full backup'
pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.log 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0005.log 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0005.log 2>&1
grep OK ${TEST_BASE}/TEST-0005.log | grep FULL | wc -l | sed 's/^ *//' grep OK ${TEST_BASE}/TEST-0005.log | grep FULL | wc -l | sed 's/^ *//'
grep ERROR ${TEST_BASE}/TEST-0005.log | grep INCR | wc -l | sed 's/^ *//' grep ERROR ${TEST_BASE}/TEST-0005.log | grep INCR | wc -l | sed 's/^ *//'
echo '###### BACKUP COMMAND TEST-0006 ######' echo '###### BACKUP COMMAND TEST-0006 ######'
echo '###### ptrack backup mode ######' echo '###### ptrack backup mode ######'
init_catalog init_catalog
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.log 2>&1
pg_arman backup -B ${BACKUP_PATH} -b ptrack -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0006-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0006-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0006-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0006-run.log 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0006.log 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0006.log 2>&1
grep -c OK ${TEST_BASE}/TEST-0006.log grep -c OK ${TEST_BASE}/TEST-0006.log
grep OK ${TEST_BASE}/TEST-0006.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' grep OK ${TEST_BASE}/TEST-0006.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'
echo '###### BACKUP COMMAND TEST-0007 ######' echo '###### BACKUP COMMAND TEST-0007 ######'
echo '###### ptrack multi thread backup mode ######' echo '###### ptrack multi thread backup mode ######'
init_catalog init_catalog
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0007-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0007-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.log 2>&1
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0007-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0007-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0007-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0007-run.log 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0007.log 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0007.log 2>&1
grep -c OK ${TEST_BASE}/TEST-0007.log grep -c OK ${TEST_BASE}/TEST-0007.log
grep OK ${TEST_BASE}/TEST-0007.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' grep OK ${TEST_BASE}/TEST-0007.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'
echo '###### BACKUP COMMAND TEST-0008 ######' echo '###### BACKUP COMMAND TEST-0008 ######'
echo '###### ptrack multi thread backup mode + stream ######' echo '###### ptrack multi thread backup mode + stream ######'
init_catalog init_catalog
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0008-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0008-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0008-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0008-run.log 2>&1
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0008-run.log 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0008-run.log 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0008-run.log 2>&1 pg_probackup validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0008-run.log 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0008.log 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0008.log 2>&1
grep -c OK ${TEST_BASE}/TEST-0008.log grep -c OK ${TEST_BASE}/TEST-0008.log
grep OK ${TEST_BASE}/TEST-0008.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' grep OK ${TEST_BASE}/TEST-0008.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//'

View File

@ -6,7 +6,7 @@
TEST_NAME=$1 TEST_NAME=$1
# Unset environment variables usable by both Postgres and pg_arman # Unset environment variables usable by both Postgres and pg_probackup
unset PGUSER unset PGUSER
unset PGPORT unset PGPORT
unset PGDATABASE unset PGDATABASE
@ -55,7 +55,7 @@ function cleanup()
function init_catalog() function init_catalog()
{ {
rm -fr ${BACKUP_PATH} rm -fr ${BACKUP_PATH}
pg_arman init -B ${BACKUP_PATH} --quiet pg_probackup init -B ${BACKUP_PATH} --quiet
} }
function init_backup() function init_backup()
@ -95,8 +95,8 @@ function get_time_last_backup()
name_os=`uname` name_os=`uname`
if [ "$name_os" == "SunOS" ] if [ "$name_os" == "SunOS" ]
then then
pg_arman -B ${BACKUP_PATH} show | gtail -n +4 | head -n 1 | awk '{print($1)}' pg_probackup -B ${BACKUP_PATH} show | gtail -n +4 | head -n 1 | awk '{print($1)}'
else else
pg_arman -B ${BACKUP_PATH} show | tail -n +4 | head -n 1 | awk '{print($1)}' pg_probackup -B ${BACKUP_PATH} show | tail -n +4 | head -n 1 | awk '{print($1)}'
fi fi
} }

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
#============================================================================ #============================================================================
# This is a test script for delete command of pg_arman. # This is a test script for delete command of pg_probackup.
#============================================================================ #============================================================================
# Load common rules # Load common rules
@ -10,20 +10,20 @@
init_backup init_backup
echo '###### DELETE COMMAND TEST-0001 ######' echo '###### DELETE COMMAND TEST-0001 ######'
echo '###### delete full backups ######' echo '###### delete full backups ######'
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet
FIRST_BACKUP_DATE=$(get_time_last_backup) FIRST_BACKUP_DATE=$(get_time_last_backup)
pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1 pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet
SECOND_BACKUP_DATE=$(get_time_last_backup) SECOND_BACKUP_DATE=$(get_time_last_backup)
pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1 pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet
THIRD_BACKUP_DATE=$(get_time_last_backup) THIRD_BACKUP_DATE=$(get_time_last_backup)
pg_arman validate -B ${BACKUP_PATH} --quiet pg_probackup validate -B ${BACKUP_PATH} --quiet
echo "try to delete the oldest backup" echo "try to delete the oldest backup"
pg_arman -B ${BACKUP_PATH} delete ${SECOND_BACKUP_DATE} > /dev/null 2>&1 pg_probackup -B ${BACKUP_PATH} delete ${SECOND_BACKUP_DATE} > /dev/null 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001.out.1 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001.out.1 2>&1
pg_arman show -a -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001.out.2 2>&1 pg_probackup show -a -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001.out.2 2>&1
grep -c OK ${TEST_BASE}/TEST-0001.out.1 grep -c OK ${TEST_BASE}/TEST-0001.out.1
grep -c DELETED ${TEST_BASE}/TEST-0001.out.2 grep -c DELETED ${TEST_BASE}/TEST-0001.out.2
NUM_OF_DELETED_BACKUPS=`grep DELETED ${TEST_BASE}/TEST-0001.out.2 | wc -l | sed 's/^ *//'` NUM_OF_DELETED_BACKUPS=`grep DELETED ${TEST_BASE}/TEST-0001.out.2 | wc -l | sed 's/^ *//'`
@ -32,24 +32,24 @@ echo "Number of deleted backups should be 1, is it so?: ${NUM_OF_DELETED_BACKUPS
init_backup init_backup
echo '###### DELETE COMMAND TEST-0002 ######' echo '###### DELETE COMMAND TEST-0002 ######'
echo '###### keep backups which are necessary for recovery ######' echo '###### keep backups which are necessary for recovery ######'
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet
FIRST_BACKUP_DATE=$(get_time_last_backup) FIRST_BACKUP_DATE=$(get_time_last_backup)
pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1 pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet
SECOND_BACKUP_DATE=$(get_time_last_backup) SECOND_BACKUP_DATE=$(get_time_last_backup)
pg_arman validate -B ${BACKUP_PATH} --quiet pg_probackup validate -B ${BACKUP_PATH} --quiet
pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1 pgbench -p ${TEST_PGPORT} >> ${TEST_BASE}/pgbench.log 2>&1
pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --quiet pg_probackup backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --quiet
THIRD_BACKUP_DATE=$(get_time_last_backup) THIRD_BACKUP_DATE=$(get_time_last_backup)
pg_arman validate -B ${BACKUP_PATH} --quiet pg_probackup validate -B ${BACKUP_PATH} --quiet
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet
FOURTH_BACKUP_DATE=$(get_time_last_backup) FOURTH_BACKUP_DATE=$(get_time_last_backup)
pg_arman validate -B ${BACKUP_PATH} --quiet pg_probackup validate -B ${BACKUP_PATH} --quiet
echo "try to delete before third backup" echo "try to delete before third backup"
pg_arman delete -B ${BACKUP_PATH} ${THIRD_BACKUP_DATE} > /dev/null 2>&1 pg_probackup delete -B ${BACKUP_PATH} ${THIRD_BACKUP_DATE} > /dev/null 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002.out.1 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002.out.1 2>&1
pg_arman show -a -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002.out.2 2>&1 pg_probackup show -a -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002.out.2 2>&1
grep -c OK ${TEST_BASE}/TEST-0002.out.1 grep -c OK ${TEST_BASE}/TEST-0002.out.1
grep -c DELETED ${TEST_BASE}/TEST-0002.out.2 grep -c DELETED ${TEST_BASE}/TEST-0002.out.2
NUM_OF_DELETED_BACKUPS=`grep DELETED ${TEST_BASE}/TEST-0002.out.2 | wc -l | sed 's/^ *//'` NUM_OF_DELETED_BACKUPS=`grep DELETED ${TEST_BASE}/TEST-0002.out.2 | wc -l | sed 's/^ *//'`

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
#============================================================================ #============================================================================
# This is a test script for init command of pg_arman. # This is a test script for init command of pg_probackup.
#============================================================================ #============================================================================
# Load common rules # Load common rules
@ -22,7 +22,7 @@ EOF
echo '###### INIT COMMAND TEST-0001 ######' echo '###### INIT COMMAND TEST-0001 ######'
echo '###### success with archive_command ######' echo '###### success with archive_command ######'
pg_arman -B ${BACKUP_PATH} init --quiet;echo $? pg_probackup -B ${BACKUP_PATH} init --quiet;echo $?
find results/init/backup | xargs ls -Fd | sort find results/init/backup | xargs ls -Fd | sort
echo '###### INIT COMMAND TEST-0002 ######' echo '###### INIT COMMAND TEST-0002 ######'
@ -35,7 +35,7 @@ archive_mode = on
archive_command = 'cp "%p" "${ARCLOG_PATH}/%f"' archive_command = 'cp "%p" "${ARCLOG_PATH}/%f"'
log_directory = '${SRVLOG_PATH}' log_directory = '${SRVLOG_PATH}'
EOF EOF
pg_arman -B ${BACKUP_PATH} init --quiet;echo $? pg_probackup -B ${BACKUP_PATH} init --quiet;echo $?
find results/init/backup | xargs ls -Fd | sort find results/init/backup | xargs ls -Fd | sort
echo '###### INIT COMMAND TEST-0003 ######' echo '###### INIT COMMAND TEST-0003 ######'
@ -47,18 +47,18 @@ wal_level = hot_standby
archive_mode = on archive_mode = on
log_directory = '${SRVLOG_PATH}' log_directory = '${SRVLOG_PATH}'
EOF EOF
pg_arman -B ${BACKUP_PATH} init --quiet;echo $? pg_probackup -B ${BACKUP_PATH} init --quiet;echo $?
find results/init/backup | xargs ls -Fd | sort find results/init/backup | xargs ls -Fd | sort
echo '###### INIT COMMAND TEST-0004 ######' echo '###### INIT COMMAND TEST-0004 ######'
echo '###### failure with backup catalog already existed ######' echo '###### failure with backup catalog already existed ######'
pg_arman -B ${BACKUP_PATH} init;echo $? pg_probackup -B ${BACKUP_PATH} init;echo $?
echo '' echo ''
echo '###### INIT COMMAND TEST-0005 ######' echo '###### INIT COMMAND TEST-0005 ######'
echo '###### failure with backup catalog should be given as absolute path ######' echo '###### failure with backup catalog should be given as absolute path ######'
rm -rf ${BACKUP_PATH} rm -rf ${BACKUP_PATH}
pg_arman --backup-path=resuts/init/backup init;echo $? pg_probackup --backup-path=resuts/init/backup init;echo $?
echo '' echo ''

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
#============================================================================ #============================================================================
# This is a test script for options of pg_arman. # This is a test script for options of pg_probackup.
#============================================================================ #============================================================================
# Load common rules # Load common rules
@ -11,77 +11,77 @@ cleanup
echo '###### COMMAND OPTION TEST-0001 ######' echo '###### COMMAND OPTION TEST-0001 ######'
echo '###### help option ######' echo '###### help option ######'
pg_arman --help;echo $? pg_probackup --help;echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0002 ######' echo '###### COMMAND OPTION TEST-0002 ######'
echo '###### version option ######' echo '###### version option ######'
pg_arman --version;echo $? pg_probackup --version;echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0003 ######' echo '###### COMMAND OPTION TEST-0003 ######'
echo '###### backup command failure without backup path option ######' echo '###### backup command failure without backup path option ######'
pg_arman backup -b full -p ${TEST_PGPORT};echo $? pg_probackup backup -b full -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0004 ######' echo '###### COMMAND OPTION TEST-0004 ######'
echo '###### backup command failure without backup mode option ######' echo '###### backup command failure without backup mode option ######'
pg_arman backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0005 ######' echo '###### COMMAND OPTION TEST-0005 ######'
echo '###### backup command failure with invalid backup mode option ######' echo '###### backup command failure with invalid backup mode option ######'
pg_arman backup -B ${BACKUP_PATH} -b bad -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -b bad -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0007 ######' echo '###### COMMAND OPTION TEST-0007 ######'
echo '###### delete failure without DATE ######' echo '###### delete failure without DATE ######'
pg_arman delete -B ${BACKUP_PATH};echo $? pg_probackup delete -B ${BACKUP_PATH};echo $?
echo '' echo ''
init_backup init_backup
echo '###### COMMAND OPTION TEST-0008 ######' echo '###### COMMAND OPTION TEST-0008 ######'
echo '###### syntax error in pg_arman.ini ######' echo '###### syntax error in pg_probackup.conf ######'
echo " = INFINITE" >> ${BACKUP_PATH}/pg_arman.ini echo " = INFINITE" >> ${BACKUP_PATH}/pg_probackup.conf
pg_arman backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0009 ######' echo '###### COMMAND OPTION TEST-0009 ######'
echo '###### invalid value in pg_arman.ini ######' echo '###### invalid value in pg_probackup.conf ######'
init_catalog init_catalog
echo "BACKUP_MODE=" >> ${BACKUP_PATH}/pg_arman.ini echo "BACKUP_MODE=" >> ${BACKUP_PATH}/pg_probackup.conf
pg_arman backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0010 ######' echo '###### COMMAND OPTION TEST-0010 ######'
echo '###### invalid value in pg_arman.ini ######' echo '###### invalid value in pg_probackup.conf ######'
init_catalog init_catalog
echo "KEEP_DATA_GENERATIONS=TRUE" >> ${BACKUP_PATH}/pg_arman.ini echo "KEEP_DATA_GENERATIONS=TRUE" >> ${BACKUP_PATH}/pg_probackup.conf
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0011 ######' echo '###### COMMAND OPTION TEST-0011 ######'
echo '###### invalid value in pg_arman.ini ######' echo '###### invalid value in pg_probackup.conf ######'
init_catalog init_catalog
echo "SMOOTH_CHECKPOINT=FOO" >> ${BACKUP_PATH}/pg_arman.ini echo "SMOOTH_CHECKPOINT=FOO" >> ${BACKUP_PATH}/pg_probackup.conf
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0012 ######' echo '###### COMMAND OPTION TEST-0012 ######'
echo '###### invalid option in pg_arman.ini ######' echo '###### invalid option in pg_probackup.conf ######'
init_catalog init_catalog
echo "TIMELINEID=1" >> ${BACKUP_PATH}/pg_arman.ini echo "TIMELINEID=1" >> ${BACKUP_PATH}/pg_probackup.conf
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT};echo $?
echo '' echo ''
echo '###### COMMAND OPTION TEST-0013 ######' echo '###### COMMAND OPTION TEST-0013 ######'
echo '###### check priority of several pg_arman.ini files ######' echo '###### check priority of several pg_probackup.conf files ######'
init_catalog init_catalog
mkdir -p ${BACKUP_PATH}/conf_path_a mkdir -p ${BACKUP_PATH}/conf_path_a
echo "BACKUP_MODE=ENV_PATH" > ${BACKUP_PATH}/pg_arman.ini echo "BACKUP_MODE=ENV_PATH" > ${BACKUP_PATH}/pg_probackup.conf
echo "BACKUP_MODE=ENV_PATH_A" > ${BACKUP_PATH}/conf_path_a/pg_arman.ini echo "BACKUP_MODE=ENV_PATH_A" > ${BACKUP_PATH}/conf_path_a/pg_probackup.conf
pg_arman backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $? pg_probackup backup -B ${BACKUP_PATH} -p ${TEST_PGPORT};echo $?
echo '' echo ''
# clean up the temporal test data # clean up the temporal test data

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
#============================================================================ #============================================================================
# This is a test script for restore command of pg_arman. # This is a test script for restore command of pg_probackup.
#============================================================================ #============================================================================
# Load common rules # Load common rules
@ -30,10 +30,10 @@ init_backup
pgbench_objs 0001 pgbench_objs 0001
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0001-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0001-before.out
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0001-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0001-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0001-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0001-run.out 2>&1
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} -j 4 --verbose >> ${TEST_BASE}/TEST-0001-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} -j 4 --verbose >> ${TEST_BASE}/TEST-0001-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0001-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0001-after.out
diff ${TEST_BASE}/TEST-0001-before.out ${TEST_BASE}/TEST-0001-after.out diff ${TEST_BASE}/TEST-0001-before.out ${TEST_BASE}/TEST-0001-after.out
@ -43,14 +43,14 @@ echo '###### RESTORE COMMAND TEST-0002 ######'
echo '###### recovery to latest from full + page backups ######' echo '###### recovery to latest from full + page backups ######'
init_backup init_backup
pgbench_objs 0002 pgbench_objs 0002
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0002-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0002-before.out
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} -j 4 --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} -j 4 --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0002-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0002-after.out
diff ${TEST_BASE}/TEST-0002-before.out ${TEST_BASE}/TEST-0002-after.out diff ${TEST_BASE}/TEST-0002-before.out ${TEST_BASE}/TEST-0002-after.out
@ -61,15 +61,15 @@ echo '###### recovery to target timeline ######'
init_backup init_backup
pgbench_objs 0003 pgbench_objs 0003
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0003-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0003-before.out
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1
TARGET_TLI=`pg_controldata | grep " TimeLineID:" | awk '{print $4}'` TARGET_TLI=`pg_controldata | grep " TimeLineID:" | awk '{print $4}'`
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --timeline=${TARGET_TLI} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --timeline=${TARGET_TLI} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $?
echo "checking recovery.conf..." echo "checking recovery.conf..."
TARGET_TLI_IN_RECOVERY_CONF=`grep "recovery_target_timeline = " ${PGDATA_PATH}/recovery.conf | awk '{print $3}' | sed -e "s/'//g"` TARGET_TLI_IN_RECOVERY_CONF=`grep "recovery_target_timeline = " ${PGDATA_PATH}/recovery.conf | awk '{print $3}' | sed -e "s/'//g"`
if [ ${TARGET_TLI} = ${TARGET_TLI_IN_RECOVERY_CONF} ]; then if [ ${TARGET_TLI} = ${TARGET_TLI_IN_RECOVERY_CONF} ]; then
@ -90,12 +90,12 @@ init_backup
pgbench_objs 0004 pgbench_objs 0004
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0004-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0004-before.out
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0004-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0004-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0004-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0004-run.out 2>&1
TARGET_TIME=`date +"%Y-%m-%d %H:%M:%S"` TARGET_TIME=`date +"%Y-%m-%d %H:%M:%S"`
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --time="${TARGET_TIME}" --verbose >> ${TEST_BASE}/TEST-0004-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --time="${TARGET_TIME}" --verbose >> ${TEST_BASE}/TEST-0004-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0004-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0004-after.out
diff ${TEST_BASE}/TEST-0004-before.out ${TEST_BASE}/TEST-0004-after.out diff ${TEST_BASE}/TEST-0004-before.out ${TEST_BASE}/TEST-0004-after.out
@ -106,8 +106,8 @@ echo '###### recovery to target XID ######'
init_backup init_backup
pgbench_objs 0005 pgbench_objs 0005
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "CREATE TABLE tbl0005 (a text);" > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "CREATE TABLE tbl0005 (a text);" > /dev/null 2>&1
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0005-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0005-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0005-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0005-run.out 2>&1
pgbench -p ${TEST_PGPORT} pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} pgbench > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0005-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0005-before.out
TARGET_XID=`psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -tAq -c "INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin);"` TARGET_XID=`psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -tAq -c "INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin);"`
@ -118,7 +118,7 @@ pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c 'SELECT pg_switch_xlog()' > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c 'SELECT pg_switch_xlog()' > /dev/null 2>&1
# Fast mode is used to ensure that the last segment is archived as well. # Fast mode is used to ensure that the last segment is archived as well.
pg_ctl stop -m fast > /dev/null 2>&1 pg_ctl stop -m fast > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --xid="${TARGET_XID}" --verbose >> ${TEST_BASE}/TEST-0005-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --xid="${TARGET_XID}" --verbose >> ${TEST_BASE}/TEST-0005-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0005-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0005-after.out
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM tbl0005;" > ${TEST_BASE}/TEST-0005-tbl.dump psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM tbl0005;" > ${TEST_BASE}/TEST-0005-tbl.dump
@ -136,14 +136,14 @@ echo '###### RESTORE COMMAND TEST-0006 ######'
echo '###### recovery to latest from full + ptrack backups ######' echo '###### recovery to latest from full + ptrack backups ######'
init_backup init_backup
pgbench_objs 0006 pgbench_objs 0006
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0006-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0006-before.out
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0006-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0006-after.out
diff ${TEST_BASE}/TEST-0006-before.out ${TEST_BASE}/TEST-0006-after.out diff ${TEST_BASE}/TEST-0006-before.out ${TEST_BASE}/TEST-0006-after.out
@ -153,18 +153,18 @@ echo '###### RESTORE COMMAND TEST-0007 ######'
echo '###### recovery to latest from full + ptrack + ptrack backups ######' echo '###### recovery to latest from full + ptrack + ptrack backups ######'
init_backup init_backup
pgbench_objs 0007 pgbench_objs 0007
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0007-show.out 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0007-show.out 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0007-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0007-before.out
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0007-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0007-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0007-after.out
diff ${TEST_BASE}/TEST-0007-before.out ${TEST_BASE}/TEST-0007-after.out diff ${TEST_BASE}/TEST-0007-before.out ${TEST_BASE}/TEST-0007-after.out
@ -174,14 +174,14 @@ echo '###### RESTORE COMMAND TEST-0011 ######'
echo '###### recovery in stream mode to latest from full + ptrack backups ######' echo '###### recovery in stream mode to latest from full + ptrack backups ######'
init_backup init_backup
pgbench_objs 0006 pgbench_objs 0006
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0011-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0011-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1
pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 --stream -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0011-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0011-before.out
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --stream --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --stream --verbose >> ${TEST_BASE}/TEST-0011-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
sleep 5 sleep 5
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0011-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0011-after.out
@ -192,17 +192,17 @@ echo '###### RESTORE COMMAND TEST-0010 ######'
echo '###### recovery to latest from full + page backups with loads when ptrack backup do ######' echo '###### recovery to latest from full + page backups with loads when ptrack backup do ######'
init_backup init_backup
pgbench_objs 0010 pgbench_objs 0010
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0010-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0010-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1
pgbench -p ${TEST_PGPORT} -d pgbench -c 4 -T 8 > /dev/null 2>&1 & pgbench -p ${TEST_PGPORT} -d pgbench -c 4 -T 8 > /dev/null 2>&1 &
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1
sleep 12 sleep 12
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0010-count1.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0010-count1.out
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0010-count2.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0010-count2.out
diff ${TEST_BASE}/TEST-0010-count1.out ${TEST_BASE}/TEST-0010-count2.out diff ${TEST_BASE}/TEST-0010-count1.out ${TEST_BASE}/TEST-0010-count2.out
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0010-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0010-count1.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0010-count1.out
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0010-count2.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0010-count2.out
@ -217,18 +217,18 @@ init_backup
pgbench_objs 0009 pgbench_objs 0009
pgbench -p ${TEST_PGPORT} -d pgbench -c 4 -T 8 > /dev/null 2>&1 & pgbench -p ${TEST_PGPORT} -d pgbench -c 4 -T 8 > /dev/null 2>&1 &
#PGBENCH_PID=$! #PGBENCH_PID=$!
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0009-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0009-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1
#kill $PGBENCH_PID 2> /dev/null #kill $PGBENCH_PID 2> /dev/null
sleep 12 sleep 12
#psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT count(*) FROM pgbench_history;" > ${TEST_BASE}/TEST-0009-count1.out #psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT count(*) FROM pgbench_history;" > ${TEST_BASE}/TEST-0009-count1.out
pg_arman backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b ptrack -j 4 -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0009-count1.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0009-count1.out
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0009-count2.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0009-count2.out
diff ${TEST_BASE}/TEST-0009-count1.out ${TEST_BASE}/TEST-0009-count2.out diff ${TEST_BASE}/TEST-0009-count1.out ${TEST_BASE}/TEST-0009-count2.out
pg_ctl stop -m immediate > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0009-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0009-count1.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(bbalance) FROM pgbench_branches;" > ${TEST_BASE}/TEST-0009-count1.out
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0009-count2.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT sum(delta) FROM pgbench_history;" > ${TEST_BASE}/TEST-0009-count2.out
@ -240,8 +240,8 @@ echo '###### recovery with target inclusive false ######'
init_backup init_backup
pgbench_objs 0008 pgbench_objs 0008
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "CREATE TABLE tbl0008 (a text);" > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "CREATE TABLE tbl0008 (a text);" > /dev/null 2>&1
pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0008-run.out 2>&1;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0008-run.out 2>&1;echo $?
pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1 pg_probackup validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1
pgbench -p ${TEST_PGPORT} pgbench > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} pgbench > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0008-before.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0008-before.out
TARGET_XID=`psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -tAq -c "INSERT INTO tbl0008 VALUES ('inserted') RETURNING (xmin);"` TARGET_XID=`psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -tAq -c "INSERT INTO tbl0008 VALUES ('inserted') RETURNING (xmin);"`
@ -252,7 +252,7 @@ pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c 'SELECT pg_switch_xlog()' > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c 'SELECT pg_switch_xlog()' > /dev/null 2>&1
# Fast mode is used to ensure that the last segment is archived as well. # Fast mode is used to ensure that the last segment is archived as well.
pg_ctl stop -m fast > /dev/null 2>&1 pg_ctl stop -m fast > /dev/null 2>&1
pg_arman restore -B ${BACKUP_PATH} --xid="${TARGET_XID}" --inclusive=false --verbose >> ${TEST_BASE}/TEST-0008-run.out 2>&1;echo $? pg_probackup restore -B ${BACKUP_PATH} --xid="${TARGET_XID}" --inclusive=false --verbose >> ${TEST_BASE}/TEST-0008-run.out 2>&1;echo $?
pg_ctl start -w -t 600 > /dev/null 2>&1 pg_ctl start -w -t 600 > /dev/null 2>&1
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0008-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0008-after.out
psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM tbl0008;" > ${TEST_BASE}/TEST-0008-tbl.dump psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM tbl0008;" > ${TEST_BASE}/TEST-0008-tbl.dump

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
#============================================================================ #============================================================================
# This is a test script for show command of pg_arman. # This is a test script for show command of pg_probackup.
#============================================================================ #============================================================================
# Load common rules # Load common rules
@ -11,15 +11,15 @@ init_backup
echo '###### SHOW COMMAND TEST-0001 ######' echo '###### SHOW COMMAND TEST-0001 ######'
echo '###### Status DONE and OK ######' echo '###### Status DONE and OK ######'
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $?
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001-show.out.1 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001-show.out.1 2>&1
if grep "DONE" ${TEST_BASE}/TEST-0001-show.out.1 > /dev/null ; then if grep "DONE" ${TEST_BASE}/TEST-0001-show.out.1 > /dev/null ; then
echo 'OK: DONE status is shown properly.' echo 'OK: DONE status is shown properly.'
else else
echo 'NG: DONE status is not shown.' echo 'NG: DONE status is not shown.'
fi fi
pg_arman validate -B ${BACKUP_PATH} --quiet;echo $? pg_probackup validate -B ${BACKUP_PATH} --quiet;echo $?
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001-show.out.2 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001-show.out.2 2>&1
if grep "OK" ${TEST_BASE}/TEST-0001-show.out.2 > /dev/null ; then if grep "OK" ${TEST_BASE}/TEST-0001-show.out.2 > /dev/null ; then
echo 'OK: OK status is shown properly.' echo 'OK: OK status is shown properly.'
else else
@ -30,9 +30,9 @@ echo ''
echo '###### SHOW COMMAND TEST-0002 ######' echo '###### SHOW COMMAND TEST-0002 ######'
echo '###### Status RUNNING ######' echo '###### Status RUNNING ######'
init_catalog init_catalog
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet & pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet &
sleep 1 sleep 1
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002-show.out 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002-show.out 2>&1
if grep "RUNNING" ${TEST_BASE}/TEST-0002-show.out > /dev/null ; then if grep "RUNNING" ${TEST_BASE}/TEST-0002-show.out > /dev/null ; then
echo 'OK: RUNNING status is shown properly.' echo 'OK: RUNNING status is shown properly.'
else else
@ -40,7 +40,7 @@ else
fi fi
counter=0 counter=0
# Wait for backup to finish properly before moving on to next test # Wait for backup to finish properly before moving on to next test
while [[ `pg_arman show -B ${BACKUP_PATH}` == *"RUNNING"* ]]; do while [[ `pg_probackup show -B ${BACKUP_PATH}` == *"RUNNING"* ]]; do
if [ $counter -gt 60 ] ; then if [ $counter -gt 60 ] ; then
echo "Backup took too long to finish" echo "Backup took too long to finish"
exit 1 exit 1
@ -53,11 +53,11 @@ echo ''
echo '###### SHOW COMMAND TEST-0003 ######' echo '###### SHOW COMMAND TEST-0003 ######'
echo '###### Status CORRUPT ######' echo '###### Status CORRUPT ######'
init_catalog init_catalog
pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? pg_probackup backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $?
echo 'remove a file from backup intentionally' echo 'remove a file from backup intentionally'
rm -f `find ${BACKUP_PATH} -name postgresql.conf` rm -f `find ${BACKUP_PATH} -name postgresql.conf`
pg_arman validate -B ${BACKUP_PATH} --quiet > /dev/null 2>&1;echo $? pg_probackup validate -B ${BACKUP_PATH} --quiet > /dev/null 2>&1;echo $?
pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0003-show.out 2>&1 pg_probackup show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0003-show.out 2>&1
if grep "CORRUPT" ${TEST_BASE}/TEST-0003-show.out > /dev/null ; then if grep "CORRUPT" ${TEST_BASE}/TEST-0003-show.out > /dev/null ; then
echo 'OK: CORRUPT status is shown properly.' echo 'OK: CORRUPT status is shown properly.'
else else

View File

@ -16,7 +16,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include "pg_arman.h" #include "pg_probackup.h"
/* PID can be negative for standalone backend */ /* PID can be negative for standalone backend */
typedef long pgpid_t; typedef long pgpid_t;

View File

@ -21,7 +21,7 @@ yum install -y wget
wget -k https://ftp.postgresql.org/pub/source/v$PGVERSION/postgresql-$PGVERSION.tar.gz -O postgresql.tar.gz wget -k https://ftp.postgresql.org/pub/source/v$PGVERSION/postgresql-$PGVERSION.tar.gz -O postgresql.tar.gz
tar xf postgresql.tar.gz tar xf postgresql.tar.gz
# install pg_arman # install pg_probackup
yum install -y https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm yum install -y https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm
yum install -y postgresql95-devel make gcc readline-devel openssl-devel pam-devel libxml2-devel libxslt-devel yum install -y postgresql95-devel make gcc readline-devel openssl-devel pam-devel libxml2-devel libxslt-devel
make top_srcdir=postgresql-$PGVERSION make top_srcdir=postgresql-$PGVERSION
@ -51,14 +51,14 @@ COUNT=$(psql -Atc "select count(*) from pgbench_accounts")
pgbench -s $PGBENCH_SCALE -T $PGBENCH_TIME -j 2 -c 10 & pgbench -s $PGBENCH_SCALE -T $PGBENCH_TIME -j 2 -c 10 &
# create backup # create backup
pg_arman init pg_probackup init
pg_arman backup -b full --disable-ptrack-clear --stream -v pg_probackup backup -b full --disable-ptrack-clear --stream -v
pg_arman show pg_probackup show
sleep $PGBENCH_TIME sleep $PGBENCH_TIME
# restore from backup # restore from backup
chown -R postgres:postgres $BACKUP_PATH chown -R postgres:postgres $BACKUP_PATH
su postgres -c "pg_arman restore -D $PGDATA2" su postgres -c "pg_probackup restore -D $PGDATA2"
# start backup server # start backup server
su postgres -c "/usr/pgsql-9.5/bin/pg_ctl stop -w -D $PGDATA" su postgres -c "/usr/pgsql-9.5/bin/pg_ctl stop -w -D $PGDATA"

2
util.c
View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <time.h> #include <time.h>

View File

@ -7,7 +7,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "pg_arman.h" #include "pg_probackup.h"
#include <sys/stat.h> #include <sys/stat.h>
@ -23,11 +23,11 @@ do_validate(time_t backup_id)
int i; int i;
parray *backup_list; parray *backup_list;
int ret; int ret;
bool another_pg_arman = false; bool another_pg_probackup = false;
ret = catalog_lock(); ret = catalog_lock();
if (ret == 1) if (ret == 1)
another_pg_arman = true; another_pg_probackup = true;
/* get backup list matches given range */ /* get backup list matches given range */
backup_list = catalog_get_backup_list(backup_id); backup_list = catalog_get_backup_list(backup_id);
@ -40,7 +40,7 @@ do_validate(time_t backup_id)
pgBackup *backup = (pgBackup *)parray_get(backup_list, i); pgBackup *backup = (pgBackup *)parray_get(backup_list, i);
/* clean extra backups (switch STATUS to ERROR) */ /* clean extra backups (switch STATUS to ERROR) */
if (!another_pg_arman && if (!another_pg_probackup &&
(backup->status == BACKUP_STATUS_RUNNING || (backup->status == BACKUP_STATUS_RUNNING ||
backup->status == BACKUP_STATUS_DELETING)) backup->status == BACKUP_STATUS_DELETING))
{ {