[써보니어때?/백업] 스크립트를 이용한 백업 (Backup Script)


본 사용자리뷰는 쉐어드IT 리뷰이벤트 “써보니 어때?”를 통해  wansoo 회원님께서 작성해 주신 내용입니다.

 

스크립트를 이용한 백업

다양한 상황에 따른 스크립트를 이용한 백업을 활용하고 있는데, 몇 가지 내용들을 정리해 보았습니다.

다른 명령을 이용한 더 좋은 다양한 방법들이 있겠지만, 제시한 내용들을 참고하여 다른 응용 기법을 찾아내는데 참고 자료로 활용될 수도 있지 않을까 하는 생각을 합니다.

스크립트 내용들은 실제 업무에 사용하고 있는 그대로를 제시하지는 않았으며, 일반 업무에 수정하여 적용할 수 있도록 수정되었음을 참고해 주시기 바랍니다.

이어 지는 내용들은 스크립트/배치파일 내용 중심으로 해서 설명하는 내용으로 진행하겠습니다.

먼저, 윈도(서버포함)에서 xcopy를 이용해서 이전 백업 이후로 변경된 내용들만을 추가로 복사하는 배치 파일부터 시작하겠습니다.

방대한 작은 이미지 파일들이 존재하고 매일 추가로 파일들이 계속적으로 생성될 때 전체 자료를 복사하기엔 자료량이 너무 많을 경우 매일 변경된 내용만 백업 받을 때 활용한다면 도움되지 않을까 하는 생각입니다.

1. Windows(DOS) xcopy backup

Batch File 명 : xbackup.bat
작동 방식 : date.txt file에 기록된 백업 일자 이후로 변경된 파일 복사.
매 작업 진행 후 date.txt 갱신 저장
참고 : 아래 batch file에서 rem으로 시작하는 라인은 주석(remark) 처리임

==========================================================
for /F %%a in ( ‘type d:\date.txt’ ) do set bdate=%%a
rem d: 드라이브의 date.txt에 기록되어 있는 백업 일자를 읽어서 bdate 변수에 저장
rem d:\date.txt file내에 백업시작 일자를 월-일-년도 형식으로 기록되어 있어야 함
rem date.txt file이 비정상적이라면 xbackup.bat 첫 실행시 xcopy 작동하지 않으나,
rem xbackup.bat 작업 종료 전에 date.txt file을 항상 갱신하기 때문에
rem 두번째 xbackup.bat 실행시 부터 정상 작동됨 ( 첫 실행시 date.txt 확인 필요 )

for /f “tokens=1-3 delims=- ” %%A in (‘echo %DATE%’) do (SET YYYY=%%A&SET MM=%%B&SET DD=%%C)
rem %DATE%를 echo해서 백업 시작일자 읽어 년, 월, 일을 “-“를 구분으로 분리하여
rem 년도를 YYYY, 월을 MM, 일을 DD 변수에 각각 저장 (위 명령은 한줄에 이어짐)

xcopy /S /Y /D:%bdate% C:\data\*.* “d:\backup\”
rem c:\data 아래에 있는 하위 폴더(/S)들을 대상 파일을 덮어 씌울지 묻지 않고(/Y)
rem 이전 백업 일자 이후에 변경된 내용들 모두를 d:\backup에 복사함
rem 복사해야할 폴더가 여러개 있다면 위와 같은 형식으로 각줄에 반복적으로 나열함
rem 경로명에 빈칸이 있을 경우 “”로 묶어 주고, 빈칸이 없을 경우 상관없음

echo %MM%-%DD%-%YYYY% > d:\date.txt
rem 월-일-년도 형식의 백업 시작 일자를 d:\date.txt file에 기록하여 백업한 일자 갱신
==========================================================

vista 및 2008 이상이라면 위의 xcopy 대신, OS에 기본 포함된 robocopy를 이용해서 아래 예와 같이 한 줄로 간략히 처리할 수도 있을 것 같네요.

