„runbefore“ und „runafter“ zur Verwendung des Tools für konsistente Momentaufnahmen in Azure-Anwendungen für Azure NetApp Files
Dieser Artikel enthält eine Anleitung zum Verwenden der Funktionen --runbefore
und --runafter
des Tools für konsistente Momentaufnahmen in Azure-Anwendungen, das Sie mit Azure NetApp Files verwenden können.
Einführung
AzAcSnap kann externe Befehle vor oder nach der Hauptausführung mithilfe der Optionen --runbefore
oder --runafter
ausführen.
--runbefore
führt einen Shellbefehl vor der Hauptausführung von azacsnap aus und stellt einige der azacsnap-Befehlszeilenparameter für die Shellumgebung bereit.
Wartet standardmäßig bis zu 30 Sekunden, bis der externe Shellbefehl abgeschlossen ist, azacsnap
bevor der Prozess beendet und zur normalen Azacsnap-Ausführung zurückkehrt.
Diese Verzögerung kann überschrieben werden, indem eine Zahl hinzugefügt wird, um anzugeben, wie viele Sekunden nach einem %
-Zeichen gewartet wird (z. B. bei --runbefore "mycommand.sh%60"
wird bis zu 60 Sekunden auf den Abschluss von mycommand.sh
gewartet).
--runafter
führt einen Shellbefehl nach der Hauptausführung von azacsnap aus und stellt einige der azacsnap-Befehlszeilenparameter für die Shellumgebung bereit.
Wartet standardmäßig bis zu 30 Sekunden, bis der externe Shellbefehl abgeschlossen ist, azacsnap
bevor der Prozess beendet und zur normalen Azacsnap-Ausführung zurückkehrt.
Diese Verzögerung kann überschrieben werden, indem eine Zahl hinzugefügt wird, --runafter "mycommand.sh%60"
die nach einem %
Zeichen in Sekunden gewartet werden soll (z. B. wird bis zu 60 Sekunden auf mycommand.sh
den Abschluss gewartet).
azacsnap
generiert die folgende Liste der Umgebungsvariablen und übergibt sie an die Shell, um die Befehle auszuführen, die als Parameter bereitgestellt werden, --runbefore
und --runafter
:
-
$azCommand
= die Befehlsoption, die an -c übergeben wird (z. B. Sicherung, Test usw.) -
$azConfigFileName
= der Name der Konfigurationsdatei -
$azPrefix
= der Präfixwert -
$azRetention
= der Aufbewahrungswert -
$azSid
= der --dbsid-Wert -
$azSnapshotName
= der von azacsnap generierte Name der Momentaufnahme
Hinweis
In der Option --runafter
gibt es nur einen Wert für $azSnapshotName
.
Beispielverwendung zum Sichern von Azure Blob Storage
Wichtig
Beispiele werden nur zu Informationszwecken bereitgestellt. Wir garantieren nicht die Richtigkeit, Vollständigkeit oder Nützlichkeit der bereitgestellten Informationen. Die Verwendung dieser Beispiele erfolgt auf eigenes Risiko. Wir übernehmen keine Haftung für Verluste oder Schäden, die sich aus der Verwendung dieser Beispiele ergeben können. Wir bieten keine Unterstützung für die in dieser Dokumentation aufgeführten Beispiele.
Eine Beispielverwendung für dieses neue Feature ist das Hochladen einer Momentaufnahme in Azure Blob zu Archivierungszwecken mithilfe des azcopy
Tools (Kopieren oder Verschieben von Daten in Azure Storage mithilfe von AzCopy).
Shellskript zum Hochladen in Azure Blob Storage
Dieses Beispielshellskript weist am Ende eine spezielle Sanza auf, um zu verhindern, dass AzAcSnap den externen Befehl aufgrund des zuvor beschriebenen Timeouts töten kann. Diese Stanza ermöglicht es, lange ausgeführte Befehle auszuführen, z. B. das Hochladen großer Dateien mit Azcopy, ohne vorzeitig angehalten zu werden.
Die Momentaufnahmen müssen mit mindestens schreibgeschützten Berechtigungen auf dem System bereitgestellt werden, das die Kopie erstellt. Der Basisspeicherort des Bereitstellungspunkts für die Momentaufnahmen sollte für die Variable sourceDir
im Skript angegeben werden.
Die Momentaufnahme wird mithilfe des tar
Befehls zum Erstellen eines Gzipped-Tarballs als einzelne Datei hochgeladen. Wenn Sie die Dateien in einen einzigen Tarball setzen, bleiben die Dateiberechtigungen und der Besitz, andernfalls gehen diese Attribute verloren, da das Hochladen der Dateien einzeln verloren geht.
cat snapshot-to-blob.sh
#!/bin/bash
# Utility to upload-to/list Azure Blob store.
# If run as snapshot-to-blob.sh will upload a gzipped tarball of the snapshot.
# If run as list-blobs.sh will list uploaded blobs.
# e.g. `ln -s snapshot-to-blob.sh list-blobs.sh`
# _START_ Change these
SAS_KEY_FILE="${HOME}/bin/blob-credentials.saskey"
# the snapshots need to be mounted locally for copying, put source directory here
SOURCE_DIR="/mnt/saphana1/hana_data_PR1/.snapshot"
# _END_ Change these
# _START_ AzCopy Settings
#Overrides where the job plan files (used for progress tracking and resuming) are stored, to avoid filling up a disk.
export AZCOPY_JOB_PLAN_LOCATION="${HOME}/.azcopy/plans/"
#Overrides where the log files are stored, to avoid filling up a disk.
export AZCOPY_LOG_LOCATION="${HOME}/.azcopy/logs/"
#If set, to anything, on-screen output will include counts of chunks by state
export AZCOPY_SHOW_PERF_STATES=true
# _END_ AzCopy Settings
# do not change any of the following
# Make sure we got some command line args
if [ "$(basename "$0")" = "snapshot-to-blob.sh" ] && ([ "$1" = "" ] || [ "$2" = "" ]); then
echo "Usage: $0 <SNAPSHOT_NAME> <PREFIX>"
exit 1
fi
# Make sure we can read the SAS key credential file.
if [ -r "${SAS_KEY_FILE}" ]; then
source "${SAS_KEY_FILE}"
else
echo "Credential file '${SAS_KEY_FILE}' not found, exiting!"
fi
# Assign the rest of the Global variables.
SNAPSHOT_NAME=$1
PREFIX=$2
BLOB_STORE="$(echo "${PORTAL_GENERATED_SAS}" | cut -f1 -d'?')"
BLOB_SAS_KEY="$(echo "${PORTAL_GENERATED_SAS}" | cut -f2 -d'?')"
ARCHIVE_LOG="logs/$(basename "$0").log"
# Archive naming (daily.1, daily.2, etc...)
DAY_OF_WEEK=$(date "+%u")
MONTH_OF_YEAR=$(date "+%m")
ARCHIVE_BLOB_TGZ="${PREFIX}.${DAY_OF_WEEK}.tgz"
#######################################
# Write to the log.
# Globals:
# None
# Arguments:
# LOG_MSG
#######################################
write_log(){
LOG_MSG=$1
date=$(date "+[%d/%h/%Y:%H:%M:%S %z]")
echo "$date ${LOG_MSG}" >> "${ARCHIVE_LOG}"
}
#######################################
# Run and Log the command.
# Globals:
# None
# Arguments:
# CMD_TO_RUN
#######################################
run_cmd(){
CMD_TO_RUN="${1}"
write_log "[RUNCMD] ${CMD_TO_RUN}"
bash -c "${CMD_TO_RUN}"
}
#######################################
# Check snapshot exists and then background the upload to Blob store.
# Globals:
# SOURCE_DIR
# SNAPSHOT_NAME
# ARCHIVE_LOG
# Arguments:
# None
#######################################
snapshot_to_blob(){
# Check SOURCE_DIR and SNAPSHOT_NAME exist
if [ ! -d "${SOURCE_DIR}/${SNAPSHOT_NAME}" ]; then
echo "${SOURCE_DIR}/${SNAPSHOT_NAME} not found, exiting!" | tee -a "${ARCHIVE_LOG}"
exit 1
fi
# background ourselves so AzAcSnap exits cleanly
echo "Backgrounding '$0 $@' to prevent blocking azacsnap"
echo "write_logging to ${ARCHIVE_LOG}"
{
trap '' HUP
# the script
upload_to_blob
list_blob >> "${ARCHIVE_LOG}"
} < /dev/null > /dev/null 2>&1 &
}
#######################################
# Upload to Blob store.
# Globals:
# SOURCE_DIR
# SNAPSHOT_NAME
# ARCHIVE_BLOB_TGZ
# BLOB_STORE
# BLOB_SAS_KEY
# ARCHIVE_LOG
# Arguments:
# None
#######################################
upload_to_blob(){
# Copy snapshot to blob store
echo "Starting upload of ${SNAPSHOT_NAME} to ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"
run_cmd "azcopy env ; cd ${SOURCE_DIR}/${SNAPSHOT_NAME} && tar zcvf - * | azcopy cp \"${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}\" --from-to PipeBlob && cd -"
echo "Completed upload of ${SNAPSHOT_NAME} ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"
# Complete
echo "Finished ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")" >> "${ARCHIVE_LOG}"
echo "--------------------------------------------------------------------------------" >> "${ARCHIVE_LOG}"
# col 12345678901234567890123456789012345678901234567890123456789012345678901234567890
}
#######################################
# List contents of Blob store.
# Globals:
# BLOB_STORE
# BLOB_SAS_KEY
# Arguments:
# None
#######################################
list_blob(){
LOG_MSG="Current list of files stored in ${BLOB_STORE}"
write_log "${LOG_MSG}"
echo "${LOG_MSG}"
run_cmd "azcopy list \"${BLOB_STORE}?${BLOB_SAS_KEY}\" --properties LastModifiedTime "
}
# Log when script started.
write_log "Started ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")"
# Check what this was called as ($0) and run accordingly.
case "$(basename "$0")" in
"snapshot-to-blob.sh" )
snapshot_to_blob
;;
"list-blobs.sh" )
list_blob
;;
*)
echo "Command '$0' not recognised!"
;;
esac
saskeyFile enthält den folgenden SAS-Beispielschlüssel (Inhalt aus Sicherheitsgründen geändert):
cat blob-credentials.saskey
# we need a generated SAS key, get this from the portal with read,add,create,write,list permissions
PORTAL_GENERATED_SAS="https://<targetstorageaccount>.blob.core.windows.net/<blob-store>?sp=racwl&st=2021-06-10T21:10:38Z&se=2021-06-11T05:10:38Z&spr=https&sv=2020-02-10&sr=c&sig=<key-material>"
Planen des Shellskripts
Der folgende Crontabeintrag ist eine einzelne Zeile und wird um 12:05 Uhr ausgeführt azacsnap
. Beachten Sie den Aufruf von snapshot-to-blob.sh
zur Übergabe des Namens und des Präfixes der Momentaufnahme:
5 0 * * * ( . ~/.bash_profile ; cd /home/azacsnap/bin ; ./azacsnap -c backup --volume data --prefix daily --retention 1 --configfile HANA.json --trim --ssl openssl --runafter 'env ; ./snapshot-to-blob.sh $azSnapshotName $azPrefix')
Wiederherstellen aus Azure Blob Storage
Das Wiederherstellen aus einem dieser Archive, die in Azure Blob Storage auf hoher Ebene gespeichert sind, ist wie folgt:
- Kopieren Sie das Momentaufnahmearchiv zurück auf den lokalen Computer. Der Zielspeicherort sollte von den Datenbankdateien getrennt sein und mit ausreichender Kapazität, um das Dateiarchiv und die Extraktion zu ermöglichen, z. B
/var/tmp
. . .- Wenn sie das Archiv mithilfe des
--runafter
Beispielshellskripts erstellt haben, können sie den gzipierten Tarball möglicherweise direkt aus Azure Blob Storage mithilfe einer AzCopy-Pipe zum Extrahieren extrahieren, z. B.:cd ${TARGET_DIRECTORY}
azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
- Wenn sie das Archiv mithilfe des
- Extrahieren Sie den Inhalt des Momentaufnahmearchivs.
- Überprüfen Sie den Inhalt des Zielspeicherorts nach dem Extrahieren, vergleichen Sie Dateiberechtigungen und Besitzer mit den ursprünglichen Datenbankdateien.
- Führen Sie
ls -lR
z. B. die Folgenden aus.
- Führen Sie
- Beenden Sie die Datenbankserverprozesse.
- Kopieren Sie die Dateien aus dem Zielspeicherort, der in Schritt 1 wieder an ihren ursprünglichen Speicherort wiederhergestellt wurde.
- Fahren Sie mit dem normalen Datenbankwiederherstellungsprozess fort.