Поделиться через


RunBefore и RunAfter с помощью средства приложение Azure согласованного моментального снимка

В этой статье содержится руководство по использованию --runbefore средства --runafter приложение Azure согласованного моментального снимка, которое можно использовать с Azure NetApp Files.

Введение

AzAcSnap может выполнять внешние команды до или после его основного выполнения с помощью параметров --runbefore или --runafter соответственно.

--runbefore выполняет команду оболочки перед основным выполнением azacsnap и предоставляет некоторые параметры командной строки azacsnap в среде оболочки. По умолчанию ожидает до 30 секунд завершения команды внешней оболочки перед убийством процесса и возвратом к обычному выполнению azacsnap azacsnap. Эта задержка может быть переопределена путем добавления числа для ожидания в секундах после символа % (например, --runbefore "mycommand.sh%60" ожидается до 60 секунд до mycommand.sh завершения).

--runafter выполняет команду оболочки после основного выполнения azacsnap и предоставляет некоторые параметры командной строки azacsnap в среде оболочки. По умолчанию ожидает до 30 секунд завершения команды внешней оболочки перед убийством процесса и возвратом к обычному выполнению azacsnap azacsnap. Эта задержка может быть переопределена путем добавления числа для ожидания в секундах после символа % (например, --runafter "mycommand.sh%60" будет ожидать до 60 секунд до mycommand.sh завершения).

azacsnap создает следующий список переменных среды и передает их в оболочку, вилированную для выполнения команд, предоставленных в качестве параметров --runbefore и --runafter:

  • $azCommand = параметр команды, переданный в -c (например, резервное копирование, тестирование и т. д.).
  • $azConfigFileName = имя файла конфигурации.
  • $azPrefix = значение префикса --.
  • $azRetention = значение --retention.
  • $azSid = значение --dbsid.
  • $azSnapshotName = имя моментального снимка, созданное azacsnap.

Примечание.

В параметре --runafter имеется только значение$azSnapshotName.

Пример использования для резервного копирования в хранилище BLOB-объектов Azure

Внимание

Примеры предоставляются только для информационных целей. Мы не гарантируем точность, полноту или полезность предоставленных сведений. Использование этих примеров находится под собственным риском. Мы не принимаем никакой ответственности за какие-либо потери или ущерб, которые могут возникнуть из использования этих примеров. Мы не предлагаем поддержку примеров, приведенных в этой документации.

Пример использования этой новой функции — отправка моментального снимка в БОЛЬШОЙ двоичный объект Azure для архивации с помощью средства (копирование или перемещение данных в служба хранилища Azure с помощью azcopy AzCopy).

Скрипт оболочки для отправки в хранилище BLOB-объектов Azure

В этом примере скрипт оболочки имеет специальный стэнза в конце, чтобы предотвратить убийство внешней команды AzAcSnap из-за времени ожидания, описанного ранее. Эта стэнза позволяет выполнять длинную команду, например отправку больших файлов с помощью azcopy, без преждевременной остановки.

Моментальные снимки должны быть подключены к системе, выполняющей копирование, с минимальными привилегиями только для чтения. Базовое расположение точки подключения моментальных снимков должно быть предоставлено sourceDir переменной в скрипте.

Моментальный снимок передается в виде одного файла с помощью tar команды для создания gzipped tarball. Помещая файлы в один tarball, сохраняет разрешения и владение файлами, в противном случае передача файлов по отдельности теряет эти атрибуты.

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 содержит следующий пример ключа SAS (содержимое изменено для безопасности):

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>"

Планирование скрипта оболочки

Следующая запись crontab является одной строкой и работает azacsnap в 12:05 утра. Обратите внимание на вызов передачи snapshot-to-blob.sh имени моментального снимка и префикса моментального снимка:

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')

Восстановление из хранилища BLOB-объектов Azure

Восстановление из одного из этих архивов, хранящихся в хранилище BLOB-объектов Azure на высоком уровне, выглядит следующим образом:

  1. Скопируйте архив моментальных снимков обратно на локальный компьютер. Целевое расположение должно быть отдельно от файлов базы данных и достаточно емкости, чтобы обеспечить архив файлов и извлечение, например /var/tmp.
    1. Если они создали архив с помощью --runafter примера скрипта оболочки, то они могут извлечь gzipped tarball непосредственно из хранилища BLOB-объектов Azure в целевое расположение с помощью канала AzCopy для извлечения, например:
      1. cd ${TARGET_DIRECTORY}
      2. azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
  2. Извлеките содержимое архива моментальных снимков.
  3. Просмотрите содержимое целевого расположения после извлечения, сравнения разрешений файла и владения исходными файлами базы данных.
    1. Например, сделайте ls -lRэто.
  4. Завершите работу процессов сервера базы данных.
  5. Скопируйте файлы из целевого расположения, восстановленного на шаге 1 обратно в исходное расположение.
  6. Продолжайте обычный процесс восстановления базы данных.

Следующие шаги