MySQL 8.0 에서 data dictionary 가 새롭게 생성되면서 기존에 사용하던 .frm / .trn / .trg / .par 등의 파일들은 더 이상 이용되지 않음.
MySQL 데이터베이스의 데이터들은 mysql.ibd 테이블 스페이스에 저장됨.
InnoDB 엔진 외 metadata 저장은 SDI (Serailized Dictionary Information) 파일에 json 으로 저장됨.
general_log 와 slow_log 테이블에서 .sid 파일을 확인할 수 있음.
ibd 파일을 이용하여 복구를 진행하기 위해선 ① ibd 파일 ② CREATE TABLE 문 (table 구조) 가 필요함.
1. 데이터 베이스 생성
> CREATE DATABASE [데이터베이스명]; > USE [데이터베이스명]; |
2. 테이블 구조 생성
> CREATE TABLE `[테이블명]` ([구조...]) ENGINE=InnoDB; |
3. 테이블 스페이스 삭제 (기존에 연동되어있던 데이터를 해제, 해당 명령어 입력 시 현재 .ibd 파일이 삭제됨)
> ALTER TABLE [테이블명] DISCARD TABLESPACE; > flush privileges; |
- 에러 발생 시
**에러발생**
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails |
**해결방법**
Mysql이 테이블 간 관계가 있는 데이터를 함부로 수정하거나 삭제할 수 없도록 안전장치를 해두었기 때문에 에러를 통해 경고
> SET foreign_key_checks = 0; > SET foreign_key_checks = 1; \\ 원상복구 |
4. 기존 ibd파일을 운영중인 mysql 디렉터리에 복사 및 권한 설정
# cp -arp [백업 ibd 파일 위치].ibd [복구할 ibd 파일 위치].ibd # chown mysql:mysql [백업ibd].ibd |
5. 백업받은 ibd 파일을 통해 현제 데이터와 연동
> ALTER TABLE [테이블명] IMPORT TABLESPACE; |
6. 확인
> USE [데이터베이스명]; > SELECT * FROM [테이블명]; |
* 위 작업을 중복적으로 진행해야할 경우 아래의 스크립트 이용. (단 테이블 구조는 모두 들어가있는 상태여야함)
#!/bin/bash db_user="root" db_pass="[DB root 패스워드]" database="[복구할 데이터베이스명]" for table in `mysql -u${db_user} -p${db_pass} -e"show tables" $database | /bin/grep -v "^$" | /bin/grep -v "Tables_in_$database"` do echo "${table} 복구시도..." mysql -u${db_user} -p${db_pass} -e "use $database; SET foreign_key_checks = 0; ALTER TABLE ${table} DISCARD TABLESPACE; flush privileges;" cp -arp [백업해놓은 ibd 파일 디렉터리]/${table}.ibd [실제 ibd 파일이 위치할 경로] mysql -u${db_user} -p${db_pass} -e "use $database; SET foreign_key_checks = 0; ALTER TABLE ${table} IMPORT TABLESPACE; flush privileges;" done exit 0 |
참고 URL :
2) https://dev.mysql.com/doc/refman/8.0/en/innodb-table-import.html
3) https://www.chriscalender.com/recovering-an-innodb-table-from-only-an-ibd-file/
4) https://dba.stackexchange.com/questions/288860/restoring-mysql-data-from-ibd-file
'서버 & 시스템 > Linux' 카테고리의 다른 글
telnet 외 서버 포트 체크하는 법 (1) | 2022.01.04 |
---|---|
apache 벤치마킹 스트레스툴 ab (3) | 2021.12.28 |
Galera cluster 구축하기 (0) | 2021.04.21 |
Centos6에서 glibc 2.4 설치하기 (1) | 2021.04.14 |
CentOS DVD, Everything, Minimal ISO 차이 (0) | 2020.11.12 |