안녕하세요 두잉이입니다.
오늘은 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 테이블의 결과입니다.
실 서버를 운영하던 로컬에서 개발을 하던 디비 정보는 함부로 삭제하지 말고 꼭 백업을 해두도록 합시다.!!
도움이 되셨으면 좋겠습니다. ㅎㅎ
'프로그램이야기 > mysql' 카테고리의 다른 글
[ MySQL ] mysqldump 명령어, mysql 특정 DB 덤프 및 복구 방법 (0) | 2021.11.16 |
---|
댓글