2. Windows robocopy backup
Batch File 명 : roboback.bat
======================
robocopy c:\src d:\backup\
======================

다들 아시겠지만, 윈도에서 작성된 배치파일을 정기적으로 자동 실행되게 하려면 작업 스케줄러에 등록해서 사용하면 되겠지요.
[시작] -> [제어판] -> [관리 도구] -> [작업 스케줄러]

%eb%b0%b1%ec%97%85%ec%8a%a4%ed%81%ac%eb%a6%bd%ed%8a%b8

 

3. Windows 압축 프로그램 7zip 사용한 백업 ( http://www.7-zip.org )
Batch File 명 : 7zipback.bat
=================================================
set bdate=%date%
rem 일자 문자열 설정

set bdir=D:\backup\
rem 백업 저장할 디렉터리 문자열 설정

set bpath=%bdir%back_%bdate%.zip
rem 백업 저장할 전체 경로( 디렉터리 + 파일명 ) 문자열 설정

“c:\Program files\7-zip\7z” a -r “%bpath%” c:\src
rem c:\src 하위 폴더를 포함한 전체 자료를 bpath에 설정한 문자열 경로에 압축 백업

rem “C:\Program Files\Bandizip\7z\7z” a -r “%bpath%” c:\src
rem 반디집이 설치되어 있을 경우라면 바로 위 주석 명령문으로 변경 사용하면 됨
rem ( https://www.bandisoft.co.kr )
=================================================

 

4. Windows에서 MS-SQL DB를 다른 컴퓨터의 공유 폴더로 압축 백업

Batch File 명 : sqlback.bat
==================================================

“C:\Program Files\Microsoft SQL Server\90\Tools\Binn\sqlcmd” -S localhost -E –i D:\script\backup.sql
rem d:\script\ folder에 저장된 backup.sql 실행, MS-SQL DB 백업되어 저장되게 됨
rem ( 위 명령줄은 한줄에 이어져 있음 )

net use z: \\192.168.0.10\backup /user:userid “passwd“
rem 192.168.0.10의 backup 공유 폴더를 z: 드라이브에 연결
rem ( id: userid, password: passwd )

for %%a in ( d:\backup\*.BAK ) do set b=%%~fa
rem d:\backup\ folder에서 확장자가 .BAK인 file list 중
rem 마지막 한 개 file의 전체 경로명으로 b 변수에 저장
rem 매일 백업 받는다 가정한다면 해당 folder에 .BAK file이 한 개 있을 것임

“c:\Program files\7-zip\7z” a z:\%b:~10,12%.zip %b%
rem 앞 for 명령에 의해 확인한 마지막 .BAK file에 대해 z:\에 압축 저장
rem 압축 file명은 전체 파일 경로 문자 중 10번째에서 12글자에 zip 확장자 붙임
rem ex) D:\backup\sql_20161019.BAK 일 경우라면 sql_20161010.zip이 됨

if exist z:\%b:~10,12%.zip del %b%
rem 정상적으로 압축 저장되어 해당 file이 존재한다면 원본 file을 삭제 함

net use /delete z: /y
rem Network으로 연결한 Z Driver를 연결 해제함
===========================================================

위 배치 file에서 실행한 MS-SQL용 Script는 아래와 같음
SQL Script File 명 : backup.sql
===========================================================
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @datetime NVARCHAR(20)
SELECT @datetime = REPLACE(CONVERT(VARCHAR,GETDATE(),111),’/’,”)
set @sqlCommand = ‘BACKUP DATABASE [dbname] TO DISK = N”D:\backup\sql_’ + @datetime + ‘.BAK” WITH NOFORMAT, NOINIT, NAME = N”전체 데이터베이스 백업”, SKIP, NOREWIND, NOUNLOAD, STATS = 10’
EXECUTE sp_executesql @sqlCommand
GO
===========================================================
MS-SQL이 설치된 서버에서 실행하는 방식이며, 백업 받을 database는 dbname

 

5. 원격 서버의 Oracle DB를 Windows 컴퓨터에서 7개 폴더에 번갈아 백업

Batch File 명 : oraback.bat
===========================================================
d:
rem D driver로 이동 ( 백업 script가 d:\scripts에 저장되어 있음 )
cd \scripts
rem \scripts로 경로 변경

sqlplus -SILENT [email protected] @backup.sql
rem 백업 배치 file을 생성하는 Oacle SQL script인 backup.sql 실행
rem id: userid, password : passwd, 서버의 호스트 명: hostname

oraback.cmd
rem 위의 sql script에 의해 생성된 백업 명령을 실행시킴
===========================================================

Oracle SQL script 명 : backup.sql
===========================================================
set tab off
set pagesize 0
set linesize 300
set feedback off termout off

spool oraback.cmd
select ‘exp [email protected] file = d:\backup\’||mod(to_number(to_char(sysdate,’yyyymmdd’)),7)||’\oraback.dmp’||’ ‘
||’log= d:\backup\’||mod(to_number(to_char(sysdate,’yyyymmdd’)),7)||’\ora_’||to_char(sysdate,’yyyymmddhh24miss’)||’.log’|| chr(10)
from dual;
spool off
quit
===========================================================
※ 오라클 exp를 사용한 백업을 이용하였고, expdp 명령 사용시 내용 수정 필요함.
※ d:\backup folder에 0~6까지의 하위 폴더가 준비되어 있어야 함

6. Windows에서 Oracle DB 백업( 같은 폴더에 백업, 최근 4개 본만 보존 )
Batch File 명 : ora_bak.bat
===========================================================
@ECHO OFF
rem 배치 파일의 명령어들을 화면 표시하지 않기 위해 echo off
rem 앞에 붙은 @은 echo off 명령이 화면에 표시되지 않게 하기 위함

IF EXIST d:\backup\ora_bak2.dmp (
MOVE /Y d:\ora_bak2.dmp d:\backup\ora_bak3.dmp
rem ora_bak2.dmp file이 존재할 경우 ora_bak3.dmp로 파일명 변경
) ELSE (
ECHO d:\ora_bak2.dmp file 존재하지 않음
)
IF EXIST d:\backup\ora_bak1.dmp (
MOVE /Y d:\ora_bak1.dmp d:\backup\ora_bak2.dmp
rem ora_bak1.dmp file이 존재할 경우 ora_bak2로 파일명 변경
) ELSE (
ECHO d:\ora_bak1.dmp file 존재하지 않음
)
IF EXIST d:\backup\ora_bak.dmp (
MOVE /Y d:\ora_bak.dmp d:\backup\ora_bak1.dmp
rem ora_bak.dmp file이 존재할 경우 ora_bak1으로 파일명 변경
) ELSE (
ECHO d:\ora_bak.dmp file 존재하지 않음
)
rem 최근 4개 백업 본이 보존되게 하기 위해 file 명 변경 처리

c:\app\Administrator\product\11.2.0\dbhome_1\BIN\EXP.EXE [email protected] file=d:\backup\ora_bak.dmp
rem export 명령으로 백업 실행
===========================================================

 

7. Linux에서 Oracle DB를 윈도 공유 폴더에 백업 (최근 7개 백업본 보존)

SH Script File 명 : ora_bak.sh
참고 : Linux script에서 #으로 시작되는 줄은 주석 처리됨 ( 배치 file의 rem과 동일 )
단, 첫줄의 #! 은 실행에 사용될 shell 설정임

===========================================================
#!/bin/sh
# /bin/sh shell을 사용하여 스크립트가 실행되도록 설정

mkdir /backDB
#백업용으로 사용될 네트워크 공유 폴더를 마운트하기 위한 디렉터리 생성

mount -t cifs //192.168.0.11/backup /backDB -o username=userid,passwor
d=passwd
#192.168.0.11 컴퓨터에 공유된 backup 폴더를 /backDB 디렉터리에 마운트 시킴
#공유 폴더에 접근하기 위한 계정은 userid 이고, 암호는 passwd 일 경우

if [ -f /backDB/ora_bak.dmp6 ] then
rm /backDB/ora_bak.dmp6
fi
#ora_bak.dmp6 file이 존재할 경우 삭제

if [ -f /backDB/ora_bak.dmp5 ] then
mv /backDB/ora_bak.dmp5 /backDB/ora_bak.dmp6
fi
# ora_bak.dmp5가 존재할 경우 ora_bak.dmp6으로 변경

if [ -f /backDB/ora_bak.dmp4 ] then
mv /backDB/ora_bak.dmp4 /backDB/ora_bak.dmp5
fi
# ora_bak.dmp4가 존재할 경우 ora_bak.dmp5로 변경

if [ -f /backDB/ora_bak.dmp3 ] then
mv /backDB/ora_bak.dmp3 /backDB/ora_bak.dmp4
fi
# ora_bak.dmp3이 존재할 경우 ora_bak.dmp5로 변경

if [ -f /backDB/ora_bak.dmp2 ] then
mv /backDB/ora_bak.dmp2 /backDB/ora_bak.dmp3
fi
# ora_bak.dmp2가 존재할 경우 ora_bak.dmp3으로 변경

if [ -f /backDB/ora_bak.dmp1 ] then
mv /backDB/ora_bak.dmp1 /backDB/ora_bak.dmp2
fi
# ora_bak.dmp1이 존재할 경우 ora_bak.dmp2로 변경

if [ -f /backDB/ora_bak.dmp ] then
mv /backDB/ora_bak.dmp /backDB/ora_bak.dmp1
fi
# ora_bak.dmp가 존재할 경우 ora_bak.dmp1로 변경
# 기존 백업 file을 보존하기 위한 이름 변경 작업

export ORACLE_HOME=/oracle/product/11g/db_1
#Oralce 홈디렉토리 설정
export ORACLE_SID=ora_sid
#Oracle SID 설정
export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949;
#Oracle에 사용될 언어 설정
#위 3개 명령은 Oracle exp 명령을 위한 환경 설정

day=$(date +%Y%m%d )
#log file명에 사용될 일자 설정
lname=/backDB/ora_back-$day
#log file명으로 사용할 문자열 설정

/oracle/product/11g/db_1/bin/exp userid/passwd file = /backDB/ora_bak.dmp log= $lname
#Export backup 받음

umount /backDB
#마운트 시켰던 네트워크 folder를 마운트 해제함
rmdir /backDB
#마운트 시키기 위해 생성했던 디렉터리를 삭제함
===============

참고)
리눅스에서 작성된 스크립트를 정기적으로 자동 실행되게 하려면 crontab에 등록해서 사용하면 되겠지요.
#>crontab –e 명령 후,
===============
00 03 * * * /script/ora_bak.sh
===============
crontab에 스케줄 등록 방식은 “분 시 일 월 주 명령” 형식으로 각 줄에 입력하면 되고요.
스크립트가 실행되게 하려면, chmod a+x ora_bak.sh 형식의 명령으로 실행 권한을 부여해 주어야 할 거고요.

 

