Tip
2014.04.22 04:32

mysql 쉘

조회 수 1500 추천 수 0 댓글 0

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

 

  지난번, 강좌(apache 자동 재 시작 프로그램)에 이어 실무에서 자주 사용되는 쉘 스크립트에 대한 강좌를 써 내려 가겠다. 물론 최대한 쉽고 최소한의 라인 수로 작성 가능한 쉘 스크립트에 대한 강좌를 쓸 것이다.
   금번 강좌는 MySQL을 쉽게 관리 할 수 있는 툴이다. 서버 관리를 하다 보면, mysql 접속하여 여러가지 sql문으로 서버 상태를 알아 보거나, 모니터링 해야 할 때가 있다. 이럴 때 마다 로그인을 해서, sql문을 얻어내는 것은 아주 귀찮은 일이고, 또 익숙하지 않으면 아주 오랜 시간이 소요되는 작업이다.  내가 만들고자 하는 스크립트는 이런 작업을 쉽게 해 줄 수 있는 스크립트를 만드는 것이다.

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


1) MySQL의 프로세스 리스트를 보려면?
   mysql의 프로세스 리스트는 ps 등의 명령어로 쉽게 볼 수 있다. 난 그런 것을 원하는 것이 아니고, 각 프로세스들이 하는 일들을 보고 싶다. mysql은 다음과 같은 방법으로 이런 일이 가능하게 제공한다.
 
   mysqladmin -u root -p processlist

또는

   mysql 접속한 상태에서
   show processlist;

나는 일괄적으로 다음과 같은 방법으로 mysql 명령을 실행 시킬 것이다.

echo "쿼리;" | mysql -u"root" -p"비밀번호"

위 명령어는 다음과 같다.
 echo "쿼리; " : "쿼리;"를 출력한다.
| : 파이프, 앞 명령어의 내용을 뒷 명령어의 표준 입력으로 넣는다.
mysql -u"root" -p"비밀번호" : mysql 서버에 접속한다. "비밀번호"는 서버의 비밀번호를 넣어준다.

우리가 원하는 일은 다음과 같이 한다.

echo "show processlist;" | mysql -u"root" -p"비밀번호"

 

 

 2) root로 그냥 접속만 하려면?
  '1)'의 프로세스 리스트를 보는 것 보다 쉽다. 단순하게..

mysql -u"root" -p"비밀번호"

이렇게만 하면 끝난다.

 

 3) MySQL에 존재하는 database 들을 보려면?
  '1)'의 프로세스 리스트를 응용하면,

echo "show databases;" | mysql -u"root" -p"비밀번호"

이렇게만 하면 끝난다.


 이정도 했으면, 원하는 쿼리들을 위와 같은 방법으로 자유롭게 추가 할 수 있을 것이다.
내가 원하는 것은 위 명령어들을 모아서 쓰기 편리한 메뉴 방식으로 만드는 것이다.
어떻게 할까???
  나는 키보드로 특정 문자들을 입력받아 변수에 넣을 것이다. 그리고 그 변수에 따라 위 명령어들을 실행 시킬 것이다. 이런 작업들을 특정 문자가 입력될 때 까지 반속 할 것이다.

 

 4) 쉘 프로그램에서 키보드 입력 받기
  나는 쉘 프로그램에서 키보드로 입력을 받아서 변수에 넣을 것이다. 어떻게 해야 할까

read <변수>
 
no라는 변수에 입력값을 넣으려면 다음과 같이 한다.
read no

이렇게 하면, '엔터'키를 누를 때 까지 입력을 받는다.

read no
echo "$no"

위와같이 하면 간단하게 입력받은 문자를 출력해서 보여 줄 수 있다.


5) 입력된 문자에 따라서 프로그램 실행 시키기
  '4)'에서 입력받은 문자에 따라서, 프로그램을 실행시키기 위해서는 case문을 사용해야 한다.
다음과 같다.

case <변수> in
   "값" )
        <명령어> ;;
   "값" )
        <명령어> ;;
 esac

위와같다.
위 방법을 우리가 목표 하는 것에 적용 시키면.

먼저 메시지를 뿌려 준다.

echo '
   1. 프로세스 리스트 보기
   2. mysql 접속
   3. database 리스트 보기
'
echo -n "번호 선택 : "
read no

case $no in
   "1" )
        echo "show processlist;" | mysql -u"root" -p"비밀번호" ;;
   "2" )
        mysql -u"root" -p"비밀번호" ;;
   "3" )
        echo "show databases;" | mysql -u"root" -p"비밀번호" ;;
 esac


