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 와 같이 사용하는 데이터도 있기 때문에 작성 되었습니다. 필요 없으면 주석하면 되겠습니다.
0 개의 댓글