.sql 백업파일이 없는경우 복구는 참 난감하다. 구조를 잘 몰라서 2주간 고생했다.
서버에서 MariaDB나 Mysql을 삭제한 경우가 아니라면 다음을 시도해볼 수 있다.
리눅스에서 진행
0. MariaDB 또는 Mysql 버전을 확인한다. (필수)
버전이 확인되지 않는 경우 3. 을 참고한다.
1. mysql 폴더 경로를 들어가 본다. mysql 폴더 경로는 다를수 있다.
$ cd /var/lib/mysql
2. mysql 폴더 경로에 있는 다음 파일 및 폴더를 백업한다.
ib_logfile0 , ib_logfile1, ibdata1, [복구하고자하는 데이터베이스 폴더]
3. [복구하고자하는 데이터베이스 폴더명] 으로 들어가보면, .frm파일과 .ibd파일을 볼 수 있다.
frm파일은 테이블의 구조(스키마)를 저장하는 파일이고, ibd는 실제 데이터(로우)가 들어간다.
frm파일에는 MariaDB 또는 Mysql 의 버전이 표시되는 경우가 있다.
mysqlfrm 도구나 dbsake를 이용하여 frm 파일을 읽어 보자. 필자는 dbsake를 이용했다.
# dbsake 설치 (설치하면 디렉토리가 생성됨)
$ curl -s http://get.dbsake.net > dbsake
# dbsake 700 권한 부여
$ chmod 700 dbsake
# dbsake 버전 확인
$ ./dbsake --version
4. MariaDB 또는 Mysql 를 삭제한 후 버전에 맞추어 재설치
(클린삭제, 삭제 판단은 본인에게 있다. [복구하고자하는 데이터베이스 폴더] 만 삭제해봐도 좋을 것 같음)
5. mysql에 접속하여 복구하고자 했던 데이터베이스를 만든다.
$ sudo mysql -uroot -p
# 데이터베이스가 없는지 확인
$ show databases;
# 데이터베이스 생성
$ create database [데이터베이스명];
6. 백업해둔 frm파일을 이용해 테이블을 생성한다. 테이블을 생성하면 ibd가 신규로 생성된다.
frm파일을 하나의 .sql파일로 만들 수 있다.
$ dbsake frmdump --type-codes [frm파일 경로/* ] > [SAVE_NAME].sql (dbsake 디렉토리 경로에서 실행)
만들어진 .sql 파일로 테이블을 생성한 후 다음 명령어를 이용해 ibd(빈 데이터)와의 연동을 해제한다. (주의)
$ sudo mysql -uroot -p
$ use [데이터베이스명];
$ ALTER TABLE table_name DISCARD TABLESPACE; (테이블 하나씩)
7. 백업한 ibd파일을 새로 만들어진 [데이터베이스 폴더]에 복사붙여넣기한다.
8. 복사 붙여넣기한 ibd파일의 권한을 mysql로 바꿔줘야한다.
# 폴더 통째로 mysql 권한부여
$ chown -R mysql:mysql [폴더경로]
9. mysql에 접속하여 데이터들을 테이블 하나씩 연동한다. (끝)
$ ALTER TABLE table_name IMPORT TABLESPACE;
여기서 에러가 나는 경우는 mysql or mariadb 버전이 다른 경우다.
버전이 다르게 설치되면 위 방법이 안되는 경우가 있다. ibd,frm 연동방식이 다름으로 추정
질문
1. ib_logfile0 , ib_logfile1, ibdata1 는 어디에 쓰나요?
데이터를 ibdata1과 ibd를 연관지어 저장하는 경우가 있다고 한다. (my.cnf..... xxxx.cnf의 방식에 따라 정해짐)
이 경우에는 위와 다른 복구를 해봐야한다.. 다만 매우 어려워보임.
해당 케이스의 경우, ib_logfile0 와 ib_logfile1파일이 혹시 필요할 수 있으니 백업한 것임.
DB 는 자주 백업해 두자.
'쿼리 > MYSQL' 카테고리의 다른 글
[MYSQL] 그룹별 카운트 (0) | 2022.08.17 |
---|---|
[MYSQL] 트리거 작성 (0) | 2022.07.01 |
[MYSQL] 계정 생성 및 외부 접속 허용 (0) | 2022.06.23 |
MYSQL DB 백업하기 (0) | 2022.04.18 |
mariadb 완벽제거 (0) | 2022.03.13 |
MYSQL sql_mode 세팅 (0) | 2022.03.12 |