Как правильно сделать резервную копию больших двоичных объектов ZODB?

Я использую plone.app.blob для хранения больших объектов ZODB в каталоге blobstorage. Это снижает нагрузку на размер Data.fs, но мне не удалось найти никаких советов по резервному копированию этих данных.

Я уже делаю резервную копию Data.fs, указав сетевому инструменту резервного копирования каталог резервных копий репозитория. Должен ли я просто указать этому инструменту каталог хранилища BLOB-объектов для резервного копирования моих BLOB-объектов?

Что делать, если база данных переупаковывается или большие двоичные объекты добавляются и удаляются во время копирования? Есть ли в каталоге хранилища больших двоичных объектов файлы, которые необходимо копировать в определенном порядке?


person joeforker    schedule 16.01.2009    source источник


Ответы (4)


Резервное копирование "blobstorage" сделает это. Не нужно специального заказа или чего-то еще, все очень просто.

Все операции в Plone полностью транзакционные, так что резервное копирование в середине транзакции должно работать нормально. Вот почему вы можете делать живые резервные копии ZODB. Не зная, в какой файловой системе вы работаете, я бы предположил, что она должна работать так, как задумано.

person limi    schedule 17.01.2009
comment
Будет ли это работать, если я сделаю резервную копию своего каталога хранилища BLOB-объектов, прежде чем создавать резервную копию Data.fs, и к тому времени, когда я приступлю к резервному копированию Data.fs, будет добавлен или обновлен другой большой двоичный объект? Что произойдет, если я упакую базу данных во время резервного копирования? - person joeforker; 04.02.2009
comment
Этот ответ неверен - опасения, которые поднимает joeforker, действительны. См. мой отдельный ответ для рекомендуемого подхода. - person David Glick; 19.04.2010

Безопасно делать резервную копию репозитория Data.fs с последующей rsync каталога хранилища BLOB-объектов, если база данных не упаковывается во время выполнения этих двух операций.

Это связано с тем, что, по крайней мере, при использовании больших двоичных объектов с FileStorage, изменения большого двоичного объекта всегда приводят к созданию нового файла с именем на основе идентификатора объекта и идентификатора транзакции. Таким образом, если новые или обновленные большие двоичные объекты записываются после резервного копирования Data.fs, это не должно быть проблемой, поскольку файлы, на которые ссылается Data.fs, все еще должны быть рядом. Удаление большого двоичного объекта не приводит к удалению файла до тех пор, пока база данных не будет упакована, так что это тоже должно быть в порядке.

Выполнение резервного копирования в другом порядке или с упаковкой во время резервного копирования может привести к созданию резервной копии Data.fs, которая ссылается на большие двоичные объекты, не включенные в резервную копию.

person David Glick    schedule 18.04.2010

У меня есть скрипт, который в течение месяца копирует BLOB-объекты с использованием жестких ссылок (так что у вас есть история BLOB-объектов как Data.fs):

резервная копия.ш

#!/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)
person Ramon Navarro Bosch    schedule 10.03.2011
comment
Обратите внимание, что я недавно запустил ветку коллективного.рецепта.backup для резервного копирования хранилища BLOB-объектов. Еще не закончено, но должно подойти для тестирования на непроизводственной базе данных. - person maurits; 14.03.2011

Ваша стратегия резервного копирования для FileStorage в порядке. Однако создание резервной копии любой базы данных, которая хранит данные в нескольких файлах, никогда не бывает легкой задачей, поскольку ваша копия должна выполняться без записи в различные файлы. Для FileStorage слепая глупая копия подходит, поскольку это всего лишь один файл. (Использование repozo даже лучше.)

В этом случае (с BlobStorage в сочетании с FileStorage) я должен указать на обычный совет по резервному копированию:

  • перевести БД в автономный режим при создании копии файловой системы
  • используйте инструменты моментальных снимков, такие как LVM, чтобы заморозить диск в заданной точке
  • сделать транзакционный экспорт (на практике невозможно)
person Community    schedule 24.03.2009