Sdílet prostřednictvím


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í:

  1. 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.
    1. 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:
      1. cd ${TARGET_DIRECTORY}
      2. azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
  2. Extrahujte obsah archivu snímků.
  3. 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.
    1. Například udělejte ls -lR.
  4. Ukončete procesy databázového serveru.
  5. Zkopírujte soubory z cílového umístění obnoveného do kroku 1 zpět do původního umístění.
  6. Pokračujte normálním procesem obnovení databáze.

Další kroky