강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
실무에서 자주 사용되는 쉘 스크립트 #3 (MySQL DB백업 유틸리티)
조회 : 9,342  


실무에서 자주 사용되는 쉘 스크립트  #3
           (MySQL DB백업 유틸리티)




  지난강좌(#3)는 MySQL을 쉽게 관리 할 수 있는 툴을 만들어 보았다.
금번 강좌에서는 mysql의 데이터를 백업하는 스크립트를 만들 것이다. 단순하게 mysql을 dump 하기 위해서는 mysqldump 명령어를 사용하면 쉽게 할 수 있다.
하지만, DB 전체를 백업해 두면, 원하는 데이터를 찾기 힘들고 시간이 오래 걸린다. 우리가 원하는 것은 각 DB에 각 table별로 백업 하는 것이다.

먼저, 어떤일을 할 것인지 생각 해 보자...




1) MySQL의 데이터를 DUMP 하려면?
   mysql을 dump 하기 위해서 mysqldump라는 명령어를 제공한다. 이 명령어는 DB에서 원하는 DB만, table만 백업 할 수 있고, 전체 DB를 백업 할 수 있다.

  (1) 전체 백업
    mysqldump -uroot -p -A > all.sql

  (2) 특정 DB 백업
    mysqldump -uroot -p 특정DB명 > 특정DB명.sql

  (3) 특정 DB에 특정 테이블 백업
    mysqldump -uroot -p 특정DB명 특정table명 > 특정DB명.특정table.sql

   위와 같은 방법으로 백업을 진행하며 우리가 원하는 결과를 얻어내기 위해서는 "(3)"번의 방법을 여러번 실행 할 수 있는 프로그램이 필요하다.
 



2) DB리스트를 얻어 내려면?
  mysql의 DB리스트를 얻어 내려면, "show databases" 쿼리를 던지면 리스트를 구할 수 있다.
 
  echo "show databases;" | mysql -uroot -p

 위 명령어로 DB리스트를 얻을 수 있다. 그런데 결과가 이상하다.
처음 라인에 "Database"가 하나 있는 것을 확인 할 수 있다. 필드명 같은데..
제거하는 방법은 .. mysql명령에서 제공한다. '-N'옵션을 적용시키면 없어진다.


  echo "show databases;" | mysql -N -uroot -p


  위 명령어로 DB리스트를 얻을 수 있으며, 이 리스트를 변수에 담아 보자

  db_list=`echo "show databases;" | mysql -N -uroot -p`

 위 명령을 내리면, db_list에 DB리스트를 넣게 된다. 여기서 "`"이 등장한다. 이는 "''" 안에 있는 명령어를 실행 시키라는 것이다.
변수를 지정하였기 때문에 명령어의 실행 결과는 변수에 들어가게 된다.
 여기서, 위 명령어는 MySQL DB root 비밀번호를 물어 보게 된다.
비밀번호를 묻지 않게 하기위해서 다음과 같이 넣어준다.

  db_list=`echo "show databases;" | mysql -N -uroot -p"DBroot비밀번호"`

 위와같이 하면, 실행시간에 DB의 root 비밀번호를 물어보지 않는다.




3) DB의 TABLE 리스트를 얻어 내려면?
  mysql의 TABLE리스트를 얻어 내려면 "show tables" 쿼리를 던지면 된다. '2)'와 비슷하게 다음과 같이 작성한다.

  table_list=`echo "show tables;" | mysql -N -uroot DB명 -p"DBroot비밀번호"`




4) '2)' 에서 얻어낸 DB리스트를 어떻게 하나 하나 적용 시킬 것인가?
  공백으로 구분된 값을 분리 하여, 하나 하나 변수에 넣을 수 있다.  bash에서는 for in 문법을 적용할 수 있다. 문법은 다음과 같다.

for 변수 in 리스트 ; do
  <명령어들>
done

다음 예제를 보자

for i in 사과 배 감자 ; do
 echo $i
done

위 예제에서  'i'는 반복 변수이다. 일반적인 프로그래밍언어에서 반복문에 사용되는 변수를 i로 많이 지정한다.
'사과 배 감자'는 반복할 항목이다. 위 예제의 결과는 다음과 같다.

사과

감자


그렇다면, '2)'에서 구했던 DB리스트를 하나 하나 출력해 보자.


db_list=`echo "show databases;" | mysql -N -uroot -p"DBroot비밀번호"`
for db in $db_list ; do
 echo $db
done

위와같은 방법으로 DB 리스트를 출력 할 수 있다.




5) 우리의 목적을 달성해 보자..
 위에서 알아본 것들을 응용해서 다음과 같이 우리가 원하는 쉘스크립트를 만들어 보자.


db_root_pw='비밀번호'

db_list=`echo "show databases;" | mysql -N -uroot -p"$db_root_pw"`
 for db in $db_list ;do
  table_list=`echo "show tables" | mysql -N -uroot -p"$db_root_pw" $db`
  for table in $table_list ; do
    mysqldump -uroot -p"$db_root_pw" $db $table > $db.${table}.sql
  done
 done

위 쉘스크립트는 DB리스트를 구하고, 또 그 DB의 테이블 리스트를 구해서 각 테이블별로 mysqldump명령어를 사용해서 백업하는 것이다.
위와같이 for문은 여러번 중첩해서 사용할 수 있다.


위 명령을 내리면,
 DB명.TABLE명.sql 으로 모든 테이블을 백업할 수 있다.



우리는 이것으로
 아주 쉽게 DB의 모든 테이블별로 백업 할 수 있게 되었다. 이를 위해서  쉘 스크립트의 for in문을 활용하였다.
 단 8줄으로 우리가 원하는 결과를 이뤘다..  넘넘 뿌듯하다^^..



  이것으로 ' 실무에서 자주 사용되는 쉘 스크립트  #3' 강좌를 마무리 하겠습니다.
본 강좌의 설명이 어렵거나, 잘못된 부분이 있으면 언제든지 따끔한 지적을 바랍니다.


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1577


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
관리자