2009-01-16 12 views
6

Estoy usando plone.app.blob para almacenar objetos grandes ZODB en un directorio blobstorage. Esto reduce la presión de tamaño en Data.fs, pero no he podido encontrar ningún consejo sobre la copia de seguridad de estos datos.¿Cuál es la forma correcta de realizar copias de seguridad de blobs de ZODB?

Ya estoy realizando una copia de seguridad de Data.fs señalando una herramienta de copia de seguridad de red en un directorio de copias de seguridad repozo. ¿Debo simplemente señalar esa herramienta en el directorio blobstorage para hacer una copia de seguridad de mis blobs?

¿Qué ocurre si la base de datos se está reempaquetando o si se están agregando y borrando blobs mientras se realiza la copia? ¿Hay archivos en el directorio blobstorage que se deben copiar en un orden determinado?

Respuesta

2

Copia de seguridad de "blobstorage" lo hará. No es necesario un pedido especial o cualquier otra cosa, es muy simple.

Todas las operaciones en Plone son completamente transaccionales, por lo que pulsar la copia de seguridad en el medio de una transacción debería funcionar bien. Es por eso que puede hacer copias de seguridad en vivo del ZODB. Sin saber en qué sistema de archivos estás, supongo que debería funcionar como se esperaba.

+2

Will esa copia de seguridad de trabajo que mi directorio de copia de seguridad antes de que BlobStorage los Data.fs, y por el momento de llegar a la copia de seguridad en torno Data.fs otra burbuja ha sido añadidos o actualizados? ¿Qué pasará si empaco la base de datos mientras realizo la copia de seguridad? – joeforker

+4

Esta respuesta es incorrecta: las preocupaciones que plantea joeforker son válidas. Ver mi respuesta por separado para el enfoque recomendado. –

+2

Confíe en el Dr. Glick. :) – limi

1

Su estrategia de copia de seguridad para FileStorage está bien. Sin embargo, hacer una copia de seguridad de cualquier base de datos que almacene datos en múltiples archivos nunca es fácil, ya que su copia debe ocurrir sin escrituras en varios archivos. Para FileStorage, una copia ciega y estúpida está bien, ya que es solo un archivo. (El uso de repozo es aún mejor.)

En este caso (con BlobStorage combinado con FileStorage) tengo que señalar que el consejo copia de seguridad periódica:

  • desconectar el db mientras que hace una copia del sistema de archivos
  • herramientas de uso de instantáneas LVM como para congelar el disco en un punto dado
  • realizar una exportación transaccional (no factible en la práctica)
12

debe ser seguro para hacer una copia de seguridad de los datos repozo .fs seguido de un rsync del directorio blobstorage, siempre y cuando la base de datos no se empaquete mientras esas dos operaciones están ocurriendo.

Esto se debe a que, al menos cuando se usan blobs con FileStorage, las modificaciones en un blob siempre dan como resultado la creación de un nuevo archivo nombrado en función de la identificación del objeto y la identificación de la transacción. Por lo tanto, si se crean blobs nuevos o actualizados después de realizar la copia de seguridad de Data.fs, no debería ser un problema, ya que los archivos a los que hace referencia Data.fs aún deberían estar presentes. La eliminación de un blob no da como resultado que el archivo se elimine hasta que la base de datos esté empaquetada, por lo que también debería estar bien.

La realización de una copia de seguridad en un orden diferente, o con el embalaje durante la copia de seguridad, puede dar como resultado una copia de seguridad de Data.fs que hace referencia a blobs que no están incluidos en la copia de seguridad.

2

que tienen una secuencia de comandos que copia de un mes las manchas utilizando los enlaces duros (por lo que tienen y historial de las manchas como las 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) 
+0

Tenga en cuenta que recientemente he iniciado una rama de collective.recipe.backup para hacer una copia de seguridad de blobstorage también. Aún no ha terminado, pero debería estar bien para probar en una base de datos que no sea de producción. – maurits

Cuestiones relacionadas