본문 바로가기
IT/DBMS 공통

mysql scp 이용 remote server 에 backup 하기

by 최고영회 2013. 12. 24.
728x90
반응형
SMALL

 

데이터베이스에 보존되어있는 데이터를 백업화일 작성,리모트서버에 전송 할 필요가 생겼다.

 

백업처리는 이하 와 같다.

 

1.cron에서 1시간간격으로 sh를 실행한다.

 

2.sh 에는 이하의 처리를 실행한다.

-mysqldump를 실행. [200901011230.sql] yyyymmdd hhmi 등으로 한다.

-작성화일은 압축해서 리모트서버에 scp로 전송한다.

 

1.shell스크립트작성

 

    #!/bin/sh

 

    db='hoge';

    dt=`date '+%Y%m%d%H%M'`;

    mysqldump -uroot $db > /root/mysql_bkp/$dt.sql;

 

    # Remote User

    USER=foo

    # Remote Host

    HOST=hogehoge.com

    # Remote Host Backup Directory

    REMOTE_BACKUP_DIR=/home/foo/mysql_bkp

 

    # Go to the backup directory

    cd /root/mysql_bkp

 

    # Get list of the backup directory

    STR=`ls`

 

    # Convert a string to an array

    foo=($STR)

 

    # Count number of array materials

    MAX=${#foo[*]}

 

    # initialize a counter

    NUM=0

 

    # search the latest backup file and remove old files.

    for tmp in ${foo[@]};do

        let NUM=$NUM+1

        if [ $NUM = $MAX ]; then

            BKP_FILE=$tmp

    #    else

    #        if [ -f $tmp ]; then

    #            rm -f $tmp

    #        fi

        fi

    done

 

    # Compress a backup file.

    TAR_FILE="$BKP_FILE.tar.gz"

    tar zcf $TAR_FILE $BKP_FILE

 

    # remove a dump file

    rm -f $BKP_FILE

 

    BKP_SQL="/root/mysql_bkp/$TAR_FILE"

    REMOTE_BKP_SQL="/home/$USER/mysql_bkp/$TAR_FILE"

 

    # Transfer an backup file to the remote server

    scp -B -i ~/.ssh/id_rsa $BKP_SQL $USER@$HOST:$REMOTE_BKP_SQL

 

 

2.백업용 유저 작성

 

리모트서버에 백업용 유저를 작성,패스워드를 설정한다.。

 

    [root@beijing ~]# useradd backuper

    [root@beijing ~]# passwd backuper

    Changing password for user backuper

    New UNIX password:

    BAD PASSWORD: it does not contain enough DIFFERENT characters

    Retype new UNIX password:

    passwd: all authentication tokens updated successfully.

 

 

 

3.비밀키/공개키 작성 (로컬 서버 :자료 가 있는 있는 서버)

sh에서 scp를 사용해서 자동적으로 전송하기 위해서는 패스워드 인증이 아니라 공개키인증이 필요하다.(주인장: expect 를 사용하면 대화식 sh을 작성할수 있다..패스워드인증으로 가능하다. 하지만 별로 추천하고 싶지 않다.) 공개키인증을 하기 위해 로컬서버(서버) 에서 비밀키/공개키를 작성하고,작성한 공개키를 리모트서버에 업로드한다.

 

공개키를 작성할때 패스프레이즈(공개키화일에 대한 패스워드)를 입력하면,결국 패스워드 인증을 하는셈이므로 ,패스워드를 넣지 않고 그냥 엔터를 친다.

 

[키 작성하기]

 

    [root@beijing ~]# ssh-keygen -t rsa

    Generating public/private rsa key pair.

    Enter file in which to save the key (/home/xxxx/.ssh/id_rsa):

    Enter passphrase (empty for no passphrase):

    Enter same passphrase again:

    Your identification has been saved in /home/foo/.ssh/id_rsa.

    Your public key has been saved in /home/xxxx/.ssh/id_rsa.pub.

    The key fingerprint is:

    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx abcde@abcde.net

 

비밀키는 「/home/foo/.ssh/id_rsa」、공개키는「/home/xxxx/.ssh/id_rsa.pub」。

 

작성된 공개치를 리모트서버에 업로드 한다.이때 공개키의 path 는 「2 에서 작성한 유저의 홈디렉토리 /.ssh/authorized_keys」 로 할 필요가 있다.

 

.ssh디렉토리가 없을경우 만든다. 。(리모트서버 의 계정)

 

    [backuper@ ~]# mkdir .ssh 

 

로칼서버에서 만든 공개키(id_rsa.pub)를  다운로드해서 리모트서버의 계정 .ssh 디렉토리에 업로드 한다.(간단히 말하면 copy하세요.. >.< )

authorized_keys 라는 화일이 존재하지 않을경우 d_rsa.pub화일을 rename 한다.(이름 바꿔 넣으세요. )

 

    [backuper@ ~]# cd .ssh/

    [backuper@ .ssh]# mv id_rsa.pub authorized_keys

 

기존의 화일이 존재할경우#1 일단 같은 디렉토리#2에 업로드 하고,다음의 명령을 실행합니다.

(#1 보통 다른곳에서도 공개키를 얻기 때문에 존재해 있기도 합니다. 참고로 서버에서 ssh로 다른 서버에 접속할때 등등 공개키를 자동 다운받아 authorized_keys에 추가 합니다.

 #2 authorized_keys를 less 나 cat등으로 열어보셔도 됩니다.. vi로 무식하게 공개키 코드를 집어넣고 저장하셔도 상관 없지요.꼭 같은 디렉토리일 필요도 없습니다.. 암호코드만 어떻게든 추가하면 되는것이기에...  >.< )

 

    [backuper@ .ssh]# cat id_rsa.pub >> authorized_keys 

 

공개키의 권한을 700으로 설정합니다.

 

    backuper@ .ssh]# chmod 700 authorized_keys 

 

비밀키/공개키의 설정이 잘 되었는지 로컬 서버에서 scp을 직접 입력해서 확인해 봅시다.

 

    [root@db ~]# touch scp_test.txt

    [root@db ~]# scp -B -i ~/.ssh/id_rsa scp_test.txt@192.168.2.201:/tmp/scp_text.txt

 

처음에는 인증확인이 요구됩니다만 신경쓰지 마시고 일단 Enter를 누르시고, 다음 내용 비슷하게 전송이  되었으면 비밀키/공개키 설정은 일단 끝입니다.

 

    200901111800.sql                                                    100% 1307KB 

    1.3MB/s   00:01

 

 

4.sh작성

 

1에서 작성한 sh를 정기적으로 실행위한 cron를 설정합니다.

cron에서 실행할 패스를 「/root/mysql_bkp.sh」로 일단 설명 합니다.

 

sh의 위치를 확인.. (공부하실때는 which , whereis 보다 find 를 사용하는것이 좋다는데 한표 ..  find / -name sh )

 

    [root@db ~]# which sh

    /bin/sh

 

cron설정 해봅니다.

 

    [root@db ~]# crontab -e 

 

처음에는 cron이 실행되는가 어쩐가 보기 위해서,,2분마다 실행을 해봅니다..( 읽어봅니다 man 5 crontab ) 이하의 내용을 추가해서 넣습니다. (위에서 sh 가 어디있는지 찾아봤지요? 그 path를 넣습니다.)

 

    0-59/2 * * * * /bin/sh /root/mysql_bkp.sh 

 

설정후 어느정도 경과후에 cron의 로그를 보기로 합니다. (로그 볼때는 less 좋네요.. less /var/log/cron)

 

    [root@db ~]# vi /var/log/cron 

 

다음과 비슷한 로그가 있다면 실행은 되는겁니다...

 

    Jan 11 05:00:01 db crond[13682]: (root) CMD (/bin/sh /root/mysql_bkp.sh) 

 

리모트서버에 화일이 전송되었는지 확인해봅니다.

그후 cron의 설정을 1시간 간격으로 설정해봅니다.

 

    [root@db ~]# crontab -e

 

    0 * * * * /bin/sh /root/mysql_bkp.sh

 

끝。

 

 

출처 : http://13friday.tistory.com/32

 

728x90
반응형
LIST

'IT > DBMS 공통' 카테고리의 다른 글

mysql 설치  (0) 2013.12.24
mysqld_safe  (0) 2013.12.24
mysql 내장 함수  (0) 2013.12.24
mysql subquery limit 사용하기  (0) 2013.12.24
mysql dump import/export  (0) 2013.12.24