2009-01-16 96 views
6

我正在使用plone.app.blob將大型ZODB對象存儲在blobstorage目錄中。這減少了Data.fs的大小壓力,但我一直無法找到有關備份此數據的任何建議。什麼是備份ZODB blob的正確方法?

我已經通過將網絡備份工具指向repozo備份目錄來備份Data.fs。我應該只需將該工具指向blobstorage目錄以備份我的blob?

如果正在重新打包數據庫或在副本發生時添加和刪除了斑點,該怎麼辦? blobstorage目錄中是否存在必須以特定順序複製的文件?

回答

2

備份「blobstorage」將做到這一點。無需特殊訂單或其他任何東西,這非常簡單。

Plone中的所有操作都是事務性的,因此在事務中間點擊備份應該很好。這就是爲什麼你可以做ZODB的實時備份。不知道你在使用什麼文件系統,我猜想它應該按照預期工作。

+2

在備份Data.fs之前備份我的blobstorage目錄,到備份Data.fs時又添加或更新了另一個Blob?如果我在備份時打包數據庫會發生什麼情況? – joeforker 2009-02-04 18:25:36

+4

這個答案是不正確的 - joeforker提出的問題是有效的。請參閱我的單獨答案以獲得推薦的方法。 – 2010-04-18 23:52:15

1

您的FileStorage備份策略沒問題。但是,將數據存儲在多個文件中的任何數據庫的備份永遠不會很容易,因爲您的副本必須在不寫入各種文件的情況下發生。對於FileStorage來說,一個愚蠢的副本很好,因爲它只是一個文件。 (使用repozo,甚至更好。)

在這種情況下(與BlobStorage與FileStorage合併)我要指出的定期備份建議:

  • 同時使文件系統複製
  • 數據庫脫機
  • 使用快照工具,如LVM凍結該盤在給定的點
  • 做出口交易(實際上不feasable)
12

它應該是安全的進行數據的備份repozo .fs後跟一個blobstorage目錄的rsync,只要數據庫在這兩個操作發生時不會被打包。

這是因爲,至少在將Blob與FileStorage一起使用時,對Blob的修改總是會導致基於對象ID和事務ID創建一個新文件。因此,如果在Data.fs備份後編寫新的或更新的Blob,它應該不成問題,因爲Data.fs引用的文件應該仍然存在。刪除blob不會導致文件在數據庫打包之前被刪除,所以應該也可以。

以不同的順序執行備份或在備份過程中打包,可能會導致備份Data.fs引用未包含在備份中的Blob。

2

我(的斑點作爲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) 
相關問題