Mysql 복구 방법

실수로 삭제한 mysql DB 복구방법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

MyaSQL 테이블 및 데이터를 백업하고 복원하는 방법을 알아보겠습니다.

우선 MySQL 정보를 아래처럼 정해놓겠습니다.

스키마(DB명) : test_db
로그인 유저 : test_user
패스워드 : test123
복원 스키마(DB명) : dev_db
mysqldump 백업 하기

DB를 백업하기 위해서는 mysqldump 명령어를 사용합니다.

DB 서버에 접속해 명령어를 실행합니다.

[root@test]# mysqldump -u로그인 유저 -p'패스워드' 스키마(DB명) > 저장할파일명.sql 

mysql에 접속할 로그인 유저, 패스워드, 백업하고 싶은 스키마를 지정합니다.

> 뒤에는 저장할파일명.sql을 설정합니다.

[root@test]# mysqldump -utest_user -p'test123' test_db > test_db_backup.sql 

mysqldump  명령어를 실행하면 현재 폴더에 지정한 파일명으로 DB 백업 파일이 생성이 됩니다.

mysql 복원 하기

백업한 파일을 복원하기 위해서는 mysql 명령어를 사용합니다.

[root@test]# mysql -u로그인 유저 -p'패스워드' 복원스키마(DB명) < 백업파일명.sql 

백업 파일을 복원하려고 하는 스키마는 미리 작성을 해야 합니다.

mysql에 생성하지 않은 스키마에 복원을 하려고 하면 에러가 발생합니다.

dev_db라는 스키마가 있다고 가정을 하고 복원을 하겠습니다. 

[root@test]# mysql -utest_user -p'test123' dev_db < test_db_backup.sql 

test_db에 있는 테이블과 데이터를 mysqldump 명령어를 사용해 백업하고 mysql 명령어로 dev_db 스키마에 복원시켰습니다.

위에서 사용한 백업과 복원 방법은 기본적인 사용방법입니다.

백업을 할 때 사용하는 mysqldump와 복원을 할 때 사용하는 mysql 명령어에는 여러 옵션을 붙여 사용할 수 있습니다.

옵션을 지정하면 원하는 문자 타입 또는 특정 테이블 등만 백업하거나 복원을 할 수 있습니다. 

phpMyAdmin 에서 특정한 테이블만 삭제한다는 것을 실수로 DB 전체를 날려버렸다.

정신이 아득하다. 검색해서 실수로 날린 DB 복구방법으로 시도를 했는데 안된다.

아~~ 미처버리겠다는 생각이 들었고 나온 방법으로 수동 비슷하게도 복구를 시도해봤다.

그런데 문제는 PHP 소스코드 구현 방식에 약간 문제있는 부분이 있다는 걸 알게되었고, 이 방법으로는 정상적인 복구가 안된다.

최종적으로 복구를 한 방법을 적어둔다.

# cd /usr/local/mysql/data

에 가면 방금 삭제한 로그를 기록한 파일이 있다.

시간대를 보면 확인할 수 있다.

해당 파일을 보니 mysql-bin.000003 로 되어 있다.

복구방법에 보니까 이걸 한줄 한줄 실행해서 파일 하나로 합치라는 명령어가 있다.

그런데 이건 잘못된 듯하다.

/usr/local/mysql/bin/mysqlbinlog -d testdb mysql-bin.000003 > resque.sql

를 실행한다.

여기서 testdb 대신 실제 사용하는 DB명으로 수정해야 한다.

이렇게 하면 복구를 위한 1단계 준비는 되었다.

※ grep "insert" resque.sql > resque1.sql 이런거 하라고 되어 있는 곳도 있던데 이런거 하면 약간의 명령어는 나온다. 하지만 100% 복구 방법이 절대 아니다. 이거 해본다고 시간만 낭비했다.

2단계로 이 파일을 PC로 백업한다.

  mysql-bin.000003 파일도 PC로 복사를 해두는 편이 좋다고 생각하면 복사를 하라.

  테스트를 거치다보니 동일한 파일에 시간대가 달라지면서 계속해서 작업한 내용이 쌓이더라.

3단계로 이 파일을 EditPlus 로 열어서 맨 하단에 보면 drop table 이라고 표시된 부분이 보일 것이다.

  이 부분을 삭제 또는 주석처리 해주어야 한다.

  그런 다음에 저장하고 이 파일(rescue.sql )을 다른 이름으로 변경(rescue_modify.sql )하여 다시 서버에 복사를 한다.

4단계

# mysql -u 계정아이디 -p DB이름 < rescue_modify.sql
를 해주고 나면 패스워드 입력하고 나면 복구가 된다.

이렇게 복구하면 혹시라도 다시 만든 테이블이 있다면 삭제되어 버린다.

즉, 복구한 명령어를 가진 파일로 업데이트를 해버린다는 말이다.

안녕하세요?

바다웹호스팅에서는 리눅스의 MySQL DB 서비스를 제공해 드리고 있습니다. 데이터베이스를 백업받으시려면 다음과 같이 하시면 됩니다.

1. 데이터 베이스 전체 백업과 복원

일반적으로 db를 통채로 백업받고, 복원하는 방법은 아래와 같이 하시면 됩니다.
전체를 백업받고 복원하기

- db 전체 백업 : mysqldump -uxxx -p test_db > test_db.sql
- db 전체 복원 : sql -uxxx -p test_db < test_db.sql

2. 특정 테이블만 백업받기

  mysqldump -uxxx -p test_db test_table > test_table_db.sql

이런 식으로 덤프 명령을 사용해서 특정한 db안에 있는 테이블만 지정을 해서 백업받을 수 있다.

3. 특정 테이블만 복원하기

백업받은 테이블을 복구하는 방법은 아래와 같다.

  mysql -uxxx -p test_db < test_table_db.sql

이 명령으로 백업받은 테이블 데이터를 복원하기 전에 반드시 복원하고자 하는 테이블을 먼저 삭제해야
한다는 점이다.

   drop table test_table;

식으로 테이블을 삭제한 다음에 위의 명령을 사용해야 에러 없이 복원이 된다.

이외에 간단한 mysql 관련 명령어를 알아두자.. 참고로 명령어는 대소문자를 구분하지 않는다.

데이터베이스 만들기
mysql> create database 데이터베이스명;

데이터베이스 삭제하기
mysql>drop database 데이터베이스명;

데이터베이스 열람하기
mysql>show databases;

테이블 보기
mysql> show tables;

테이블 만들기
mysql>create table 테이블명;

테이블의 삭제
mysql> DROP TABLE 테이블명;

테이블 내용 호출하기
mysql>select * from 테이블명;

테이블 이름 변경
mysql>alter table 옛날테이블명 RENAME 새테이블명;

데이터베이스의 필드 정보보기
mysql> DESC db;