8

plone.app.blob を使用して、大きな ZODB オブジェクトを blobstorage ディレクトリに保存しています。これにより、Data.fs のサイズへのプレッシャーが軽減されますが、このデータのバックアップに関するアドバイスを見つけることができませんでした。

ネットワーク バックアップ ツールを repozo バックアップのディレクトリにポイントすることで、既に Data.fs をバックアップしています。BLOB をバックアップするには、そのツールを blobstorage ディレクトリに向けるだけでよいのでしょうか?

コピーの実行中にデータベースが再パックされている場合、または BLOB が追加および削除されている場合はどうなりますか? blobstorage ディレクトリに、特定の順序でコピーする必要があるファイルはありますか?

4

4 に答える 4

13

これらの2つの操作が行われている間にデータベースがパックされない限り、Data.fsのレポゾバックアップに続いてblobstorageディレクトリのrsyncを実行しても安全です。

これは、少なくともFileStorageでBLOBを使用する場合、BLOBを変更すると、常にオブジェクトIDとトランザクションIDに基づいて名前が付けられた新しいファイルが作成されるためです。したがって、Data.fsがバックアップされた後に新しいまたは更新されたBLOBが書き込まれる場合、Data.fsによって参照されるファイルはまだ存在しているはずなので、問題はありません。BLOBを削除しても、データベースがパックされるまでファイルは削除されないため、これも問題ありません。

別の順序で、またはバックアップ中にパッキングを使用してバックアップを実行すると、バックアップに含まれていないBLOBを参照するバックアップData.fsが生成される可能性があります。

于 2010-04-18T23:51:13.263 に答える
3

「blobstorage」をバックアップするとそれができます。特注などは必要なく、とても簡単です。

Plone でのすべての操作は完全にトランザクションに対応しているため、トランザクションの途中でバックアップを実行しても問題なく動作するはずです。これが、ZODB のライブ バックアップを実行できる理由です。使用しているファイル システムがわからなくても、意図したとおりに動作するはずです。

于 2009-01-17T20:16:28.203 に答える
2

ハードリンクを使用してBLOBを1か月間コピーするスクリプトがあります(したがって、Data.fsとしてBLOBの履歴があります)。

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)
于 2011-03-10T16:54:01.070 に答える