RunBefore och RunAfter med verktyget Azure Application Consistent Snapshot
Den här artikeln innehåller en guide för att använda --runbefore
och --runafter
funktionen för verktyget Azure Application Consistent Snapshot som du kan använda med Azure NetApp Files.
Introduktion
AzAcSnap kan köra externa kommandon före eller efter huvudkörningen med hjälp av alternativen --runbefore
eller --runafter
respektive.
--runbefore
kör ett gränssnittskommando innan huvudkörningen av azacsnap och tillhandahåller några av kommandoradsparametrarna azacsnap till shell-miljön.
Som standard azacsnap
väntar upp till 30 sekunder på att kommandot externt gränssnitt ska slutföras innan processen dödas och återgår till normal körning av azacsnap.
Den här fördröjningen kan åsidosättas genom att lägga till ett tal som ska vänta i sekunder efter ett %
tecken (till exempel --runbefore "mycommand.sh%60"
väntar upp till 60 sekunder på mycommand.sh
att slutföras).
--runafter
kör ett gränssnittskommando efter huvudkörningen av azacsnap och tillhandahåller några av kommandoradsparametrarna azacsnap till shell-miljön.
Som standard azacsnap
väntar upp till 30 sekunder på att kommandot externt gränssnitt ska slutföras innan processen dödas och återgår till normal körning av azacsnap.
Den här fördröjningen kan åsidosättas genom att lägga till ett tal att vänta i sekunder efter ett %
tecken (till exempel --runafter "mycommand.sh%60"
väntar i upp till 60 sekunder för mycommand.sh
att slutföra).
azacsnap
genererar följande lista över miljövariabler och skickar dem till gränssnittets förgrening för att köra kommandona som anges som parametrar till --runbefore
och --runafter
:
-
$azCommand
= kommandoalternativet som skickades till -c (till exempel säkerhetskopiering, test osv.). -
$azConfigFileName
= konfigurationsfilens namn. -
$azPrefix
= --prefix-värdet. -
$azRetention
= värdet --retention. -
$azSid
= värdet --dbsid. -
$azSnapshotName
= namnet på ögonblicksbilden som genereras av azacsnap.
Kommentar
Det finns bara ett värde för $azSnapshotName
i --runafter
alternativet .
Exempel på användning för att säkerhetskopiera till Azure Blob Storage
Viktigt!
Exempel tillhandahålls endast i informationssyfte. Vi garanterar inte riktigheten, fullständigheten eller användbarheten av någon information som tillhandahålls. Användningen av dessa exempel är på egen risk. Vi tar inget ansvar för förlust eller skada som kan uppstå vid användning av dessa exempel. Vi erbjuder inte stöd för exemplen i den här dokumentationen.
Ett exempel på användning för den här nya funktionen är att ladda upp en ögonblicksbild till Azure Blob i arkiveringssyfte med hjälp av azcopy
verktyget (Kopiera eller flytta data till Azure Storage med hjälp av AzCopy).
Shell-skript som ska laddas upp till Azure Blob Storage
Det här exempelskriptet har en särskild strof i slutet för att förhindra att AzAcSnap dödar det externa kommandot på grund av den timeout som beskrevs tidigare. Den här strofen gör att ett tidskrävande kommando, till exempel att ladda upp stora filer med azcopy, kan köras utan att stoppas i förtid.
Ögonblicksbilderna måste monteras på systemet som gör kopian, med minst skrivskyddad behörighet. Basplatsen för monteringspunkten för ögonblicksbilderna ska anges för variabeln sourceDir
i skriptet.
Ögonblicksbilden laddas upp som en enda fil med hjälp tar
av kommandot för att skapa en gzipped tarball. Om du placerar filerna i en enda tarball behålls filbehörigheterna och ägarskapet, annars förlorar uppladdningen av filerna individuellt dessa attribut.
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 innehåller följande exempel på SAS-nyckel (innehåll har ändrats för säkerhet):
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>"
Schemalägga shell-skriptet
Följande crontab-post är en enda rad och körs azacsnap
kl. 12:05. Observera anropet till att snapshot-to-blob.sh
skicka ögonblicksbildens namn och prefix för ögonblicksbild:
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')
Återställa från Azure Blob Storage
Återställning från ett av dessa arkiv som lagras i Azure Blob Storage på en hög nivå är följande:
- Kopiera tillbaka ögonblicksbildarkivet till den lokala datorn. Målplatsen ska vara separat från databasfilerna och med tillräckligt med kapacitet för filarkivet och extrahering, till exempel
/var/tmp
.- Om de skapade arkivet med hjälp av
--runafter
exempelgränssnittsskriptet kan de eventuellt extrahera den gzipped tarballen direkt från Azure Blob Storage till målplatsen med hjälp av ett AzCopy-rör för att ta för att extrahera, till exempel:cd ${TARGET_DIRECTORY}
azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
- Om de skapade arkivet med hjälp av
- Extrahera innehållet i ögonblicksbildarkivet.
- Granska innehållet på målplatsen efter extrahering, jämföra filbehörigheter och ägarskap med de ursprungliga databasfilerna.
- Gör till exempel
ls -lR
.
- Gör till exempel
- Stäng av databasserverprocesserna.
- Kopiera filerna från målplatsen som återställdes till i steg 1 tillbaka till den ursprungliga platsen.
- Fortsätt med den normala databasåterställningsprocessen.