IT. POST LIST

POST ALL LABEL

Mysql(MariaDB) INNODB .ibd 파일로 데이터 복구

By 때찌때찌맴매 - 5월 21, 2018

Mysql(MariaDB) INNODB .ibd 파일로 데이터 복구

* db 데이터 손실시 복구 방법은 백업된 sql 파일, bin-log파일, ibd,frm 등을 이용한 복구 방법 입니다.

* myisam 이라면 편하겠지만, innodb 라면 복구시 절차들이 귀찮긴 합니다.

* my.cnf 에 " innodb_file_per_table = 1  "  옵션이 있다면,  ibd 파일이 db디렉토리에 생성이 되어 있고, 해당 파일로 데이터 복구 진행합니다.

* 해당 작업은 전기 차단으로 인해 db가 손상되어 덤프불가, 백업 sql파일은 1주일전 데이터, bin-log는 용량으로 인해 5일 이하 로그 들만 존재..  모든데이터를 복구 하기 위해 ibd 파일을 이용한 복구 방법을 선택했습니다.

        my.cnf 파일등 참조

 [  기존 데이터 디렉토리 백업 및 생성(데이터 베이스생성) ]

[root@localhost]# /etc/init.d/mysqld stop

[root@localhost]# mv /usr/local/mysql/data /usr/local/mysql/data_bak

[root@localhost]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

[root@localhost]# /etc/init.d/mysqld start

[root@localhost ]# mysql -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.0.5-MariaDB-log Source distribution

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> create database xxxxxxx;
Query OK, 1 row affected (0.03 sec)
MariaDB [(none)]> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| xxxxxxxxx          | 
+--------------------+
3 rows in set (0.07 sec)

* 테이블 구조를 알수 없기에 기존의 1주일 전의 백업데이터로 1차 복구 진행.
* 백업데이터가 전무하다면, 해당 테이블을 하나하나 만들던가, 기존 data 디렉토리에서 bin-log 등을 이용하여 테이블구조 복원을 진행 합니다. 또는 기도하면서 다른 백업 데이터를 찾아 봅니다.

[ 테이블 구조 복원 작업 및 기존 ibd 데이터 제거 ]

[root@localhost ]# mysql -p xxxxxxx < xxxxxxx.sql

[root@localhost ]# mysql -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.0.5-MariaDB-log Source distribution

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> use xxxxxxx;
Database changed
MariaDB [xxxxxxx]> alter table {테이블명} discard tablespace;

* 위 명령어 진행 하면 해당 테이블의 tablespace 가 제거 되면서, .ibd 데이터 파일이 제거가 됩니다.

  

[ ibd 데이트 import 진행 ]

[root@localhost ]# \cp -arp /usr/local/mysql/data_bak/*.ibd /usr/local/mysql/data/

[root@localhost ]# mysql -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.0.5-MariaDB-log Source distribution

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> use xxxxxxx;
Database changed
MariaDB [xxxxxxxx]> alter table {테이블명} import tablespace;
Query OK, 0 rows affected, 2 warnings (0.20 sec)

MariaDB [xxxxxxx]> select * from {테이블명} limit 10;
+-----+----------------------------------------+-------+------------------+--------+-----------+--------+---------------------+
| idx | url                                    | adkey | visit_id         | nv_key | useragent | month  | reqdate             |
+-----+----------------------------------------+-------+------------------+--------+-----------+--------+---------------------+
|   1 |                                        |       | A140828000000047 |        |           | 201408 | 2014-08-28 10:31:34 |
|   2 | http://xxx.co.kr/test/logtest.php      |       | 2C=B             |        |           | 201408 | 2014-08-28 10:31:35 |
|   3 |                                        |       | A140828000000048 |        |           | 201408 | 2014-08-28 10:32:10 |
|   4 | http://xxx.co.kr/test/logtest.php      |       | A140828000000049 |        |           | 201408 | 2014-08-28 10:32:10 |
|   5 |                                        |       | A140828000000050 |        |           | 201408 | 2014-08-28 10:52:56 |
|   6 | http://xxx.co.kr/test/logtest.php      |       | A140828000000051 |        |           | 201408 | 2014-08-28 10:52:56 |
|   7 |                                        |       | A140828000000052 |        |           | 201408 | 2014-08-28 11:22:08 |
|   8 | http://xxx.co.kr/test/logtest.php      |       | A140828000000053 |        |           | 201408 | 2014-08-28 11:22:09 |
|   9 |                                        |       | A140828000000054 |        |           | 201408 | 2014-08-28 11:43:27 |
|  10 | http://xxx.co.kr/test/logtest.php      |       | A140828000000055 |        |           | 201408 | 2014-08-28 11:43:31 |
+-----+----------------------------------------+-------+------------------+--------+-----------+--------+---------------------+
10 rows in set (0.00 sec)

* 정상적으로 복구 되어 데이터가 확인됩니다. 하지만 해당 작업으로 모든 데이터가 100% 복구 되기는 어렵습니다. 이점 인지 바랍니다.


* 테이블을 일일이 수작업 하기에는 무리가 있기 때문에 간단하게 스크립트를 작성합니다. 빨리 집에가기 위해 스크립트도 대충 쉽게 작성합니다.
[ shell script ]

[root@localhost ]# vi ibd_recover.sh

=======================================================================================
#! /bin/bash
org_data="/{원본경로}"
new_data="/{새로운경로}"

###isam
ll $org_data/ *.MY* | awk '{print $8}' | awk -F. '{print $1}' | uniq -c > isam_list.txt
###ibd
ll $org_data/ *.ibd | awk '{print $8}' | awk -F. '{print $1}' > ibd_list.txt


##isam_copy
cat isam_list.txt | while read isam
do
        \cp -arp $org_data/{databases_name}/$isam.* $new_data/{databases_name}/
done

##ibd_copty & import
cat ibd_list.txt | while read ibd

do
        echo "use {databases_name}; alter table $ibd discard tablespace;" | /usr/local/mariadb/bin/mysql -u root -p{db_root_pass}
        \cp -arp $org_data/{databases_name}/$ibd.ibd $new_data/{databases_name}/
        echo "use {databases_name}; alter table $ibd import tablespace;" | /usr/local/mariadb/bin/mysql -u root -p{db_root_pass}
done
=======================================================================================

* myisam 관련 내용은 innodb 와 같이 사용하는 데이터도 있기 때문에 작성 되었습니다. 필요 없으면 주석하면 되겠습니다.

  • Share:

You Might Also Like

0 개의 댓글