RunBefore a RunAfter pomocí nástroje Aplikace Azure lication Consistent Snapshot
Tento článek obsahuje průvodce používáním --runbefore
a --runafter
schopností nástroje Aplikace Azure lication Consistent Snapshot, který můžete použít se službou Azure NetApp Files.
Úvod
AzAcSnap může spouštět externí příkazy před nebo po jeho hlavním spuštění pomocí možností --runbefore
nebo --runafter
v uvedeném pořadí.
--runbefore
spustí příkaz prostředí před hlavním spuštěním azacsnap a poskytne některé parametry příkazového řádku azacsnap prostředí.
Ve výchozím nastavení čeká až 30 sekund, azacsnap
než se příkaz externího prostředí dokončí, než proces zabije a vrátí se k normálnímu spuštění azacsnap.
Toto zpoždění lze přepsat přidáním čísla, které bude čekat v sekundách po znaku %
(například --runbefore "mycommand.sh%60"
počká až 60 sekund, než mycommand.sh
se dokončí).
--runafter
spustí příkaz prostředí po hlavním spuštění azacsnap a poskytne některé parametry příkazového řádku azacsnap prostředí.
Ve výchozím nastavení čeká až 30 sekund, azacsnap
než se příkaz externího prostředí dokončí, než proces zabije a vrátí se k normálnímu spuštění azacsnap.
Toto zpoždění lze přepsat tak, --runafter "mycommand.sh%60"
že po znaku %
přidáte číslo, které bude čekat v sekundách (například počká až 60 sekund, než mycommand.sh
se dokončí).
azacsnap
vygeneruje následující seznam proměnných prostředí a předá je prostředí forku, aby se spustily příkazy poskytnuté jako parametry --runbefore
a --runafter
:
-
$azCommand
= možnost příkazu předaná do -c (například zálohování, testování atd.). -
$azConfigFileName
= název souboru konfigurace. -
$azPrefix
= hodnota --prefix. -
$azRetention
= hodnota --retention. -
$azSid
= hodnota --dbsid. -
$azSnapshotName
= název snímku vygenerovaný azacsnap.
Poznámka:
Tato možnost má jenom hodnotu $azSnapshotName
--runafter
.
Příklad použití pro zálohování do služby Azure Blob Storage
Důležité
Příklady jsou k dispozici pouze pro informační účely. Nezaručujeme přesnost, úplnost ani užitečnost jakýchkoli poskytnutých informací. Použitítěchtoch Nepřijmeme žádnou odpovědnost za jakoukoli ztrátu nebo škodu, která může vzniknout z použití těchto příkladů. Nenabízíme podporu pro příklady uvedené v této dokumentaci.
Příkladem použití této nové funkce je nahrání snímku do objektu blob Azure pro účely archivace pomocí azcopy
nástroje (kopírování nebo přesun dat do služby Azure Storage pomocí AzCopy).
Skript prostředí pro nahrání do služby Azure Blob Storage
Tento ukázkový skript prostředí má na konci speciální stanza, která zabrání azAcSnap v zabíjení externího příkazu kvůli vypršení časového limitu popsanému výše. Tento stanza umožňuje dlouhotrvající příkaz, jako je například nahrávání velkých souborů pomocí azcopy, ke spuštění bez předčasného zastavení.
Snímky musí být připojené k systému, který provádí kopírování, s minimálními oprávněními jen pro čtení. Základní umístění přípojného bodu pro snímky by se mělo poskytnout sourceDir
proměnné ve skriptu.
Snímek se nahraje jako jeden soubor pomocí tar
příkazu k vytvoření gzipped tarballu. Když soubory umístíte do jediného tarballu, zachová se oprávnění a vlastnictví souboru, jinak se při nahrávání souborů zvlášť ztratí tyto atributy.
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
Soubor SASkeyFile obsahuje následující příklad klíče SAS (obsah se změnil pro zabezpečení):
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>"
Plánování skriptu prostředí
Následující položka crontab je jeden řádek a běží azacsnap
v 12:05. Všimněte si volání předání snapshot-to-blob.sh
názvu snímku a předpony snímku:
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')
Obnovení ze služby Azure Blob Storage
Obnovení z jednoho z těchto archivů uložených ve službě Azure Blob Storage na vysoké úrovni je následující:
- Zkopírujte archiv snímků zpět do místního počítače. Cílové umístění by mělo být oddělené od databázových souborů a s dostatečnou kapacitou, aby bylo možné archivovat soubor a extrakci, například
/var/tmp
.- Pokud vytvořili archiv pomocí ukázkového
--runafter
skriptu prostředí, můžou pravděpodobně extrahovat gzipped tarball přímo ze služby Azure Blob Storage do cílového umístění pomocí kanálu AzCopy k extrakci tar, například:cd ${TARGET_DIRECTORY}
azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
- Pokud vytvořili archiv pomocí ukázkového
- Extrahujte obsah archivu snímků.
- Po extrahování zkontrolujte obsah cílového umístění a porovnejte oprávnění souboru a vlastnictví s původními soubory databáze.
- Například udělejte
ls -lR
.
- Například udělejte
- Ukončete procesy databázového serveru.
- Zkopírujte soubory z cílového umístění obnoveného do kroku 1 zpět do původního umístění.
- Pokračujte normálním procesem obnovení databáze.