Azure 애플리케이션 일관성 스냅샷 도구를 사용하는 RunBefore 및 RunAfter
이 문서에서는 Azure NetApp Files와 함께 사용할 수 있는 Azure Application Consistent Snapshot 도구의 --runbefore
및 --runafter
기능을 사용하기 위한 가이드를 제공합니다.
소개
AzAcSnap은 각각 --runbefore
또는 --runafter
옵션을 사용하여 기본 실행 전후에 외부 명령을 실행할 수 있습니다.
--runbefore
는 azacsnap의 주 실행 전에 셸 명령을 실행하고 셸 환경에 azacsnap 명령줄 매개 변수 중 일부를 제공합니다.
기본적으로 azacsnap
외부 셸 명령이 완료되기까지 최대 30초 동안 기다린 후 프로세스를 종료하고 azacsnap 일반 실행으로 돌아갑니다.
이 지연은 %
문자 뒤에 대기할 숫자(예: --runbefore "mycommand.sh%60"
은 mycommand.sh
가 완료될 때까지 최대 60초 대기)를 추가하여 무시할 수 있습니다.
--runafter
는 azacsnap의 주 실행 후 셸 명령을 실행하고 셸 환경에 azacsnap 명령줄 매개 변수 중 일부를 제공합니다.
기본적으로 azacsnap
외부 셸 명령이 완료되기까지 최대 30초 동안 기다린 후 프로세스를 종료하고 azacsnap 일반 실행으로 돌아갑니다.
이 지연은 문자 후 %
몇 초 안에 대기할 숫자를 추가하여 재정의할 수 있습니다(예 --runafter "mycommand.sh%60"
: 완료될 때까지 최대 60초 mycommand.sh
동안 대기).
azacsnap
는 다음 환경 변수 목록을 생성하고 포크된 셸에 전달하여 매개 변수 --runbefore
--runafter
로 제공된 명령을 실행하고 다음을 수행합니다.
-
$azCommand
= -c에 전달된 명령 옵션(예: backup, test 등). -
$azConfigFileName
= 구성 파일 이름. -
$azPrefix
= --prefix 값. -
$azRetention
= --retention 값. -
$azSid
= --dbsid 값. -
$azSnapshotName
= azacsnap에서 생성한 스냅샷 이름입니다.
참고 항목
--runafter
옵션에는 $azSnapshotName
에 대한 값만 있습니다.
Azure Blob Storage에 백업하는 예제 사용
Important
예제는 정보 제공 목적으로만 제공됩니다. 제공된 정보의 정확성, 완전성 또는 유용성을 보장하지는 않습니다. 이러한 예제의 사용은 사용자 고유의 위험에 처해 있습니다. 당사는 이러한 예제의 사용으로 인해 발생할 수 있는 손실 또는 손상에 대해 어떠한 책임도 지지 않습니다. 이 설명서에 제공된 예제는 지원하지 않습니다.
이 새로운 기능에 대한 예제 사용법은 도구를 사용하여 azcopy
보관 목적으로 Azure Blob에 스냅샷을 업로드하는 것입니다(AzCopy를 사용하여 데이터를 복사하거나 Azure Storage로 이동).
Azure Blob Storage에 업로드할 셸 스크립트
이 예제 셸 스크립트에는 앞에서 설명한 시간 제한으로 인해 AzAcSnap이 외부 명령을 종료하지 못하도록 하는 특수 스탠자가 있습니다. 이 stanza를 사용하면 azcopy를 사용하여 큰 파일을 업로드하는 것과 같은 장기 실행 명령을 조기에 중지하지 않고 실행할 수 있습니다.
스냅샷은 최소 읽기 전용 권한으로 복사를 수행하는 시스템에 탑재되어야 합니다. 스냅샷 탑재 지점의 기본 위치는 스크립트의 sourceDir
변수에 제공되어야 합니다.
스냅샷은 gzipped tarball을 만드는 명령을 사용하여 tar
단일 파일로 업로드됩니다. 파일을 단일 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 항목은 한 줄이며 오전 12시 05분에 실행됩니다 azacsnap
. 스냅샷 이름과 스냅샷 접두사를 전달하는 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')
Azure Blob Storage에서 복원
Azure Blob Storage에 저장된 이러한 보관 파일 중 하나에서 상위 수준으로 복원하는 방법은 다음과 같습니다.
- 스냅샷 보관 파일을 로컬 컴퓨터에 다시 복사합니다. 예를 들어
/var/tmp
대상 위치는 데이터베이스 파일과 분리되어야 하며 파일 보관 및 추출을 허용할 수 있는 충분한 용량이 있어야 합니다.- 예제 셸 스크립트를 사용하여
--runafter
보관 파일을 만든 경우 AzCopy 파이프를 사용하여 대상 위치로 Azure Blob Storage에서 직접 gzipped tarball을 추출하여 추출할 수 있습니다. 예를 들면 다음과 같습니다.cd ${TARGET_DIRECTORY}
azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
- 예제 셸 스크립트를 사용하여
- 스냅샷 보관의 내용을 추출합니다.
- 파일 사용 권한 및 소유권을 원래 데이터베이스 파일과 비교하여 추출한 후 대상 위치의 내용을 검토합니다.
- 예를 들어 다음을 수행합니다
ls -lR
.
- 예를 들어 다음을 수행합니다
- 데이터베이스 서버 프로세스를 종료합니다.
- 1단계에서 복원된 대상 위치의 파일을 원래 위치로 다시 복사합니다.
- 일반적인 데이터베이스 복구 프로세스를 진행합니다.