기초공부 - (8) 테이블 복구

2024. 3. 10. 22:59MySQL/Class

반응형

# 사용자 실수 또는 어떤 알 수 없는 이유로 인해 테이블 또는 데이터가 삭제가 되는 경우가 있을 것입니다.

특정 테이블을 복구하는 방법을 해보도록 하겠습니다.

 

1. 준비사항

(1) 백업 파일

(2) dbsake (MySQL 5.x 버전만 해당)

 

2. 상황 만들기

(1) 테이블 생성

mysql> create table temp_mha2(a int);
Query OK, 1 row affected (0.01 sec)

mysql> insert into temp_mha2 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into temp_mha2 values(2);
Query OK, 1 row affected (0.01 sec)

mysql> insert into temp_mha2 values(3);
Query OK, 1 row affected (0.00 sec)

mysql> insert into temp_mha2 values(4);
Query OK, 1 row affected (0.01 sec)

 

(2) 백업

[root@test03 mysql]# mysql.server stop
Shutting down MySQL. SUCCESS!

[root@test03 data]# cd /data/mysql_data
[root@test03 mysql_data]# cp -r test ../.

[root@test03 data]# mysql.server start
Starting MySQL. SUCCESS!

 

(3) 삭제

[root@test03 test]# rm -rf temp_mha2.ibd

 

(4) 테이블 조회

테이블 깨졌다는 것을 알 수 있다.

 

3. 복구

(1) 백업 파일 복사

[root@test03 test]# cp /backup/mysql_data/test/temp_mha2.ibd /data/mysql_data/test/.
[root@test03 test]# chown mysql:mysql temp_mha2.ibd

 

(2) import tablespace

mysql> alter table temp_mha2 import tablespace;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> use test;
Database changed
mysql> select * from temp_mha2;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

mysql>

 

4. 결론

특정 테이블을 복구하기 위한 가장 빠른 방법이 아닐까 생각합니다.

MySQL 8.0 부터는 테이블 구조 정보가 있는 *.frm 확장자를 더이상 사용하지 않고, *.ibd 를 사용하는 것으로 보입니다.

그래서 기존 MySQL 5.x에서 dbsake를 별도 설치하여 복구 했던 방식이 사라져, 한결더 편해졌다고 할 수 있을 것 같습니다.

 

5. MySQL 5.x 테이블 복구

 - MySQL 5.x 의 테이블 복구 방식은 빠른 스크립트로 간략하게 설명드리도록 하겠습니다.

 

(1) dbsake 설치

 - *.frm 확장자를 가진 파일은 테이블의 구조의 정보를 가지고 있습니다. 이것을 확인하기 위해서는 dbsake가 필요합니다.

[root@test03 mysql]# curl -s http://get.dbsake.net > dbsake
[root@test03 mysql]# chmod 700 dbsake
[root@test03 mysql]# ./dbsake --version
dbsake, version 2.1.2 (git: 50de953)

 

(2) 복구

 - dbsake를 이용한 테이블 구조 읽기(*.frm)

[root@test03 mysql]# ./dbsake frmdump /backup/temp_mha2.frm > test.sql
--
-- Table structure for table `temp_mha2`
-- Created with MySQL Version 5.5.29
--

CREATE TABLE `temp_mha2` (
  `a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


[root@test03 mysql]# mysql -u root -p test < test.sql

 

 - *.ibd 복사 및 복구

# discard
mysql> alter table test.temp_mha2 discard tablespace;

# 파일 복사
[root@test03 mysql]# cp /backup/mysql_data/test/temp_mha2.ibd /data/mysql_data/test/.

# import
mysql> alter table test.table1 import tablespace;
반응형