Pergunta

Estou usando o Plone.app.blob para armazenar grandes objetos ZODB em um diretório BlobStorage. Isso reduz a pressão do tamanho dos dados.fs, mas não consegui encontrar nenhum conselho sobre o backup desses dados.

Já estou fazendo backup de dados. Devo simplesmente apontar essa ferramenta no diretório BlobStorage para fazer backup das minhas bolhas?

E se o banco de dados estiver sendo reembalado ou os blobs estiverem sendo adicionados e excluídos enquanto a cópia estiver ocorrendo? Existem arquivos no diretório BlobStorage que devem ser copiados em uma determinada ordem?

Foi útil?

Solução

O backup de "BlobStorage" fará isso. Não há necessidade de um pedido especial ou qualquer outra coisa, é muito simples.

Todas as operações no Plone são totalmente transacionais, portanto, atingir o backup no meio de uma transação deve funcionar muito bem. É por isso que você pode fazer backups ao vivo do Zodb. Sem saber em que sistema de arquivos você está, eu acho que ele deve funcionar como pretendido.

Outras dicas

Deve ser seguro fazer um backup de repozoário dos dados.

Isso ocorre porque, pelo menos ao usar BLOBs com FileStorage, as modificações em um blob sempre resulta na criação de um novo arquivo nomeado com base no ID do objeto e ID da transação. Portanto, se os blobs novos ou atualizados forem gravados após o backup dos dados. A exclusão de um blob não resulta na remoção do arquivo até que o banco de dados esteja embalado, então isso também deve ficar bem.

Executar um backup em uma ordem diferente, ou com a embalagem durante o backup, pode resultar em um backup de dados.

Eu tenho um script que copia por um mês os Blobs usando links rígidos (então você tem e historial dos blobs como dados.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)

Sua estratégia de backup para o FileStorage está bem. No entanto, fazer um backup de qualquer banco de dados que armazena dados em vários arquivos nunca é fácil, pois sua cópia precisa acontecer sem gravações nos vários arquivos. Para o FileStorage, uma cópia estúpida cega é boa, pois é apenas um único arquivo. (Usar a Repozo é ainda melhor.)

Nesse caso (com BlobStorage combinado com o FileStorage), tenho que apontar para o conselho regular de backup:

  • Pegue o banco de dados offline enquanto faz uma cópia do sistema de arquivos
  • Use ferramentas instantâneas como o LVM para congelar o disco em um determinado ponto
  • Faça uma exportação transacional (não viável na prática)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top