본문 바로가기
프로그램이야기/mysql

[mySql] mariaDb, Mysql .frm, .ibd파일을 이용한 데이터 복구 ( docker 이용방법 포함 )

by Doinge 2022. 4. 8.
728x90
반응형

안녕하세요 두잉이입니다.

오늘은 mysql , mariadb 복구 방법에 대해 알아보겠습니다.

.frm, .ibd파일을 이용한 방법인데요 도커를 이용한 방법도 있으니 참고해 주시길 바랍니다.

 

서버가 손상되거나 할 때. frm 또는 .ibd파일을 이용해 데이터를 복구할 수 있습니다.

 

* frm 파일

각 테이블의 테이블 구조를 보관한다.

* ibd 파일

각 테이블의 데이터가 저장되는 파일

 

1. .frm파일을 이용한 스키마 복구 ( dbsake 이용 )

* frm 파일이 테이블 구조를 가진 정보인데 파일을 연다고 확인이 불가하니 dbsake라는 프로그램을 이용해 스키마를 확인한다.

 

보통 /var/lib/mysql 경로로 들어가면 database 이름 폴더 밑에 이런 형식으로 들어가 있다.

1-2. dbsake 설치
curl -s http://get.dbsake.net > dbsake
chmod 700 dbsake

설치 후 권한 변경을 해준다.

1-3. 테이블 구조 확인 ( sql문으로 추출 )
$ ./dbsake frmdump /파일경로/ xxx.frm > xxxx.sql
예시

$ ./dbsake frmdump /var/lib/mysql/testDB/testTable.frm > testTable.sql
원하는 db의 모든 테이블 구조를 뽑는 방법

$ ./dbsake frmdump /var/lib/mysql/testDB/*.frm  > test_frm_data.sql
1-4. 새 데이터베이스 생성 / 추출한 테이블 sql문 삽입
MariaDB [none]> create database test;
MariaDB [none]> flush privileges;
 
mysql -u[계정] -p[비밀번호] -h[호스트] -P[포트번호] test < test.sql

여기서 중요한 점 ~!! 운영 중인 서버의 mysql 버전과 복원할 곳의 버전의 다르면 밑에 에러가 발생

밑에 에러 또는 Schema missmatching 에러가 나올 경우 각 서버 데이터베이스의 버전을 같게 하고 해 봅시다.

ERROR 1808 (HY000): Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)

위 에러 때문에 진짜 한참 헤맸습니다. ㅠㅠ 

 

그래서 저는 도커를 통해 복구를 진행했습니다.

위에서 추출한 test.sql파일을 밀어 넣으면 아래와 같이 .frm, .ibd파일이 새로 생깁니다.

1-4-1. 도커 파일 사용
version: "3"                                                                                                       
services:
    db:
        # 컨테이너 이름 지정
        container_name: test-db
        # 이미지 지정 - official image 활용
        image: mariadb:10.5.5
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: xxxxx
            MYSQL_PASSWORD: xxxxx
            MYSQL_ROOT_HOST: '%'
            TZ: Asia/Seoul
        # 호스트에 있는 폴더를 컨테이너 안에 있는 폴더로 마운트
        volumes:
            #- ./task-db/conf.d:/etc/mysql/conf.d
        # 연결 포트 지정
        ports:
            - "3307:3306"

도커 설치 및 기본 명령어는 아래 포스팅을 참고해 주세요

2021.05.12 - [프로그램이야기/Docker] - 우분투 18.04 도커 설치

1-4-2. my.cnf 예시
[client]
default-character-set = utf8mb4
 
[mysql]
default-character-set = utf8mb4
 
[mysqld]
character-set-client-handshake = FALSE
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci
2. .ibd파일 사용

새로 생긴 .ibd파일을 제거해 주도록 합니다.

MariaDB [test]> alter table {테이블 이름} discard tablespace;
2-1. 백업된 ibd파일을 복사 후 권한 변경
cp ./[백업 ibd파일 위치] /var/lib/mysql/데이터베이스이름/
chown mysql:mysql [백업].ibd
2-1-1. 백업된 ibd파일을 복사 후 권한 변경 ( 도커를 이용할 시 )
alias drsync="rsync -e 'docker exec -i'"
drsync -av /source/ container:/destination/
chown mysql:mysql [백업].ibd
 
ex ) drsync -av ./test.ibd test-db:/var/lib/mysql/test/
2-2. 변경된 테이블 정보를 import 한다.
alter table [테이블 이름] import tablespace;

제가 복구를 진행했던 schedule 테이블의 결과입니다.

 

실 서버를 운영하던 로컬에서 개발을 하던 디비 정보는 함부로 삭제하지 말고 꼭 백업을 해두도록 합시다.!!

도움이 되셨으면 좋겠습니다. ㅎㅎ

728x90
반응형

댓글