为了安全起见,备份perforce服务器目录下的所有文件是否足够?
发布于 2010-12-15 03:19:32
简短的回答是:不
长答案:关于Perforce数据的备份和恢复,您需要知道的所有内容都在Manual中进行了详细介绍。简而言之,对于不耐烦的人来说:
(验证服务器的完整性)
(创建一个检查点;确保此步骤是successful)
(如果您对日志文件运行Perforce,您应该这样做)
(这是实际数据,不要与Perforce服务器目录中的db.*文件混淆。)
但请务必阅读手册,特别是关于各种恢复方案的手册。记住:备份通常工作得很好,失败的是还原。
发布于 2010-12-16 22:30:04
除了jhwist的p4手动答案(permalink)的正确性之外,我还想补充一些我在使用Perforce几年的过程中学到的东西。
..。
根据存储库的大小,在p4数据库上执行验证可能需要几个小时,在此期间,将被锁定为,并且没有人能够执行任何查询。锁定P4数据库可能会对您的用户产生几个流程上的影响,例如:如果有人正在使用或试图在此期间使用P4,则P4SCC插件(即.对于visual studio集成),它将旋转,用户最终将不得不强制退出以重新获得控制权。
解决方案
p4 verify //...和检查点。还有:,因为这很可能是一个在晚上或周末运行的自动化进程,它不会给你足够的压力,以至于你需要彻底阅读检查点日志文件以确保它是成功的,否则当你需要执行恢复(阅读下一点)时,你将处于一个困难的境地。备份不应该是一个设置并忘记的过程。
有关Perforce备份的更多信息,请参阅Perforce白皮书:High Availability And Disaster Recovery Solutions For Perforce。
HTH,
发布于 2010-12-17 00:47:01
FWIW我在我自己的开发工作站上使用了一个额外的备份策略。我有一个perl脚本,它每晚运行一次,从给定的工作空间列表中查找我从Perforce签出的所有文件。然后,该文件列表将作为我的正常工作站备份过程的一部分进行备份。在我看来,用来查找已签出文件的Perl脚本相当棘手。它不是我写的,也不是特别熟悉Perl。
如果任何人感兴趣,我可以在这里张贴脚本以及我如何调用它。
请注意,此脚本是在Perforce推出其“搁置”功能之前开发的。现在,如果我有一个脚本来“搁置”我每晚的工作(除了我当前的备份策略之外,或者代替它),我可能会过得更好。
下面是脚本:
# This script copies any files that are opened for any action (other than
# delete) in the specified client workspace to another specified directory.
# The directory structure of the workspace is duplicated in the target
# directory. Furthermore, a file is not copied if it already exists in the
# target directory unless the file in the workspace is newer than the one
# in the target directory.
# Note: This script looks at *all* pending changelists in the specified
# workspace.
# Note: This script uses the client specification Root to get the local
# pathname of the files. So if you are using a substituted drive for the
# client root, it must be properly substituted before running this script.
# Argument 1: Client workspace name
# Argument 2: Target directory (full path)
use File::Path;
# use File::Copy;
use File::Basename;
use Win32;
if ($#ARGV != 1) {
die("usage: $0 client_name target_directory\n");
}
my $client = shift(@ARGV);
my $target_dir = shift(@ARGV);
my @opened_files = ();
my $client_root = "";
my $files_copied = 0;
# I need to know the root directory of the client, so that I can derive the
# local pathname of the file. Strange that "p4 -ztag opened" doesn't give
# me the local pathname; I would have expected it to.
open(CLIENT_SPEC, "p4 -c $client client -o|")
|| die("Cannot retrieve client specification: $!");
while (<CLIENT_SPEC>) {
my ($tag, $value) = split(/\s/, $_, 2);
if ($tag eq "Root:") {
$value = chop_line($value);
$client_root = $value;
}
}
close(CLIENT_SPEC);
if ($client_root eq "") {
die("Unable to determine root of client $client\n");
} elsif (substr($client_root, -1) ne "\\") {
$client_root = $client_root . "\\";
}
# Use the -ztag option so that we can get the client file path as well as
# the depot path.
open(OPENED_FILES, "p4 -c $client -ztag opened|")
|| die("Cannot get list of opened files: $!");
while (<OPENED_FILES>) {
# What we do is to get the client path and append it onto the
# @opened_files array. Then when we get the action, if it is a delete,
# we pop the last entry back off the array. This assumes that the tags
# come out with clientFile before action.
$_ = chop_line($_);
my ($prefix, $tag, $value) = split(/\s/, $_, 3);
if ($tag eq "clientFile") {
push(@opened_files, $value);
}
if ( ($tag eq "action") && ($value eq "delete") ) {
pop(@opened_files);
}
}
close(OPENED_FILES);
# Okay, now we have the list of opened files. Process each file to
# copy it to the destination.
foreach $client_path (@opened_files) {
# Trim off the client name and replace it with the client root
# directory. Also replace forward slashes with backslashes.
$client_path = substr($client_path, length($client) + 3);
$client_path =~ s/\//\\/g;
my $local_path = $client_root . $client_path;
# Okay, now $client_path is the partial pathname starting at the
# client's root. That's the path we also want to use starting at the
# target path for the destination.
my $dest_path = $target_dir . "\\" . $client_path;
my $copy_it = 0;
if (-e $dest_path) {
# Target exists. Is the local path newer?
my @target_stat = stat($dest_path);
my @local_stat = stat($local_path);
if ($local_stat[9] > $target_stat[9]) {
$copy_it = 1;
}
} else {
# Target does not exist, definitely copy it. But we may have to
# create some directories. Use File::Path to do that.
my ($basename, $dest_dir) = fileparse($dest_path);
if (! (-e $dest_dir)) {
mkpath($dest_dir) || die("Cannot create directory $dest_dir\n");
}
$copy_it = 1;
}
if ($copy_it) {
Win32::CopyFile($local_path, $dest_path, 1)
|| warn("Could not copy file $local_path: $!\n");
$files_copied++;
}
}
print("$files_copied files copied.\n");
exit(0);
################ Subroutines #########################################
# chop_line removes any trailing carriage-returns or newlines from its
# argument and returns the possibly-modified string.
sub chop_line {
my $string = shift;
$string =~ s/[\r\n]*\z//;
return $string;
}要运行:
REM Make sure that we are pointing to the current Perforce server
P4 set -s P4PORT=MyPerforceServer:ThePortThatPerforceIsOn
p4 set p4client=MyPerforceWorkspace
REM Copy checked out files to a local directory that will be backed up
.\p4backup.pl MyPerforceWorkspace c:\PerforceBackups\MyPerforceWorkspace_backuphttps://stackoverflow.com/questions/4440548
复制相似问题