상황

    개발자, 관리자 실수로 인한 데이터 삭제시 전날 DB,Table 복원 필요 (Full 백업이용)

 

  • 원리

        Mysql 스키마 생성(.frm) 후 백업된 데이터 파일(.idb) 을 물리적으로 이동시켜 복원

        ( discard / import 이용)

 

  • innodb 파일구조

    mysql innodb 관리 운영상 innodb_file_per_tables=1(yes) 를 defalut 로 운영

   이럴경우 각각의 테이블 마다 테이블 스페이스가 할당되는 구조 (file-per-table tablespace)

 

 

  • 상황예시

 전달 데이터를 복원해주세요

  • 원리 

discard / import 

 

  •  진행순서
    1. Full 백업 압축 파일 리스트 확인
    2. 해당 DB 파일 압축해제
    3. discard 명렁어로 테이블 스페이스만 유지
    4. ibd 파일 복사
    5. 권한 변경
    6. import 명렁어로 데이터 복원
  • 해당 DB 파일 압축해제
[root@Fullbackup]# tar tvf Fullbackup.tar.gz
-rw-rw---- 0/0          131072 2022-05-31 05:35 abc/tb_abc_history.ibd
-rw-rw---- 0/0          114688 2022-09-14 09:07 abc/tb_xxxx_history.ibd
-rw-rw---- 0/0          294912 2024-01-09 03:06 abc/tb_xxxxd_history.ibd
  • discard 명렁어로 테이블 스페이스만 유지
SELECT CONCAT('ALTER TABLE `', table_name, '` DISCARD TABLESPACE;')
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='abc'
 
ALTER TABLE `tb_abc_history` DISCARD TABLESPACE;
ALTER TABLE `tb_xxxx_history` DISCARD TABLESPACE;
ALTER TABLE `tb_xxx_history` DISCARD TABLESPACE;
  •  idb 파일복사
[root@abc]# cp *.ibd /DB/Data/abc_20240125/
[root@abc]# ls -lsh
 
128K -rw-r----- 1 root  root 128K Jan 26 02:00 tb_abc_history.ibd
 12K -rw-r----- 1 mysql dba  9.0K Jan 26 01:34 tb_abc_history.frm
 16K -rw-r----- 1 mysql dba   14K Jan 26 01:34 tb_xxx_history.frm
112K -rw-r----- 1 root  root 112K Jan 26 02:00 tb_xxx_history.ibd
176K -rw-r----- 1 root  root 176K Jan 26 02:00 tb_xxxx_history.ibd
 16K -rw-r----- 1 mysql dba   14K Jan 26 01:34 tb_xxxx_history.frm
  • 소유자 변경후 idb파일 import
SELECT CONCAT('ALTER TABLE `', table_name, '` IMPORT TABLESPACE;')
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='abc'
 
ALTER TABLE `tb_abc_history` IMPORT TABLESPACE;
ALTER TABLE `tb_xxx_history` IMPORT TABLESPACE;
ALTER TABLE `tb_xxxd_history` IMPORT TABLESPACE;

+ Recent posts