위와같이 작성하면, 위 쉘 스크립트를 실행 시키면, 리스트가 나오며 입력 대기 할 것이고, 1,2,3 중 하나의 번호를 누르면 지정 명령어가 실행 될 것이다..
  그렇다면, 다른 문자를 입력하면??  조건에 만족하는 문자가 없으면 그냥 지나간다...

 

6) 실행이 끝나면 다시 메뉴 보여주기
  명령어를 실행 시키고 빠져 나가 버리면, 다른 메뉴를 선택하기 위해서 또 명령어를 실행시켜야 한다. 하나의 명령어 실행 시키고 다시 메뉴 리스트를 반복적으로 보여 주기 위해서는 이전 강좌에서 배웠던, while 문을 사용하여 계속 실행 시키도록 해 보자.

while ( true ) ; do
  <프로그램>
done

위와같은 문법을 우리 스크립트에 적용하면,

while ( true ) ; do
   clean
   echo '
    1. 프로세스 리스트 보기
    2. mysql 접속
    3. database 리스트 보기
'
   echo -n "번호 선택 : "
   read no

   case $no in
     "1" )
          echo "show processlist;" | mysql -u"root" -p"비밀번호" ;;
     "2" )
          mysql -u"root" -p"비밀번호" ;;
     "3" )
          echo "show databases;" | mysql -u"root" -p"비밀번호" ;;
   esac
done


이렇게 하면, 선택한 명령어 실행이 끝나면, 다시 메뉴를 보여 줄 것이다.
clear 명령어는 화면의 내용을 지우라는 명령어이다. 메뉴가 줄줄줄~~ 내러 가는 일을 방지하기 위함니다.

 


7) 이 반복 메뉴에서 빠져 나오려면??
  한 명령어 실행이 끝나면, 메뉴가 나올 것이다. Ctrl + C 키를 눌러 빠져 나올 수 있지만, 그건 좀 아닌 것 같은데... 하나의 항목을 추가 했다. 메뉴에서 'q'키를 누르면 빠져 나오게 한다.

 

while ( true ) ; do
   clean
   echo '
    1. 프로세스 리스트 보기
    2. mysql 접속
    3. database 리스트 보기
    q. 끝내기
'
   echo -n "번호 선택 : "
   read no

   case $no in
     "1" )
          echo "show processlist;" | mysql -u"root" -p"비밀번호" ;;
     "2" )
          mysql -u"root" -p"비밀번호" ;;
     "3" )
          echo "show databases;" | mysql -u"root" -p"비밀번호" ;;
     "q" )
          exit 0 ;;
   esac
done

위 쉘스크립트에서 'q'키를 누르면 exit 명령어를 실행시켜 빠져 나오게 된다. 물론 정상 종료이기 때문에 0을 리턴한다..

 


8) "비밀번호"가 바뀌면 다 고쳐 줘야 하나요??
  비밀번호가 바뀌면 위 스크립트에서 "비밀번호" 부분을 모두 수정해야 한다. vi 등의 에디터에 치환 기능이 있어 한번에 치환 한다면 문제가 없다. 하지만, 비밀번호가 'mysql' 이라면, 얘기는 달라진다,.. 명령어인 'mysql'이 함께 바뀌기 때문에.. 하나 하나 수작업으로 고쳐야 한다.
  변수라는 개념을 써서 이 부분을 해결 해 보자.

a="변수"
echo $a

이렇게 하면 출력값은 ? 

변수

위와같이 출력된다. 변수라는 개념을 우리의 쉘스크립트에 적용시키면?

mysqlpw="비밀번호"

while ( true ) ; do
   clean
   echo '
    1. 프로세스 리스트 보기
    2. mysql 접속
    3. database 리스트 보기
    q. 끝내기
'
   echo -n "번호 선택 : "
   read no

   case $no in
     "1" )
          echo "show processlist;" | mysql -u"root" -p"$mysqlpw" ;;
     "2" )
          mysql -u"root" -p"$mysqlpw" ;;
     "3" )
          echo "show databases;" | mysql -u"root" -p"$mysqlpw" ;;
     "q" )
          exit 0 ;;
   esac
done


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Q&A MySQL관련 게시물만 Sean 2014.04.09 2416
3 자료 mysql 기초자료 file 고구마 2014.04.22 1771
2 Q&A mysql 질문과 답 고구마 2014.04.22 2839
» Tip mysql 쉘 고구마 2014.04.22 1500
Board Pagination Prev 1 Next
/ 1