RunBefore en RunAfter met behulp van Azure-toepassing hulpprogramma Consistente momentopname
Dit artikel bevat een handleiding voor het gebruik van het --runbefore
hulpprogramma --runafter
Azure-toepassing Consistente momentopname die u kunt gebruiken met Azure NetApp Files.
Inleiding
AzAcSnap kan externe opdrachten uitvoeren vóór of na de hoofduitvoering met behulp van de opties --runbefore
of --runafter
respectievelijk.
--runbefore
voert een shell-opdracht uit vóór de hoofduitvoering van azacsnap en biedt enkele van de opdrachtregelparameters van azacsnap aan de shell-omgeving.
Wacht standaard azacsnap
tot 30 seconden totdat de externe shell-opdracht is voltooid voordat het proces wordt afgesloten en terugkeert naar de normale uitvoering van azacsnap.
Deze vertraging kan worden overschreven door een getal toe te voegen dat in seconden na een %
teken moet worden gewacht (bijvoorbeeld --runbefore "mycommand.sh%60"
wacht maximaal 60 seconden voordat mycommand.sh
het is voltooid).
--runafter
voert een shell-opdracht uit na de hoofduitvoering van azacsnap en biedt enkele van de opdrachtregelparameters van azacsnap aan de shell-omgeving.
Wacht standaard azacsnap
tot 30 seconden totdat de externe shell-opdracht is voltooid voordat het proces wordt afgesloten en terugkeert naar de normale uitvoering van azacsnap.
Deze vertraging kan worden overschreven door een getal toe te voegen dat in seconden moet worden gewacht na een %
teken (wacht bijvoorbeeld --runafter "mycommand.sh%60"
tot 60 seconden voordat mycommand.sh
het is voltooid).
azacsnap
genereert de volgende lijst met omgevingsvariabelen en geeft deze door aan de shell forked om de opdrachten uit te voeren die zijn opgegeven als parameters aan --runbefore
en --runafter
:
-
$azCommand
= de opdrachtoptie doorgegeven aan -c (bijvoorbeeld back-up, test, enzovoort). -
$azConfigFileName
= de bestandsnaam van de configuratie. -
$azPrefix
= de --voorvoegselwaarde. -
$azRetention
= de --retentiewaarde. -
$azSid
= de waarde --dbsid. -
$azSnapshotName
= de naam van de momentopname die is gegenereerd door azacsnap.
Notitie
Er is alleen een waarde voor $azSnapshotName
in de --runafter
optie.
Voorbeeld van gebruik om een back-up te maken van Azure Blob Storage
Belangrijk
Voorbeelden worden alleen ter informatie verstrekt. We garanderen niet de nauwkeurigheid, volledigheid of bruikbaarheid van informatie die wordt verstrekt. Het gebruik van deze voorbeelden is op eigen risico. Wij aanvaarden geen aansprakelijkheid voor verlies of schade die kan ontstaan door het gebruik van deze voorbeelden. We bieden geen ondersteuning voor de voorbeelden in deze documentatie.
Een voorbeeld van het gebruik voor deze nieuwe functie is het uploaden van een momentopname naar Azure Blob voor archivering met behulp van het azcopy
hulpprogramma (Gegevens kopiëren of verplaatsen naar Azure Storage met behulp van AzCopy).
Shell-script voor uploaden naar Azure Blob Storage
Dit voorbeeldshellscript heeft een speciale stanza aan het einde om te voorkomen dat AzAcSnap de externe opdracht beëindigt vanwege de eerder beschreven time-out. Met deze stanza kan een langlopende opdracht, zoals het uploaden van grote bestanden met azcopy, worden uitgevoerd zonder voortijdig te worden gestopt.
De momentopnamen moeten worden gekoppeld aan het systeem dat de kopie uitvoert, met minimaal alleen-lezenrechten. De basislocatie van het koppelpunt voor de momentopnamen moet worden opgegeven voor de sourceDir
variabele in het script.
De momentopname wordt geüpload als één bestand met behulp van de tar
opdracht om een gegzipped tarball te maken. Als u de bestanden in één tarball plaatst, blijven de bestandsmachtigingen en het eigendom, anders verliest het uploaden van de bestanden afzonderlijk deze kenmerken.
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
Het saskeyFile bevat de volgende voorbeeld-SAS-sleutel (inhoud gewijzigd voor beveiliging):
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>"
Het shell-script plannen
De volgende crontab-vermelding is één regel en wordt om 12:05 uur uitgevoerd azacsnap
. Noteer de aanroep voor snapshot-to-blob.sh
het doorgeven van de naam van de momentopname en het voorvoegsel van de momentopname:
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')
Herstellen vanuit Azure Blob Storage
Het herstellen van een van deze archieven die zijn opgeslagen in Azure Blob Storage op hoog niveau is als volgt:
- Kopieer het momentopnamearchief terug naar de lokale computer. De doellocatie moet gescheiden zijn van de databasebestanden en met voldoende capaciteit om het bestandsarchief en de extractie mogelijk te maken, bijvoorbeeld
/var/tmp
.- Als ze het archief hebben gemaakt met behulp van het
--runafter
voorbeeldshellscript, kunnen ze de gegzipped tarball mogelijk rechtstreeks uit Azure Blob Storage extraheren naar de doellocatie met behulp van een AzCopy-pijp om te extraheren, bijvoorbeeld:cd ${TARGET_DIRECTORY}
azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
- Als ze het archief hebben gemaakt met behulp van het
- Pak de inhoud van het momentopnamearchief uit.
- Controleer de inhoud van de doellocatie na het extraheren, waarbij u bestandsmachtigingen en eigendom vergelijkt met de oorspronkelijke databasebestanden.
- Bijvoorbeeld.
ls -lR
- Bijvoorbeeld.
- Sluit de databaseserverprocessen af.
- Kopieer de bestanden van de doellocatie die in stap 1 is teruggezet naar de oorspronkelijke locatie.
- Ga verder met het normale herstelproces van de database.