1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-02-13 13:59:28 +02:00

Some cleanup in restore.

This commit is contained in:
David Steele 2014-12-23 11:48:51 -05:00
parent 2db71e91ad
commit 51544edc70
2 changed files with 34 additions and 32 deletions

View File

@ -185,6 +185,10 @@ In order to restore a backup, simply rsync the files from the base backup direct
It's best to practice restoring backups in advance of needing to do so.
[reference this when writing about tablespace remapping]
http://www.databasesoup.com/2013/11/moving-tablespaces.html
## configuration options
Each section defines important aspects of the backup. All configuration sections below should be prefixed with `global:` as demonstrated in the configuration samples.

View File

@ -11,9 +11,6 @@ use warnings;
use Carp;
use File::Basename;
#use File::Path qw(remove_tree);
#use Scalar::Util qw(looks_like_number);
#use Thread::Queue;
use lib dirname($0);
use BackRest::Utility;
@ -22,14 +19,11 @@ use BackRest::Config;
use BackRest::File;
####################################################################################################################################
# Global variables
# Module variables
####################################################################################################################################
# !!! Passing this to the threads does not work if it is created in the object - what's up with that?
my @oyThreadQueue;
my %oManifest;
my $oFile;
my $strBackupPath;
my $bSourceCompressed = false;
my @oyThreadQueue; # Queues to contain restore files
my %oManifest; # Manifest from the backup to restore
my $oFile; # File object to use for operations (also to clone for threads)
####################################################################################################################################
# CONSTRUCTOR
@ -38,7 +32,7 @@ sub new
{
my $class = shift; # Class name
my $strDbClusterPath = shift; # Database cluster path
my $strBackupPathParam = shift; # Backup to restore
my $strBackupPath = shift; # Backup to restore
my $oFileParam = shift; # Default file object
my $iThreadTotal = shift; # Total threads to run for restore
my $bForce = shift; # Force the restore even if files are present
@ -54,13 +48,13 @@ sub new
$self->{bForce} = $bForce;
# If backup path is not specified then default to latest
if (defined($strBackupPathParam))
if (defined($strBackupPath))
{
$strBackupPath = $strBackupPathParam;
$self->{strBackupPath} = $strBackupPath;
}
else
{
$strBackupPath = PATH_LATEST;
$self->{strBackupPath} = PATH_LATEST;
}
return $self;
@ -80,10 +74,10 @@ sub restore
}
# Make sure the backup path is valid and load the manifest
if ($oFile->exists(PATH_BACKUP_CLUSTER, $strBackupPath))
if ($oFile->exists(PATH_BACKUP_CLUSTER, $self->{strBackupPath}))
{
# Copy the backup manifest to the db cluster path
$oFile->copy(PATH_BACKUP_CLUSTER, $strBackupPath . '/' . FILE_MANIFEST,
$oFile->copy(PATH_BACKUP_CLUSTER, $self->{strBackupPath} . '/' . FILE_MANIFEST,
PATH_DB_ABSOLUTE, $self->{strDbClusterPath} . '/' . FILE_MANIFEST);
# Load the manifest into a hash
@ -91,16 +85,16 @@ sub restore
# Remove the manifest now that it is in memory
$oFile->remove(PATH_DB_ABSOLUTE, $self->{strDbClusterPath} . '/' . FILE_MANIFEST);
# Set source compression
if ($oManifest{'backup:option'}{compress} eq 'y')
{
$self->{bSourceCompressed} = true;
}
}
else
{
confess &log(ERROR, 'backup ' . $strBackupPath . ' does not exist');
}
# Set source compression
if ($oManifest{'backup:option'}{compress} eq 'y')
{
$bSourceCompressed = true;
confess &log(ERROR, 'backup ' . $self->{strBackupPath} . ' does not exist');
}
# Declare thread queues that will be used to process files
@ -214,7 +208,7 @@ sub restore
# Create the Path
$oFile->path_create(PATH_DB_ABSOLUTE, "${strPath}/${strName}",
$oManifest{"${strPathKey}:path"}{$strName}{permission});
$oManifest{"${strPathKey}:path"}{$strName}{permission});
}
# Create all links in the manifest that do not already exist
@ -225,7 +219,7 @@ sub restore
if (!$oFile->exists(PATH_DB_ABSOLUTE, "${strPath}/${strName}"))
{
$oFile->link_create(PATH_DB_ABSOLUTE, $oManifest{"${strPathKey}:link"}{$strName}{link_destination},
PATH_DB_ABSOLUTE, "${strPath}/${strName}");
PATH_DB_ABSOLUTE, "${strPath}/${strName}");
}
}
}
@ -250,8 +244,8 @@ sub restore
for (my $iThreadIdx = 0; $iThreadIdx < $self->{thread_total}; $iThreadIdx++)
{
# &log(INFO, "creating thread $iThreadIdx");
$oThreadGroup->add(threads->create(\&restore_thread, $iThreadIdx, $self->{thread_total}));
$oThreadGroup->add(threads->create(\&restore_thread, $iThreadIdx, $self->{thread_total}, $self->{strBackupPath},
$self->{bSourceCompressed}));
}
$oThreadGroup->complete();
@ -263,18 +257,20 @@ sub restore_thread
my $iThreadIdx = $args[0]; # Defines the index of this thread
my $iThreadTotal = $args[1]; # Total threads running
my $strBackupPath = $args[2]; # Backup to restore files from
my $bSourceCompressed = $args[3]; # Backup to restore files from
my $iDirection = $iThreadIdx % 2 == 0 ? 1 : -1; # Size of files currently copied by this thread
my $oFileThread = $oFile->clone($iThreadIdx); # Thread local file object
my $iDirection = $iThreadIdx % 2 == 0 ? 1 : -1; # Size of files currently copied by this thread
my $oFileThread = $oFile->clone($iThreadIdx); # Thread local file object
# Initialize the starting and current queue index
# Initialize the starting and current queue index based in the total number of threads in relation to this thread
my $iQueueStartIdx = int((@oyThreadQueue / $iThreadTotal) * $iThreadIdx);
my $iQueueIdx = $iQueueStartIdx;
# When a KILL signal is received, immediately abort
$SIG{'KILL'} = sub {threads->exit();};
# Loop through all the queues to restore files
# Loop through all the queues to restore files (exit when the original queue is reached
do
{
while (my $strMessage = $oyThreadQueue[$iQueueIdx]->dequeue())
@ -307,13 +303,15 @@ sub restore_thread
($bSourceCompressed ? '.' . $oFileThread->{strCompressExtension} : ''),
PATH_DB_ABSOLUTE, $strDestinationFile,
$bSourceCompressed, # Source is compressed based on backup settings
false, false,
undef, undef,
$oManifest{$strSection}{$strName}{modification_time},
$oManifest{$strSection}{$strName}{permission});
}
# Even number threads move up when they have finished a queue, odd numbered threads move down
$iQueueIdx += $iDirection;
# Reset the queue index when it goes over or under the number of queues
if ($iQueueIdx < 0)
{
$iQueueIdx = @oyThreadQueue - 1;