8. Linux에서 생성된 file, 일자별 압축 백업 ( 하루 동안 변경된 파일들만 )

SH Script File 명 : gzback.sh
================================================================
#! /bin/sh
mkdir /bak
# 마운트 시킬 /backup directory 생성

smbmount //192.168.0.13/backup /bak -o username=userid,password=passwd
#samba를 이용하여 windows의 공유 폴더를 /bak directory에 마운트 시킴

day=$(date +%Y%m%d )
#file명에 사용할 일자 문자열 설정

fn=bk_$day”.tar.gz“
#file명 문자열 설정

pn=/bak/$fn
#백업될 압축 파일의 전체 경로 문자열 설정

cd /data
#백업 받을 자료가 있는 경로로 이동

find . -mtime -1 -type f -print0 | xargs -0 tar czvf $pn > $pn”.log“
# 1일 이내에 변경된 file list를 생성하여 tar을 이용해 압축하여 묶음

umount /bak
# 마운트해제

rmdir /backup
# 사용 끝난 임시 디렉터리 삭제
======================================================

9. Linux에서 특정 디렉터리 하위의 각 디렉터리들을 각각의 file로 압축 백업
SH Script File 명 : dirbackup.sh
참고 : 작은 file들이 굉장히 많은 하위 디렉터리들에 나눠 저장되어 있고,
전체 용량이 엄청 큰 용량이라 전체를 한 개 file로 압축하기 어려운 경우
======================================================
mkdir /back
mount -t cifs //192.168.0.17/backup/dir /back –o username=userid, password=passwd
#192.168.0.17 windows 컴퓨터의 /backup 공유 폴더 하위의 dir folder를 /back에 mount
# 공유 폴더 계정 id : userid, 암호: passwd

