我正在使用plone.app.blob将大型ZODB对象存储在blobstorage目录中。这减少了Data.fs的大小压力,但我一直无法找到有关备份此数据的任何建议。什么是备份ZODB blob的正确方法?
我已经通过将网络备份工具指向repozo备份目录来备份Data.fs。我应该只需将该工具指向blobstorage目录以备份我的blob?
如果正在重新打包数据库或在副本发生时添加和删除了斑点,该怎么办? blobstorage目录中是否存在必须以特定顺序复制的文件?
我正在使用plone.app.blob将大型ZODB对象存储在blobstorage目录中。这减少了Data.fs的大小压力,但我一直无法找到有关备份此数据的任何建议。什么是备份ZODB blob的正确方法?
我已经通过将网络备份工具指向repozo备份目录来备份Data.fs。我应该只需将该工具指向blobstorage目录以备份我的blob?
如果正在重新打包数据库或在副本发生时添加和删除了斑点,该怎么办? blobstorage目录中是否存在必须以特定顺序复制的文件?
备份“blobstorage”将做到这一点。无需特殊订单或其他任何东西,这非常简单。
Plone中的所有操作都是事务性的,因此在事务中间点击备份应该很好。这就是为什么你可以做ZODB的实时备份。不知道你在使用什么文件系统,我猜想它应该按照预期工作。
您的FileStorage备份策略没问题。但是,将数据存储在多个文件中的任何数据库的备份永远不会很容易,因为您的副本必须在不写入各种文件的情况下发生。对于FileStorage来说,一个愚蠢的副本很好,因为它只是一个文件。 (使用repozo,甚至更好。)
在这种情况下(与BlobStorage与FileStorage合并)我要指出的定期备份建议:
它应该是安全的进行数据的备份repozo .fs后跟一个blobstorage目录的rsync,只要数据库在这两个操作发生时不会被打包。
这是因为,至少在将Blob与FileStorage一起使用时,对Blob的修改总是会导致基于对象ID和事务ID创建一个新文件。因此,如果在Data.fs备份后编写新的或更新的Blob,它应该不成问题,因为Data.fs引用的文件应该仍然存在。删除blob不会导致文件在数据库打包之前被删除,所以应该也可以。
以不同的顺序执行备份或在备份过程中打包,可能会导致备份Data.fs引用未包含在备份中的Blob。
我(的斑点作为Data.fs的,所以你必须和讲史),对于一个每月使用拷贝硬链接的斑的脚本:
backup.sh
#!/bin/sh
# per a fer un full : ./cron_nocturn.sh full
ZEO_FOLDER=/var/plone/ZEO
# Zeo port
ZEO_PORT = 8023
# Name of the DB
ZEO_DB = zodb1
BACKUP_FOLDER=/backup/plone
LOGBACKUP=/var/plone/ZEO/backup.log
BACKUPDIR=`date +%d`
echo "INICI BACKUP" >> $LOGBACKUP
echo `date` >> $LOGBACKUP
# Fem el packing
if [ "$1" = "full" ]; then
$ZEO_FOLDER/bin/zeopack -S $ZEO_DB -p $ZEO_PORT -h 127.0.0.1
echo " Comprovant folders"
#mirem si existeix el folder de backup
if ! [ -x $BACKUP_FOLDER/$ZEO_DB ]; then
mkdir $BACKUP_FOLDER/$ZEO_DB
fi
#mirem si existeix el backup folder del dia
if ! [ -x $BACKUP_FOLDER/blobs/$BACKUPDIR/ ] ; then
mkdir $BACKUP_FOLDER/blobs/$BACKUPDIR/
fi
echo " Backup Data.fs"
# backup de Data.fs
if [ "$1" = "full" ]; then
echo " Copiant Data.fs"
$ZEO_FOLDER/bin/repozo -B -F -r $BACKUP_FOLDER/$ZEO_DB/ -f $ZEO_FOLDER/var/filestorage/Data_$ZEO_DB.fs
echo " Purgant backups antics"
$ZEO_FOLDER/neteja.py -l $BACKUP_FOLDER/$ZEO_DB -k 2
else
$ZEO_FOLDER/bin/repozo -B -r $BACKUP_FOLDER/$ZEO_DB/ -f $ZEO_FOLDER/var/filestorage/Data_$ZEO_DB.fs
fi
echo " Copiant blobs"
# backup blobs
rm -rf $BACKUP_FOLDER/blobs/$BACKUPDIR
cd $BACKUP_FOLDER/current-blobs && find . -print | cpio -dplm $BACKUP_FOLDER/blobs/$BACKUPDIR
rsync --force --ignore-errors --delete --update -a $ZEO_FOLDER/var/blobs/ $BACKUP_FOLDER/current-blobs/
echo "FI BACKUP" >> $LOGBACKUP
echo `date` >> $LOGBACKUP
neteja。 py
#!/usr/bin/python2.4
# neteja.py -l [directori_desti] -k [numero_fulls_a_mantenir]
# Script que neteja un directori amb backups i guarda nomes els ultims fulls que li especifiquis
# Es basa en la utilitzacio de collective.recipe.backup
# Author: Victor Fernandez de Alba <[email protected]>
import sys, getopt
sys.path[0:0] = [
'/var/plone/genwebupcZEO/produccio/eggs/collective.recipe.backup-1.3-py2.4.egg',
'/var/plone/genwebupcZEO/produccio/eggs/zc.buildout-1.4.2-py2.4.egg',
'/var/plone/genwebupcZEO/produccio/eggs/zc.recipe.egg-1.2.2-py2.4.egg',
'/var/plone/genwebupcZEO/produccio/eggs/setuptools-0.6c11-py2.4.egg',
]
import collective.recipe.backup.repozorunner
argv = sys.argv[1:]
try:
opts, args = getopt.getopt(argv, "l:k:", ["location=", "keep="])
except getopt.GetoptError:
print "neteja.py -l [directori_desti] -k [numero_fulls_a_mantenir]"
sys.exit(2)
for opt, arg in opts:
if opt in ("-l", "--location"):
location = arg
elif opt in ("-k", "--keep"):
keep = arg
if len(opts)<2:
print "neteja.py -l [directori_desti] -k [numero_fulls_a_mantenir]"
sys.exit(2)
collective.recipe.backup.repozorunner.cleanup(location, keep)
在备份Data.fs之前备份我的blobstorage目录,到备份Data.fs时又添加或更新了另一个Blob?如果我在备份时打包数据库会发生什么情况? – joeforker 2009-02-04 18:25:36
这个答案是不正确的 - joeforker提出的问题是有效的。请参阅我的单独答案以获得推荐的方法。 – 2010-04-18 23:52:15