파일 전송과 동기화
scp의 파일, 디렉터리 전송과 점프서버 경유, 막힌 환경의 반입 방법, rsync의 증분 전송, 슬래시 규칙, 압축, 미러링, 제외, 전송 검증과 cron 자동 전송
#핵심 요약
scp 로컬경로 계정@서버:경로는 파일을, -r은 디렉터리를 보내지만 대상에 같은 파일이 있어도 매번 전부 다시 보냄
rsync -av는 두 위치를 비교해 바뀐 파일만 보내므로 두 번째 전송부터 크게 빨라짐
소스 경로 끝의 / 유무에 따라 "내용물"을 보낼지 "디렉터리째" 보낼지가 달라짐
--delete는 소스에 없는 대상 파일을 지우므로 반드시 --dry-run으로 먼저 봄
전송한 뒤에는 개수, 용량과 체크섬(md5sum)으로 같은 파일인지 확인함
#개념과 동작 원리
| 옵션 | 의미 |
|---|---|
scp -r |
디렉터리 전체 전송 |
scp -J 계정@점프서버 |
점프서버를 거쳐 한 번에 전송(OpenSSH) |
rsync -a |
권한, 시각, 링크를 유지하며 재귀 복사 |
rsync -v, -h, --progress |
처리 파일 표시, 읽기 쉬운 단위, 파일별 진행률 |
rsync -z |
압축 전송, 느린 회선에 유리, 빠른 내부망에서는 CPU 때문에 오히려 느릴 수 있음 |
rsync --delete |
소스에 없는 대상 파일 삭제(미러링) |
rsync --dry-run |
실제로는 아무것도 하지 않고 할 일만 출력 |
rsync --exclude="*.trc" |
패턴에 맞는 파일 제외 |
rsync -av /u01/backup/ 대상:/dir/은 backup 안의 파일들을 /dir/ 바로 아래에 넣고, rsync -av /u01/backup 대상:/dir/은 /dir/backup/을 만들어 그 안에 넣음
#필수 명령어 또는 SQL
#scp 기본, PC에서 서버로, 점프서버 경유
scp /u01/backup/orcl_full.dmp oracle@<REMOTE_HOST>:/u01/backup/
scp -r /u01/backup oracle@<REMOTE_HOST>:/home/oracle/backup777/
ssh oracle@<REMOTE_HOST> "ls /home/oracle/backup777/backup | wc -l"scp "C:\Users\<USERNAME>\Downloads\<FILE>.zip" oracle@<DB_HOST>:/home/oracle/
scp "C:\Users\<USERNAME>\Downloads\<FILE>.zip" oracle@<JUMP_HOST>:/home/oracle/
scp -J oracle@<JUMP_HOST> "C:\Users\<USERNAME>\Downloads\<FILE>.zip" oracle@<DB_HOST>:/home/oracle/
certutil -hashfile <FILE>.zip MD5결과 해석:
실습 기록: scp -r로 아카이브 로그, 컨트롤 파일 복사본, 덤프 파일 세 개를 보내고 상대 서버에서 wc -l 결과 3을 확인함
고객사가 DB 서버 직접 접속을 막고 점프서버를 거치게 하는 경우, PC → 점프서버로 보낸 뒤 점프서버에 접속해 DB 서버로 다시 보내거나 -J로 한 번에 보냄
Windows에서 받은 설치, 패치 파일은 certutil -hashfile 파일 MD5로 해시를 구해, 리눅스로 옮긴 뒤 md5sum 값과 비교함
같은 이름의 대상 파일은 묻지 않고 덮어써짐
#scp가 막혔을 때
sftp oracle@<JUMP_HOST>
cd /home/oracle
put "C:\Users\<USERNAME>\Downloads\<FILE>.zip"
exitwget http://<FILE_SERVER>/<FILE>.zip
curl -O http://<FILE_SERVER>/<FILE>.zip
cp /mnt/share/<FILE>.zip /home/oracle/결과 해석:
| 고객사 환경 | 방법 |
|---|---|
| scp만 차단, SFTP 허용 | sftp |
| 점프서버에 업로드 기능 | 점프서버 업로드 → DB 서버 전송 |
| 사내 파일 전송 서버, HTTP 저장소 | wget, curl |
| NFS 같은 공유 디렉터리 | cp |
| 외부 반입 자체 통제 | 고객사 반입 절차와 보안 승인 |
먼저 설치 파일 반입 경로, SFTP 사용 가능 여부, 점프서버나 사내 파일 전송 서버 유무를 고객사에 물음
SSH 파일 전송 자체를 막은 환경이면 scp, sftp, WinSCP가 모두 안 될 수 있으며, 허용되지 않은 경로로 우회하지 않고 반입 절차를 따름
#rsync 증분 전송
rsync -av /u01/backup oracle@<REMOTE_HOST>:/home/oracle/backup777/
echo "new backup" > /u01/backup/archive_log_02.arc
rsync -av /u01/backup oracle@<REMOTE_HOST>:/home/oracle/backup777/
rsync -avh --progress /u01/backup/ oracle@<REMOTE_HOST>:/u01/backup2/
rsync -avz /u01/backup/ oracle@<DR_HOST>:/u01/backup/결과 해석:
실습 기록: 이미 보낸 디렉터리에 파일 하나를 추가하고 다시 실행하자 backup/archive_log_02.arc만 전송되고 sent 266 bytes, speedup is 62,343.17speedup은 전체 크기 대비 실제 전송량으로, 클수록 많이 아낀 것임
scp -r은 같은 명령을 다시 실행해도 바뀐 것 없이 전체를 다시 보냄
원격지 재해 복구 서버처럼 느린 회선에는 -z가 유리하고, 사내 기가비트망에서는 압축 없이 보내는 편이 빠른 경우가 많음
#미러링과 제외
rsync -av --delete --dry-run /u01/backup/ oracle@<REMOTE_HOST>:/u01/backup2/
rsync -av --delete /u01/backup/ oracle@<REMOTE_HOST>:/u01/backup2/
rsync -av --exclude="*.trc" --exclude="*.log" /u01/backup/ oracle@<REMOTE_HOST>:/u01/backup2/결과 해석:
--dry-run 출력의 deleting ... 목록이 지워도 되는 파일인지 확인한 뒤에만 --dry-run을 빼고 실행함
소스 경로를 잘못 적거나 끝 슬래시를 빠뜨린 채 --delete를 쓰면 대상의 다른 파일까지 지울 수 있음
--exclude는 여러 번 쓸 수 있으며, 트레이스, 로그처럼 옮길 필요 없는 파일을 빼 전송량을 줄임
#전송 검증과 로컬 디스크 사이 이동
du -sh /u01/backup
ssh oracle@<REMOTE_HOST> "du -sh /u01/backup2"
md5sum /u01/backup/orcl_full.dmp
ssh oracle@<REMOTE_HOST> "md5sum /u01/backup2/orcl_full.dmp"sudo mkdir -p /u02/backup
sudo chown -R oracle:oinstall /u02
rsync -avh --progress /u01/backup /u02/backup/결과 해석:
파일 개수와 전체 용량이 같아도 내용은 다를 수 있음
중요한 파일은 양쪽 체크섬도 비교함
수업 자료의 체크섬 예시 값은 빈 파일의 MD5 값이라 512MB 파일의 실제 결과가 아닌 설명용 값임
같은 서버의 디스크 사이 이동도 rsync가 유리하며, 큰 파일을 옮기다 끊겨도 다시 실행하면 이어서 맞춤
실습은 새 디스크 /u02를 root 소유로 만든 뒤 chown으로 oracle에게 넘기고 옮김
#cron으로 야간 자동 전송
#!/bin/bash
LOG=/u01/backup/rsync.log
echo "== 백업 전송 $(date '+%F %T') ==" >> $LOG
rsync -az --delete /u01/backup/ oracle@<REMOTE_HOST>:/u01/backup2/ >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "결과: 성공" >> $LOG
else
echo "결과: 실패 - 확인 필요" >> $LOG
fi0 2 * * * /home/oracle/backup_send.sh결과 해석:
무암호 접속이 있어야 cron에서 사람이 없어도 전송됨
$?는 바로 앞 명령의 종료 코드이며 rsync는 성공이면 0을 돌려줌
결과를 성공, 실패로 남겨 두면 실패한 날만 확인하면 됨
백업 디렉터리 안에 로그 파일을 두면 --delete 미러링 때 대상 쪽 로그가 소스 기준으로 바뀌므로, 로그는 전송 대상 밖에 두는 편이 안전함
#사용 조건과 주의사항
열려 있는 DB의 데이터 파일을 scp, rsync로 복사한 것은 일관된 백업이 아니므로 DB 백업은 RMAN 결과물이나 정상 종료한 뒤의 파일을 옮김
전송 진행률 100%는 전송이 끝났다는 뜻일 뿐 백업으로 복구할 수 있다는 증명이 아님
처음 접속하는 서버의 호스트 키 지문은 서버 관리자에게 받은 값과 비교한 뒤 yes를 답함