cd /data/images
# 백업 받을 디렉터리들이 있는 부모 디렉터리로 이동

ls -l | awk ‘{a=$9; tfile=”/back/” a “.tar.gz”; cmd=”tar -czf ” tfile ” ” a; if ( substr(a,1,3) == “IMG”) {system(cmd)} }’
#ls –l 명령으로 출력된 결과의 공백으로 구분된 9번째 내용이 file(디렉터리) 명
#백업 받을 하위 file(directory)에서 첫 3글자가 IMG인 List에 대해서
#“tar –czf /back/file(디렉터리)명.tar.gz file(디렉터리)명”형식의 명령 수행 백업

umount /back
rmdir /back
======================================================

10. Linux에서 두 Windows 컴퓨터 사이의 백업

SH Script File 명 : cpback.sh
참고 : 백업 source인 windows 컴퓨터의 공유 폴더 자료를
백업 target인 다른 windows 컴퓨터의 공유 폴더로 복사 백업
======================================================
#!/bin/csh
mkdir /baksrc
#backup source 마운트를 위한 디렉터리 생성
mkdir /baktgt
#backup target 마운트를 위한 디렉터리 생성

smbmount “//192.168.0.15/data source” /baksrc –o username=userid,password=passwd
#백업 받을 원본 디렉토리 연결

