ما هي الطريقة الصحيحة للنسخ الاحتياطي zodb blobs؟
-
19-08-2019 - |
سؤال
أنا أستخدم plone.app.blob لتخزين كائنات ZodB الكبيرة في دليل blobstorage. هذا يقلل من ضغط الحجم على البيانات. FS لكنني لم أتمكن من العثور على أي نصيحة بشأن نسخة احتياطية من هذه البيانات.
أنا بالفعل أقوم بإجراء النسخ الاحتياطي للبيانات. FL من خلال توجيه أداة النسخ الاحتياطي للشبكة في دليل النسخ الاحتياطية Repozo. هل يجب أن أشرب هذه الأداة في دليل blobstorage إلى النسخ الاحتياطي الخاص بي؟
ماذا لو تم إعادة تعبئة قاعدة البيانات أو إضافة النقط وحذفها أثناء إجراء النسخة؟ هل هناك ملفات في دليل blobstorage يجب نسخها بترتيب معين؟
المحلول
النسخ الاحتياطي "blobstorage" سيفعل ذلك. لا حاجة لطلب خاص أو أي شيء آخر ، إنه بسيط للغاية.
جميع العمليات في PLONE هي معاملات بالكامل ، لذا فإن ضرب النسخ الاحتياطي في منتصف المعاملة يجب أن يعمل بشكل جيد. هذا هو السبب في أنه يمكنك القيام بنسخ احتياطية حية من Zodb. دون معرفة نظام الملفات الذي أنت عليه ، أعتقد أنه ينبغي أن يعمل على النحو المقصود.
نصائح أخرى
يجب أن يكون من الآمن القيام بنسخة احتياطية من data.fs تليها RSYNC من دليل blobstorage ، طالما أن قاعدة البيانات لا يتم تعبئتها أثناء حدوث هاتين العمليتين.
هذا لأنه ، على الأقل عند استخدام blobs مع Filestorage ، يؤدي التعديلات على Blob دائمًا إلى إنشاء ملف جديد يسمى على معرف الكائن ومعرف المعاملة. لذا ، إذا تمت كتابة النقط الجديدة أو المحدثة بعد احتياطي البيانات. لا ينبغي أن تكون مشكلة ، لأن الملفات التي تتم الإشارة إليها من قبل البيانات. لا يؤدي حذف Blob إلى إزالة الملف حتى يتم تعبئة قاعدة البيانات ، بحيث يكون ذلك على ما يرام أيضًا.
قد يؤدي إجراء نسخة احتياطية بترتيب مختلف ، أو مع التعبئة أثناء النسخ الاحتياطي ، إلى بيانات النسخ الاحتياطي. FS التي تشير إلى النقط غير المدرجة في النسخ الاحتياطي.
لديّ برنامج نصي يقوم بنسخ لمدة شهر باستخدام الروابط الصلبة (حتى يكون لديك و Historial of the blobs مثل 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 <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)
استراتيجية النسخ الاحتياطي الخاص بك لـ Filestorage على ما يرام. ومع ذلك ، فإن إنشاء نسخة احتياطية من أي قاعدة بيانات تخزن البيانات في ملفات متعددة لا يكون سهلاً أبدًا حيث يجب أن تحدث نسختك دون أي كتابة إلى الملفات المختلفة. بالنسبة إلى FileStorage ، فإن نسخة غبية أعمى جيدة لأنها مجرد ملف واحد. (باستخدام Repozo أفضل.)
في هذه الحالة (مع BlobStorage مع Filestorage) ، يجب أن أشير إلى نصيحة النسخ الاحتياطي العادي:
- خذ DB في وضع عدم الاتصال أثناء عمل نسخة نظام الملفات
- استخدم أدوات لقطة مثل LVM لتجميد القرص في نقطة معينة
- قم بتصدير المعاملات (غير قابلة للاستغناء في الممارسة)