Dela via


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:

  1. 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.
    1. 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:
      1. cd ${TARGET_DIRECTORY}
      2. azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
  2. Extrahera innehållet i ögonblicksbildarkivet.
  3. Granska innehållet på målplatsen efter extrahering, jämföra filbehörigheter och ägarskap med de ursprungliga databasfilerna.
    1. Gör till exempel ls -lR.
  4. Stäng av databasserverprocesserna.
  5. Kopiera filerna från målplatsen som återställdes till i steg 1 tillbaka till den ursprungliga platsen.
  6. Fortsätt med den normala databasåterställningsprocessen.

Nästa steg