Serach

2013년 10월 11일 금요일

My-SQL 백업 및 복원

- 특정 데이타베이스 하나만을 백업
백업형식 : myslqdump -u DB계정명 -p 백업대상데이터베이스명 > 저장할파일명
복구형식 : mysql -u DB계정명 -p 복구할테이터베이스명 < 저장할파일명

# ./mysqldump -u root -p mysql > mysql.sql      //mysql 디비 백업 예
# ./mysql -u root -p mysql < ./mysql.sql           //mysql 디비 복구 예

위 백업결과물인 sql 파일은 디비를 생성하지는 않는다.. 다시말해 복구하려는 디비에 mysql이란 디비가 없다면 복구가 되지않는다.

복구하려는 mysql 디비에 테이블이 이미 존재한다면 복구 실패... sql 파일에서 해당 디비의 테이블을 생성하므로.. 따라서 특정 데이타베이스 하나만을 복구 할 시에는 데이타베이스의 이름만 생성한 다음에 위 방법의 복구하여야 함


- 특정 데이타베이스의 특정 테이블 하나만을 복구 백업
백업형식 : myslqdump -u DB계정명 -p 데이터베이스명 테이블명 > 저장할파일명
복구형식 : mysql -u DB계정명 -p 데이터베이스명 < 저장할파일명
#./mysqldump -u root -p mysql user > user.sql
#./mysql -u root -p mysql < user.sql

- 여러개의 데이터베이스 한번에 백업과 복구
백업형식 : mysqldump -u root -p --databases [옵션] DB1 [DB2 DB3] > 파일명
복구방법 : mysql -u root -p < 파일명
# ./mysqldump -u root -p --databases mysql test > dbs.sql   //mysql, test 디비를 백업
# ./mysql -u -root -p < dbs.sql                                            //백업된 두 디비를 복구

databases 옵션 시 일반 백업과 달리 "CREATE DATABASE ..."문과 "USE DB .." 문이 추가됨
//달리 애기하면 DB를 생성할 필요가 없이 바루 디비가 생성되고 생성된 디비로 전환되고 테이블을 생성하고 인서트로 데이타를 붓는다.. 데이타베이스를 지정하면 안됨


- Mysql 의 전체 데이타베이스 백업
백업형식 : ./mysqldump -u root -p --all-databases > 파일명.sql
복구형식 : mysql -u root -p < 파일명.sql

원본 데이타베이스명과 동일한 디비가 생성됨


- 기존 테이블 삭제후  백업된 파일로 복구를 위한 백업
 (mysqldump문으로 데이타베이스 백업 시 각각의 create table문 앞에 drop table문을 삽입한 형태가 된다)
백업형식 : ./mysqldump -u root -p --add-drop-table test > test.sql
test 데이타베이스를 기존 태이블 삭제문을 추가하여 백업한다
복구형식 : ./mysql -u root -p test < test.sql
기존 테이블을 삭제하고 복구한다는것에 유의


- 기타 옵션
   -A, --all-databases : 모든 DB 덤프
   -B, --databases : 특정 DB를 덤프 
   --opt : 버퍼링을 비확성화 하고, 많은 데이터를 덤프에 있는 소량의 SQL구문에 기록해 더효율적으로 동작하다록 한다.
   --allow-keywords, --quote-names : 예약어를 사용하는 테이블을 덤프하고 복원할 수 있게 한다.
   --lock-alltables : 전역적으로 일관된 백업을 만들도록 "FLUSH TABLES WITH READ LOCK"을 사용한다. 
   --tab : "SELECT INTO OUTFILE"로 파일을 덤프하여, 덤프 및 복원 속도가 매우 빠르다.
   -d, --no-data :  데이터는 제외하고 스키마만 덤프
   -t, --no-create-info : 스키마는 제외하고 




로그 복구 방법

delete나 truncate 같은 명령으로 데이터를 지웠을때 복구하는 방법입니다.
mysql의 모든 명령들은 로그를 남기기때문에 가능합니다.
일단 mysql의 DB가 쌓이는 디렉토리로 이동합니다. 
대게 /usr/local/mysql/data /usr/local/mysql/var 등으로 설정해 놓으셨을겁니다.
해당 디렉토리로 이동하면 xxx-bin.001 xxx-bin.002 같은 바이너리 파일들이 존재할겁니다.
이게 바로 DB를 첨 생성할때부터 지금까지 쌓여온 로그인데요 이 파일을 활용하시면 삭제된 데이터도 살릴수 있습니다.
바이너리 파일이기때문에 그냥 접근하시면 이상한 문자들이 보이구요
mysqlbinlog 명령을 이용하셔서 사용해야 합니다.
다음은 예제입니다.

일단 DB 디렉토리로 이동한다.
# cd /usr/local/mysql/data

바이너리 파일을 소스파일로 변환한다.
# ../mysqlbinlog leopit-bin.002 > rescue.sql

필요한 구문만 가져온다.
# grep "insert" rescue.sql > rescue1.sql

이렇게 하시면 rescue1.sql은 지금까지의 인서트구문이 다 들어옵니다.
여기서 필요없는 부분은 지우세요

이제 최종적으로 DB에 삽입만 하시면 됩니다.
# mysql -u 계정아이디 -p DB이름 < rescue1.sql

댓글 없음:

댓글 쓰기