데이터베이스 연구실.log

파일 전송과 동기화

scp의 파일, 디렉터리 전송과 점프서버 경유, 막힌 환경의 반입 방법, rsync의 증분 전송, 슬래시 규칙, 압축, 미러링, 제외, 전송 검증과 cron 자동 전송

scprsyncsftp점프서버md5sumcertutil--delete--dry-run

#핵심 요약

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에서 서버로, 점프서버 경유

Linux Bash (oracle)객체 또는 설정을 변경함
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"
Windows PowerShell (PC)객체 또는 설정을 변경함
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가 막혔을 때

Windows 명령 창 → sftp 세션객체 또는 설정을 변경함
sftp oracle@<JUMP_HOST>
cd /home/oracle
put "C:\Users\<USERNAME>\Downloads\<FILE>.zip"
exit
DB 서버 셸객체 또는 설정을 변경함
wget 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 증분 전송

Linux Bash (oracle)객체 또는 설정을 변경함
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.17
speedup은 전체 크기 대비 실제 전송량으로, 클수록 많이 아낀 것임

scp -r은 같은 명령을 다시 실행해도 바뀐 것 없이 전체를 다시 보냄

원격지 재해 복구 서버처럼 느린 회선에는 -z가 유리하고, 사내 기가비트망에서는 압축 없이 보내는 편이 빠른 경우가 많음

#미러링과 제외

Linux Bash (oracle)데이터 또는 파일을 삭제함, 되돌릴 수 없음
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는 여러 번 쓸 수 있으며, 트레이스, 로그처럼 옮길 필요 없는 파일을 빼 전송량을 줄임

#전송 검증과 로컬 디스크 사이 이동

Linux Bash (oracle)조회만 함
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"
Linux Bash (oracle, sudo 가능)객체 또는 설정을 변경함
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으로 야간 자동 전송

파일 (~/backup_send.sh)객체 또는 설정을 변경함
#!/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
fi
crontab -e 편집 화면객체 또는 설정을 변경함
0 2 * * * /home/oracle/backup_send.sh

결과 해석:

무암호 접속이 있어야 cron에서 사람이 없어도 전송됨

$?는 바로 앞 명령의 종료 코드이며 rsync는 성공이면 0을 돌려줌
결과를 성공, 실패로 남겨 두면 실패한 날만 확인하면 됨

백업 디렉터리 안에 로그 파일을 두면 --delete 미러링 때 대상 쪽 로그가 소스 기준으로 바뀌므로, 로그는 전송 대상 밖에 두는 편이 안전함

#사용 조건과 주의사항

열려 있는 DB의 데이터 파일을 scp, rsync로 복사한 것은 일관된 백업이 아니므로 DB 백업은 RMAN 결과물이나 정상 종료한 뒤의 파일을 옮김

전송 진행률 100%는 전송이 끝났다는 뜻일 뿐 백업으로 복구할 수 있다는 증명이 아님

처음 접속하는 서버의 호스트 키 지문은 서버 관리자에게 받은 값과 비교한 뒤 yes를 답함

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기