Skip to content

pizzanicky/Perforce-backup-scripts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

#Perforce数据备份 (本文大部分内容来自Perforce官方文档)

Perforce储存的数据分两种:版本文件(versioned files)和元数据(metadata)

  • 版本文件就是用户submit的文件,储存在depots目录树里
  • 数据库文件储存这metadata,包括了changelist,打开(checkout)的文件,客户端workspace配置,branch映射,以及其他历史记录和文件状态之类的数据。数据库文件以db.*文件的形式呈现在P4根目录,每个db.*文件都包含一个单独的二进制数据表

##备份和恢复的基本概念 磁盘空间不足,硬件故障,以及系统崩溃都可能导致Perforce服务器文件损坏,因此应该定期备份整个P4根目录(版本文件和数据库)。

保存在depot子目录中的版本文件可以直接从备份中无损失地拷贝还原,但数据库文件这样还原则无法保证完整性,直接拷贝db.*文件可能导致数据库状态异常。保证其完整性的唯一方法就是用P4的checkpoint和journal文件来重建db.*文件:

  • checkpoint是某一时刻数据库的快照
  • journal是自上次快照以来,数据库更新的记录

Checkpoint文件通常比原始数据库小很多,且压缩后可以更小;而journal文件能够增长得相当大,每次生成checkpoint的时候,老的journal文件被截断并重命名,新的journal重新开始生成。此时可以把老journal文件备份到别处,以空出运行空间。

Checkpoint和journal都是格式相同的文本文件,一个checkpoint和它之后的journal文件就可以恢复P4的数据库。

注意!Checkpoint和journal只记录了P4的数据库,并不记录depot目录中的版本文件!所以进行checkpoint动作之后,必须另外单独备份depot文件!

###Checkpoint文件 Checkpoint包含了重建P4数据库元数据的所有信息,创建checkpoint的时候,P4会锁定数据库,以便保存快照。再次提醒:从checkpoint无法恢复任何版本文件(我们的源码)

为保证恢复后数据库的完整性,checkpoint必须比depot中的版本文件旧,或者至少一样。也就是说,备份时应该在checkpoint完全生成后,再开始备份版本文件。

###创建checkpoint Checkpoint不会自动进行,一般可以使用如下命令:

p4d -r server_root -jc

-jc代表journal-create,server_root是你的P4根目录,如果不指定,会默认使用$P4ROOT

生成checkpoint时,p4d会锁定数据库,将其内容dump到checkpoint.n文件中,n为序号。解锁数据库之前,p4d还会把journal文件以journal.n-1的文件名复制到P4ROOT目录(无论当前journal保存在哪里)然后重置当前的journal。checkpoint文件的MD5校验和会被写到checkpoint.n.md5文件,同时lastCheckpointAction计数也会相应增加。这样可以确保把最后的一个checkpoint(checkpoint.n)和当前journal结合起来就能够得到创建此checkpoint时数据库的完整内容。

checkpoint生成后,建议核对MD5值,随后可以把checkpoint压缩转存,MD5也妥善保存,随后备份depot文件(源码)。

要从备份中恢复,checkpoint不能够比depot文件新,也就是说,depot文件可以比checkpoint新,不过时间差越短越好。

###Journal文件 Journal是上次checkpoint之后记录所有数据库修改的日志,是相邻两个checkpoint的桥梁。比如我们每天晚上10点做checkpoint,周一做了checkpoint,周二晚上10点之前硬盘挂了,那么周一的checkpoint加上随后产生的journal就可以把数据库还原到周三的状态。

警告:这里可以看出journal的重要性,而默认情况journal是放在P4ROOT目录下的,这样如果P4根目录的文件系统挂了,journal也就没用了。所以除了定期生成并备份checkpoint,journal文件最好也写到其他文件系统去(最好是另一个物理硬盘)。可以通过修改P4JOURNAL环境变量,或者启动p4d时用-J filename参数来指定。

注意:还要注意,如果journal不是保存在默认路径,那么生成checkpoint时也要指定相应路径。 比如,如果服务启动命令是这样:

$ p4d -r $P4ROOT -p 1666 -J /usr/local/perforce/journalfile
Perforce Server starting...

那么checkpoint命令就得这样写:

$ p4d -r $P4ROOT -J /usr/local/perforce/journalfile -jc

Checkpointing to checkpoint.19...
Saving journal to journal.18...
Truncating /usr/local/perforce/journalfile...

或者直接把/usr/local/perforce/journalfile设置到P4JOURNAL环境变量里,命令就简化成:

$ p4d -r $P4ROOT -jc
Checkpointing to checkpoint.19...
Saving journal to journal.18...
Truncating /usr/local/perforce/journalfile...

###版本文件 Checkpoint和journal只能用来重建数据库,版本文件必须单独备份 ####版本文件格式 版本文件保存在P4根目录下的子目录中,文本文件以RCS格式存储,文件名为filename,v,每个文本文件对应一个RCS格式(,v)文件。二进制文件则完整保存在名称为filename,d的目录中。

Perforce在保存版本文件时已经进行了压缩

##备份脚本

备份脚本为p4backup.sh

添加到crontab,每天凌晨5:18分运行(因为verify数据完整性时会对性能有影响,特别数据比较大时,所以备份尽量放在低谷时间):

crontab -e

添加任务:

18 5 * * * /opt/p4backup.sh

##参考链接 Perforce Backup and Recovery

RCS Format

About

Perforce server backup scripts

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages