DB/MYSQL MariaDB2018. 2. 9. 14:08

mysql dump 파일 복구하기


 dump로 백업된 파일을 복구하는 방법은


- shell 에서 실행한다. 


mysql -u user -p db_name < 파일명



▶ 복구시 한글이 깨지는 경우 해결 방법 :  --default-character-set 옵션 사용


 - shell 에서 실행한다. 


mysql -u user -p --default-character-set=euckr db_name < 파일명


위와 같이  윈도우에서 shell을 사용해야 하는 이유는 GUI 툴에서 덤프 파일을 불러 올수 없기 때문임.


정확히 얘기하면 GUI 툴인 Toad나 sqllog등에서 덤프 파일 용량이 크기 때문에 읽어 들이지 못한다. 그래서 shell 화면에서 사용되야 한다. 



출처: http://bizadmin.tistory.com/entry/mysql-덤프백업파일-복구-하기?category=754883 [Happy Resource]

Posted by 무소유v
DB/MYSQL MariaDB2018. 2. 9. 14:08
실무에서 자주 사용되는 쉘 스크립트  #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 으로 모든 테이블을 백업할 수 있다.



출처 : https://www.linux.co.kr/home/lecture/index.php?leccode=11046


Posted by 무소유v