diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index db7c8349148..c14ae430623 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -812,6 +812,16 @@ SELECT pg_stop_backup(); + + You can also use the tool to take + the backup, instead of manually copying the files. This tool will take + care of the pg_start_backup(), copy and + pg_stop_backup() steps automatically, and transfers the + backup over a regular PostgreSQL connection + using the replication protocol, instead of requiring filesystem level + access. + + Some file system backup tools emit warnings or errors if the files they are trying to copy change while the copy proceeds. diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 570c7c3b7de..bbfe86a6922 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1921,7 +1921,8 @@ SET ENABLE_SEQSCAN TO OFF; Specifies the maximum number of concurrent connections from standby - servers (i.e., the maximum number of simultaneously running WAL sender + servers or streaming base backup clients (i.e., the maximum number of + simultaneously running WAL sender processes). The default is zero. This parameter can only be set at server start. wal_level must be set to archive or hot_standby to allow connections from standby servers. diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 76c062fd516..73f26b432da 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -1460,7 +1460,7 @@ The commands accepted in walsender mode are: - BASE_BACKUP [LABEL 'label'] [PROGRESS] + BASE_BACKUP [LABEL 'label'] [PROGRESS] [FAST] Instructs the server to start streaming a base backup. @@ -1496,6 +1496,15 @@ The commands accepted in walsender mode are: + + + FAST + + + Request a fast checkpoint. + + + diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml index f40fa9dd8b2..c44d11ef91b 100644 --- a/doc/src/sgml/ref/allfiles.sgml +++ b/doc/src/sgml/ref/allfiles.sgml @@ -160,6 +160,7 @@ Complete list of usable sgml source files in this directory. + diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml new file mode 100644 index 00000000000..321c8cade1c --- /dev/null +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -0,0 +1,397 @@ + + + + + pg_basebackup + 1 + Application + + + + pg_basebackup + take a base backup of a PostgreSQL cluster + + + + pg_basebackup + + + + + pg_basebackup + option + + + + + + Description + + + pg_basebackup is used to take base backups of + a running PostgreSQL database cluster. These + are taken without affecting other clients to the database, and can be used + both for point-in-time recovery (see ) + and as the starting point for a log shipping or streaming replication standby + servers (see ). + + + + pg_basebackup makes a binary copy of the database + cluster files, while making sure the system is automatically put in and + out of backup mode automatically. Backups are always taken of the entire + database cluster, it is not possible to back up individual databases or + database objects. For individual database backups, a tool such as + must be used. + + + + The backup is made over a regular PostgreSQL + connection, and uses the replication protocol. The connection must be + made with a user having REPLICATION permissions (see + ), and the user must be granted explicit + permissions in pg_hba.conf. The server must also + be configured with set high enough + to leave at least one session available for the backup. + + + + Only one backup can be concurrently active in + PostgreSQL, meaning that only one instance of + pg_basebackup can run at the same time + against a single database cluster. + + + + + Options + + + The following command-line options control the location and format of the + output. + + + + + + + + Directory to write the output to. + + + When the backup is in tar mode, and the directory is specified as + - (dash), the tar file will be written to + stdout. + + + This parameter is required. + + + + + + + + + + Selects the format for the output. format + can be one of the following: + + + + p + plain + + + Write the output as plain files, with the same layout as the + current data directory and tablespaces. When the cluster has + no additional tablespaces, the whole database will be placed in + the target directory. If the cluster contains additional + tablespaces, the main data directory will be placed in the + target directory, but all other tablespaces will be placed + in the same absolute path as they have on the server. + + + This is the default format. + + + + + + t + tar + + + Write the output as tar files in the target directory. The main + data directory will be written to a file named + base.tar, and all other tablespaces will + be named after the tablespace oid. + + + If the value - (dash) is specified as + target directory, the tar contents will be written to + standard output, suitable for piping to for example + gzip. This is only possible if + the cluster has no additional tablespaces. + + + + + + + + + + + + + + Enables gzip compression of tar file output. Compression is only + available when generating tar files, and is not available when sending + output to standard output. + + + + + + + The following command-line options control the generation of the + backup and the running of the program. + + + + + + + + Sets checkpoint mode to fast or spread (default). + + + + + + + + + + Sets the label for the backup. If none is specified, a default value of + pg_basebackup base backup will be used. + + + + + + + + + + Enables progress reporting. Turning this on will deliver an approximate + progress report during the backup. Since the database may change during + the backup, this is only an approximation and may not end at exactly + 100%. + + + When this is enabled, the backup will start by enumerating the size of + the entire database, and then go back and send the actual contents. + This may make the backup take slightly longer, and in particular it + will take longer before the first data is sent. + + + + + + + + + + Enables verbose mode. Will output some extra steps during startup and + shutdown, as well as show the exact filename that is currently being + processed if progress reporting is also enabled. + + + + + + + + + The following command-line options control the database connection parameters. + + + + + + + + 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. The default is taken + from the PGHOST environment variable, if set, + else a Unix domain socket connection is attempted. + + + + + + + + + + Specifies the TCP port or local Unix domain socket file + extension on which the server is listening for connections. + Defaults to the PGPORT environment variable, if + set, or a compiled-in default. + + + + + + + + + + User name to connect as. + + + + + + + + + + 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. + + + + + + + + + + Force pg_basebackup to prompt for a + password before connecting to a database. + + + + This option is never essential, since + pg_bsaebackup will automatically prompt + for a password if the server demands password authentication. + However, pg_basebackup will waste a + connection attempt finding out that the server wants a password. + In some cases it is worth typing + + + + + + + Other, less commonly used, parameters are also available: + + + + + + + + Print the pg_basebackup version and exit. + + + + + + + + + + Show help about pg_basebackup command line + arguments, and exit. + + + + + + + + + + + Environment + + + This utility, like most other PostgreSQL utilities, + uses the environment variables supported by libpq + (see ). + + + + + + Notes + + + The backup will include all files in the data directory and tablespaces, + including the configuration files and any additional files placed in the + directory by third parties. Only regular files and directories are allowed + in the data directory, no symbolic links or special device files. + + + + The way PostgreSQL manages tablespaces, the path + for all additional tablespaces must be identical whenever a backup is + restored. The main data directory, however, is relocatable to any location. + + + + + Examples + + + To create a base backup of the server at mydbserver + and store it in the local directory + /usr/local/pgsql/data: + + $ pg_basebackup -h mydbserver -D /usr/local/pgsql/data + + + + + To create a backup of the local server with one maximum compressed + tar file for each tablespace, and store it in the directory + backup, showing a progress report while running: + + $ pg_basebackup -D backup -Ft -Z9 -P + + + + + To create a backup of a single-tablespace local database and compress + this with bzip2: + + $ pg_basebackup -D - -Ft | bzip2 > backup.tar.bz2 + + (this command will fail if there are multiple tablespaces in the + database) + + + + + See Also + + + + + + + diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml index 84babf61c00..6ee8e5bcff8 100644 --- a/doc/src/sgml/reference.sgml +++ b/doc/src/sgml/reference.sgml @@ -202,6 +202,7 @@ &droplang; &dropuser; &ecpgRef; + &pgBasebackup; &pgConfig; &pgDump; &pgDumpall; diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index b4d5bbe412e..943d80470bf 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -40,7 +40,7 @@ static void send_int8_string(StringInfoData *buf, int64 intval); static void SendBackupHeader(List *tablespaces); static void SendBackupDirectory(char *location, char *spcoid); static void base_backup_cleanup(int code, Datum arg); -static void perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir); +static void perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir, bool fastcheckpoint); typedef struct { @@ -67,9 +67,9 @@ base_backup_cleanup(int code, Datum arg) * clobbered by longjmp" from stupider versions of gcc. */ static void -perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir) +perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir, bool fastcheckpoint) { - do_pg_start_backup(backup_label, true); + do_pg_start_backup(backup_label, fastcheckpoint); PG_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0); { @@ -135,7 +135,7 @@ perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir) * pg_stop_backup() for the user. */ void -SendBaseBackup(const char *backup_label, bool progress) +SendBaseBackup(const char *backup_label, bool progress, bool fastcheckpoint) { DIR *dir; MemoryContext backup_context; @@ -168,7 +168,7 @@ SendBaseBackup(const char *backup_label, bool progress) ereport(ERROR, (errmsg("unable to open directory pg_tblspc: %m"))); - perform_base_backup(backup_label, progress, dir); + perform_base_backup(backup_label, progress, dir, fastcheckpoint); FreeDir(dir); @@ -333,7 +333,16 @@ sendDir(char *path, int basepathlen, bool sizeonly) if (strcmp(pathbuf, "./pg_xlog") == 0) { if (!sizeonly) + { + /* If pg_xlog is a symlink, write it as a directory anyway */ +#ifndef WIN32 + if (S_ISLNK(statbuf.st_mode)) +#else + if (pgwin32_is_junction(pathbuf)) +#endif + statbuf.st_mode = S_IFDIR | S_IRWXU; _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf); + } size += 512; /* Size of the header just added */ continue; /* don't recurse into pg_xlog */ } diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y index 0ef33ddb4f9..e4f4c4742f6 100644 --- a/src/backend/replication/repl_gram.y +++ b/src/backend/replication/repl_gram.y @@ -66,11 +66,12 @@ Node *replication_parse_result; %token K_IDENTIFY_SYSTEM %token K_LABEL %token K_PROGRESS +%token K_FAST %token K_START_REPLICATION %type command %type base_backup start_replication identify_system -%type opt_progress +%type opt_progress opt_fast %type opt_label %% @@ -102,15 +103,16 @@ identify_system: ; /* - * BASE_BACKUP [LABEL