(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 으로 모든 테이블을 백업할 수 있다.
출처 : https://www.linux.co.kr/home/lecture/index.php?leccode=11046
'DB > MYSQL MariaDB' 카테고리의 다른 글
[MySQL] 백업과 복구를 위한 Dump. 조금 더 빠르게 하려면? (0) | 2018.02.09 |
---|---|
MySQL 백업 및 복구하기 (0) | 2018.02.09 |
mysql 덤프백업파일 복구 하기 (0) | 2018.02.09 |