smbmount //192.168.0.217/backup /baktgt –o username=tusr,password=passwd
#백업 받을 대상 디렉토리 연결

cd /baksrc
#마운트된 백업할 자료가 있는 디렉터리로 이동

find . -anewer /baksrc/flag -type f -print0 -exec cp {} /baktgt \;
#이전 백업시 수정한 /baksrc/flag file을 참조하여 flag file 이후에 변경된 file을 복사

touch /baksrc/flag
#백업 flag file 재 설정

umount /baksrc
rmdir /baksrc
umount /baktgt
rmdir /baktgt
# 대상 디렉터리들을 마운트 해제하고 제거
===========================================================
위 방식은 백업 시작에서 종료 시점 사이에 발생된 file이 누락될 수 있다는 단점이 있기 때문에 백업 시간 동안에 자료 변경 작업이 없을 경우에 활용하는 것이 좋음

 

11. Linux에서 다른 Linux의 디렉터리 자료 rsync 동기화 백업

SH Script File 명 : rsyncback.sh
참고 : 다른 리눅스 디렉터리를 마운트 시키기 위해 NFS 사용
===========================================================
rsync -arvuh –progress /l_data /r_data/
#진행 상황을 표시하기 위해 –progress option 사용
#/l_data의 자료를 원격 컴퓨터 디렉토리를 마운트 시킨 /r_data directory로 동기화
===========================================================

NFS Mount 하기 위해서 공유할 컴퓨터에서 NFS 설정과 NFS 서비스를 구동해 줘야함
– NFS 설정 : /etc/exports file을 신규 생성하거나 수정하여
마운트 허용할 컴퓨터와 디렉터리를 등록시킴
예를 들어 /data directory를 192.168.0.6, 192.168.0.7 컴퓨터에 허용할 경우
/data 192.168.0.6(rw,no_root_squash) 192.168.0.7(rw,no_root_squash)
와 같이 내용을 입력하고 저장함
– NFS와 PortMap 서비스를 시작 :
/etc/init.d/nfs start, /etc/init.d/portmap start (이미 구동 중일땐 restart )
– mount 시킴 : mount –t nfs 192.168.0.5:/data /r_data

 

