Udostępnij za pośrednictwem


RunBefore i RunAfter przy użyciu narzędzia aplikacja systemu Azure spójnej migawki

Ten artykuł zawiera przewodnik dotyczący korzystania z --runbefore narzędzia do tworzenia migawek spójnych na poziomie aplikacja systemu Azure, --runafter którego można używać z usługą Azure NetApp Files.

Wprowadzenie

AzAcSnap może wykonywać polecenia zewnętrzne przed lub po jego głównym wykonaniu przy użyciu opcji --runbefore lub --runafter odpowiednio.

--runbefore Uruchamia polecenie powłoki przed głównym wykonaniem azacsnap i udostępnia niektóre parametry wiersza polecenia azacsnap do środowiska powłoki. Domyślnie azacsnap trwa oczekiwanie do 30 sekund na ukończenie polecenia zewnętrznej powłoki przed zabiciem procesu i powrót do normalnego wykonania azacsnap. To opóźnienie może zostać zastąpione przez dodanie liczby do oczekiwania w sekundach po % znaku (na przykład --runbefore "mycommand.sh%60" poczeka do 60 sekund na mycommand.sh ukończenie).

--runafter Uruchamia polecenie powłoki po głównym wykonaniu azacsnap i udostępnia niektóre parametry wiersza polecenia azacsnap do środowiska powłoki. Domyślnie azacsnap trwa oczekiwanie do 30 sekund na ukończenie polecenia zewnętrznej powłoki przed zabiciem procesu i powrót do normalnego wykonania azacsnap. To opóźnienie może zostać zastąpione przez dodanie liczby do oczekiwania w sekundach po % znaku (na przykład --runafter "mycommand.sh%60" poczeka do 60 sekund na mycommand.sh ukończenie).

azacsnap Generuje następującą listę zmiennych środowiskowych i przekazuje je do rozwidlenia powłoki w celu uruchomienia poleceń podanych jako parametry do --runbefore i --runafter:

  • $azCommand = opcja polecenia przekazana do -c (na przykład kopia zapasowa, test itp.).
  • $azConfigFileName = nazwa pliku konfiguracji.
  • $azPrefix = wartość --prefiks.
  • $azRetention = wartość --retention.
  • $azSid = wartość --dbsid.
  • $azSnapshotName = nazwa migawki wygenerowana przez azacsnap.

Uwaga

Opcja zawiera tylko wartość $azSnapshotName--runafter .

Przykładowe użycie kopii zapasowej w usłudze Azure Blob Storage

Ważne

Przykłady są udostępniane tylko do celów informacyjnych. Nie gwarantujemy dokładności, kompletności ani przydatności podanych informacji. Użycie tych przykładów jest zagrożone własnym ryzykiem. Nie przyjmujemy żadnej odpowiedzialności za jakiekolwiek straty lub szkody, które mogą wynikać z użycia tych przykładów. Nie oferujemy pomocy technicznej dotyczącej przykładów podanych w tej dokumentacji.

Przykładem użycia tej nowej funkcji jest przekazanie migawki do obiektu blob platformy Azure w celach archiwalnych przy użyciu azcopy narzędzia (kopiowanie lub przenoszenie danych do usługi Azure Storage przy użyciu narzędzia AzCopy).

Skrypt powłoki do przekazania do usługi Azure Blob Storage

Ten przykładowy skrypt powłoki ma specjalny stanza na końcu, aby uniemożliwić azAcSnap zabicie zewnętrznego polecenia z powodu przekroczenia limitu czasu opisanego wcześniej. Ten stanza umożliwia uruchamianie długotrwałego polecenia, takiego jak przekazywanie dużych plików za pomocą narzędzia azcopy, bez przedwczesnego zatrzymania.

Migawki muszą być zainstalowane w systemie, wykonując kopię, z co najmniej uprawnieniami tylko do odczytu. Podstawowa lokalizacja punktu instalacji dla migawek powinna zostać dostarczona do sourceDir zmiennej w skry skrycie.

Migawka jest przesyłana jako pojedynczy plik przy użyciu tar polecenia w celu utworzenia gzipped tarball. Umieszczenie plików w jednym tarball utrzymuje uprawnienia i własność pliku, w przeciwnym razie przekazywanie plików indywidualnie traci te atrybuty.

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

Plik saskeyFile zawiera następujący przykładowy klucz SYGNATURy dostępu współdzielonego (zawartość zmieniona na potrzeby zabezpieczeń):

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

Planowanie skryptu powłoki

Następujący wpis crontab jest jednym wierszem i działa azacsnap o godzinie 12:05. Zwróć uwagę na wywołanie snapshot-to-blob.sh przekazywania nazwy migawki i prefiksu migawki:

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

Przywracanie z usługi Azure Blob Storage

Przywracanie z jednego z tych archiwów przechowywanych w usłudze Azure Blob Storage na wysokim poziomie jest następujące:

  1. Skopiuj archiwum migawek z powrotem do komputera lokalnego. Lokalizacja docelowa powinna być oddzielona od plików bazy danych i z wystarczającą pojemnością, aby umożliwić archiwizowanie plików i wyodrębnianie, na przykład /var/tmp.
    1. Jeśli utworzyli archiwum przy użyciu przykładowego --runafter skryptu powłoki, mogą one ewentualnie wyodrębnić gzipped tarball bezpośrednio z usługi Azure Blob Storage do lokalizacji docelowej przy użyciu potoku Narzędzia AzCopy do wyodrębnienia, na przykład:
      1. cd ${TARGET_DIRECTORY}
      2. azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
  2. Wyodrębnij zawartość archiwum migawek.
  3. Przejrzyj zawartość lokalizacji docelowej po wyodrębnieniu, porównując uprawnienia pliku i własność do oryginalnych plików bazy danych.
    1. Na przykład wykonaj polecenie ls -lR.
  4. Zamknij procesy serwera bazy danych.
  5. Skopiuj pliki z lokalizacji docelowej przywróconej w kroku 1 z powrotem do ich oryginalnej lokalizacji.
  6. Przejdź do normalnego procesu odzyskiwania bazy danych.

Następne kroki