IT정보사전

[MariaDB] .ibd 파일로 DB 복구하기 본문

IT정보

[MariaDB] .ibd 파일로 DB 복구하기

작은나무0530 2024. 6. 22. 13:06
728x90
반응형

안녕하세요~ 작은나무입니다!
음.. MariaDB서버가 깨져서 복구를 해야 하는대... dump파일로 백업을 안해놔서 복구에 엄청 고생했습니다.
손상된 서버의 백업 파일은 없지만, .frm, .ibd파일이 있어서 이 파일을 이용해 복구를 진행한 내용을 공유하고자 합니다.

.frm : 테이블의 구조를 보관하는 파일
.ibd : 테이블의 데이터가 저장되는 파일

복구시에 가장 중요한 부분이 손상된 서버에 설치되었던 MySQL 또는 MariaDB의 버전입니다.
※ 버전을 다르게 했더니 스키마는 생성이되는대 데이터가 복구가 되지 않았습니다.

저는 윈도우 11 프로에서 리눅스 환경( wsl )을 구성하고 docker를 이용해서 복구를 진행했습니다.

1. .frm, .ibd 파일 백업
먼저 복구를 진행할 .frm, .ibd 파일을 확인하고 백업을 진행합니다.
※ 일반적으로 /var/lib/mysql 폴더에서 확인 할 수 있습니다.

2. dbsake 설치
.frm 파일의 스키마를 확인하기 위해 dbsake를 설치 진행합니다.

curl -s http://get.dbsake.net > dbsake	#설치
chmod 700 dbsake	#권한변경
./dbsake --version	#버전확인

3. 복구할 frm파일을 wsl 우분투로 복사
.frm 파일을 윈도우 우분트 환경으로 복사하기 위해 아래 명령어를 입력하면 폴더가 뜨게 되는대요
간단하게 파일을 복사할 수 있습니다.

explorer.exe .

파일을 복사하고 확인하면 아래와 같이 바로 확인할 수 있습니다.

4. frm파일 > sql파일로 변경
.frm 파일을 설치한 MariaDB 폴더에 복사해서 붙여 넣어도 확인은 되지만 복구할 때 정상적으로 진행되지 않아 아래와 같이 sql로 변경을 진행했습니다.

./dbsake frmdump ./tbl_answers.frm > tbl_answers.sql

5. 도커를 이용해 MariaDB container 실행 
docker-compose를 이용해서 MariaDB container를 실행해서 복구를 진행합니다.

$ vi docker-compose.yml
version: '3.5'
services:
  mariadb:
    image: mariadb:10.2		#생성할 이미지
    container_name: smalltree_db	#컨테이너 이름
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxxxx
      MYSQL_DATABASE: test	#데이터베이스 명
      MYSQL_ROOT_HOST: "%"
      TZ: Asia/Seoul
    restart: on-failure
    ports:
      - "3306:3306"
    volumes:
     - ${PWD}/mariadb:/var/lib/mysql	#호스트 폴더를 도커 컨테이너로 마운트

※ vi docker-compose.yml을 입력하고 파일이 없다면 위 코드를 그대로 복사해서 저장하면 됩니다.

파일을 생성하고 도커 컨테이너를 실행, 프로세스가 정상적인지 확인합니다.

docker compose up -d	#실행
docker ps -a	#프로세스 확인

실행이 되면 database tool을 이용해서도 접속 확인을 할 수 있게 됩니다.
접속을 하려면 IP를 확인해야 하는대요 아래와 같이 입력해서 IP 정보를 확인할 수 있습니다.

ip addr show eth0

IP를 확인했으니 database tool을 이용해서도 접속이 가능합니다.

6. MariaDB에 접속 
docker를 사용했기 때문에 아래와 mariadb에 접속을 진행합니다.
※ 패스워드는 위에 docker-compose.yml 생성시에 입력한 패스워드를 입력

docker exec -it [컨테이너 이름] /bin/bash
mysql -u root -p

docker-compose에 데이터베이스 명을 등록했기 때문에 database가 생성됐는지 확인합니다.

show databases;
create database [데이터베이스 명];		#데이터베이스가 없다면 생성합니다.

6. 변환한 sql파일로 테이블 생성 및 복구
변환된 sql 파일을 이용해서 데이터베이스에 테이블을 생성합니다.
테이블을 생성하면 아래와 같이 .frm, .ibd 파일이 신규로 생성되게 됩니다.

저는 호스트 폴더를 도커 컨테이너로 마운트 했기 때문에 mariadb 경로에서 확인됩니다.

생성된 테이블을 tablespace에서 관리하지 않게 하기 위해 아래와 같이 변경합니다.

ALTER TABLE [테이블 명] DISCARD TABLESPACE;

※ sql 실행문이기 때문에 mariadb에 접속하셔서 명령어를 입력해야 합니다.

해당 명령어를 실행하게 되면 아래와 같이 .ibd파일은 삭제됩니다.

이제 기존에 복구해야하는 백업 .ibd파일을 해당 위치로 복사를 진행하고 권한을 변경합니다.

chmod 777 [파일명].ibd

변경된 테이블 정보를 다시 import 진행합니다.

ALTER TABLE [테이블 명] IMPORT TABLESPACE;

복구가 완료되고 아래와 같이 데이터가 정상적으로 확인됩니다.
※ 날짜 형식에 문제가 좀 있는지 datetime 형식은 복구가 좀 이상하네요...

만약 import를 진행할 때 정상적으로 처리되지 않는다면, DB의 버전이 다른 경우일 수 있으니, MariaDB나 MySQL의 버전을 변경해서 다시 시도해 보세요~

고생하지 말고 DB는 항상 백업!!

728x90
반응형
그리드형
Comments