12. Linux에서 tar로 백업된 많은 .tar file을 일괄 복구

SH Script File 명 : tarrestore.sh
===========================================================
cd /data
#복구할 directory로 이동
for i in $( ls /backup/*.tar ) ; do
# /backup 디렉터리에 있는 모든 .tar file을 대상으로 작업 진행
tar xvf $i
# 각 .tar file에 대해 복구 작업
done
===========================================================

 

13. Linux에서 tar과 gzip으로 압축 백업된 많은 tar.gz file을 일괄 복구
( 압축file .gz 유지: gzip은 압축해제시 기본적으로 .gz file을 삭제됨 )
SH Script File 명 : gzrestore.sh
===========================================================
mkdir /back
#백업되어 있는 folder를 마운트하기 위한 디렉터리 생성
mount -t cifs //192.168.0.17/backup/dir /back –o username=userid, password=passwd
#192.168.0.17 windows 컴퓨터의 /backup 공유 폴더 하위의 dir folder를 /back에 mount
# 공유 폴더 계정 id : userid, 암호: passwd

mkdir –p /data/images
#복구할 디렉터리를 생성함( -p 옵션으로 상위 디렉터리까지 함께 생성 )

cd /data/images
# 복구할 디렉터리로 이동

for i in $( ls /back/*.gz ) ; do
#압축 backup된 /back 디렉터리에 있는 .gz file 모두에 대해 복구 진행
gunzip -c $i | tar xv
#백업된 원본 .gz file을 삭제하지 않고 file을 추출해냄(하위 디렉터리까지 함께 생성)
done

umount /back
rmdir /back
============================================================

위에서 리눅스라고 언급했지만 리눅스는 유닉스(솔라리스, HP-UX,…), 맥 OS/X 등과 유사하기 때문에 리눅스 방식에서 설명한 내용들과 거의 비슷한 방식으로 타 OS들에서도 사용 가능하리라 생각합니다.

위 예제들에서 Windows 컴퓨터들 사이의 공유 폴더 접근, 리눅스에서 윈도 공유 폴더 접근, 리눅스 컴퓨터들 사이의 공유 디렉터리 접근 방법들은 제시되었으나, 윈도 컴퓨터에서 리눅스 컴퓨터 디렉터리에 접근하는 방법에 대해서는 나오지 않는데요…
리눅스 컴퓨터의 디렉터리를 윈도에 공유해 주기 위해서 널리 이용되는 방법은 samba 서버를 이용하는 방법이지요.
samba를 이용해서 리눅스 디렉터리를 공유한다면 리눅스 디렉터리를 윈도우 공유 폴더와 똑같은 방식으로 접근할 수 있는데, 다음에 기회가 된다면 samba 서버 설치/설정 방법과 리눅스 RAID 구성 관련한 자료도 한 번 만들어 볼까 하는 생각이 듭니다.

About SharedIT

SharedIT

Leave a Reply

6 개의 댓글이 있습니다 - "[써보니어때?/백업] 스크립트를 이용한 백업 (Backup Script)"

메일 알림 설정
정렬:   최신 | 오래된 | 추천
고속주행

소중한 정리 감사드립니다 저에게도 큰 도움이 될 것 같네요@.@

wansoo

예~ 고맙습니다.

체크리스트

대박 정리 입니다. 참고해서 활용해 볼께요 감사합니다 ^^

wansoo

고맙습니다~ 도움될 수 있길 바랍니다.

werther20

wansoo님 멋집니다^^*~ 좋은자료 잘봤습니다.

wansoo

고맙습니다~ ^^*

wpDiscuz