我正在使用 plone.app.blob 将大型 ZODB 对象存储在 blobstorage 目录中。这减少了 Data.fs 的大小压力,但我无法找到任何有关备份此数据的建议。

我已经通过将网络备份工具指向 repozo 备份目录来备份 Data.fs。我是否应该简单地将该工具指向 blobstorage 目录来备份我的 blob?

如果在复制过程中正在重新打包数据库或添加和删除 blob,该怎么办?blobstorage 目录中是否有必须按特定顺序复制的文件?

有帮助吗?

解决方案

备份“blobstorage”将做到这一点。无需特殊订货或其他任何东西,这是非常简单的。

在Plone所有操作都是完全事务性的,所以打在交易中间的备份应该只是罚款。这就是为什么你可以做ZODB的活动备份。不知道是什么文件系统,你在,我猜想,因为预期它应该工作。

其他提示

这应该是安全的做Data.fs随后blobstorage目录的rsync的,只要同时这两个操作都发生在数据库没有得到包装的repozo备份。

这是因为,至少使用具有FileStorage斑点时,修改对BLOB总是导致产生基于所述对象标识和事务ID的文件名为的。因此,如果新的或更新的斑点是在Data.fs之后写入备份,它不应该是一个问题,因为这是由Data.fs引用的文件仍然应该在。被去除斑点不会导致在该文件中的删除,直到该数据库被打包,以使得应该没关系太

在备份过程中执行以不同的顺序进行备份,或者与填料,可导致在引用斑点备份Data.fs不包含在备份中。

我有一个月副本使用硬链接的斑点(所以你必须和斑点作为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 <sneridagh@gmail.com>

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)

您的 FileStorage 备份策略很好。然而,对在多个文件中存储数据的任何数据库进行备份绝非易事,因为您的复制必须在不写入各个文件的情况下进行。对于文件存储来说,盲目的愚蠢副本就可以了,因为它只是一个文件。(使用 repozo 效果更好。)

在这种情况下(BlobStorage 与 FileStorage 相结合)我必须指出常规备份建议:

  • 在制作文件系统副本时使数据库脱机
  • 使用 LVM 等快照工具在给定点冻结磁盘
  • 进行交易导出(实际上不可行)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top