91
Trick เกี่ยวกับการแก้ปัญหา เกี่ยวกับ compiler gcc c++ c build make install / Re: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« Last post by golfreeze on มิถุนายน 10, 2021, 08:17:37 PM »ในกรณีถ้า ไม่สามารถรัน recovery mode 1-6 แล้วยัง error อยู่ให้ทำการตั้งสติให้มั่น และใช้วิธี ใช้ tool
ในการดึงข้อมูลครับ ซึ่งบอกเลยว่าวิธีนี้ จะ advance หน่อย
แต่ถ้ามีพื้นฐานในการ compile source มาดีก็จะผ่านได้ครับ เริ่มจาก download tool undrop
https://twindb.com/undrop-for-innodb/
https://twindb.com/recover-corrupt-mysql-database/
ผมใช้ env เป็น centos 7.x และลง Mysql-server 5.6 ครับซึ่งจะมี tool innodb ให้ใช้งานค่อนข้างเยอะและเสถียรแล้ว
==== install new Mysql 5.5
http://repo.mysql.com/yum/mysql-5.5-community/el/7/x86_64/
https://www.cyberithub.com/install-mysql/
==== install undrop
git clone git@github.com:twindb/undrop-for-innodb.git
yum install make gcc flex bison
ทำการ make ก่อนเพื่อให้ได้
หลังจาก make เสร็จ ก็จะได้
stream_parser
c_parser
มาครับ
ทำการ copy ibdata1 จากเครื่องที่ corrupted หรือ harddisk มีปัญหามา ในกรณีของผมเป็นการรวมไฟล์ อยู่ในไฟล์เดียวคือ ibdata1
และ innodb_file_per_table=0
แล้วทำการ รัน
./stream_parser -f ibdata1
จะได้ไฟล์ตัวที่เป็น INDEX และ BLOB มาครับ ใน folder
/root/undrop-for-innodb/pages-ibdata1
[PKL@db2 pages-ibdata1]# ls -lah
drwxr-xr-x 2 root root 300K Jun 6 19:56 FIL_PAGE_INDEX
drwxr-xr-x 2 root root 4.2M Jun 6 19:56 FIL_PAGE_TYPE_BLOB
ซึ่งถ้าเราเข้าไป string file ดูก็จะเห็นเป็น raw data อยู่ใน folder: FIL_PAGE_INDEX ครับ
# strings 0000000008664211.page
String 0000000008664211.page
==check innodb
show variables like 'innodb_file_per_table';
./c_parser -f pages-ibdata1/FIL_PAGE_INDEX/0000000008671378.page -t dictionary/member_golf.sql
==== step1 begin here =====
./stream_parser -f ibdata1
===ทำการเชคจาก table name จาก 0000000000000001.page ก่อน
./c_parser -4 -f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql
000082B5C909 5400001D8F1CD8 SYS_TABLES "PKL\_sabye/member" 3336397 69 1 0 0 "" 0
000082B5C912 59000185BB2B9C SYS_TABLES "PKL\_sabye/received\_thb" 3336398 3 1 0 0 "" 0
000082B5CAB0 6A0000E78C06CE SYS_TABLES "PKL\_sabye/transfer\_transaction" 3336399 42 3336398
==== step2 for ทำการค้นหา INDEX ของ table: member
./c_parser -4 -f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 3336398
000082B5C90D D600019E61014F SYS_INDEXES 3336398 8671379 "PRIMARY" 1 3 0 41052
SET FOREIGN_KEY_CHECKS=0;
LOAD DATA LOCAL INFILE '/home/centos/undrop-for-innodb/dumps/default/SYS_INDEXES' REPLACE INTO TABLE `SYS_INDEXES` CHARACTER SET UTF8 FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_INDEXES\t' (`TABLE_ID`, `ID`, `NAME`, `N_FIELDS`, `TYPE`, `SPACE`, `PAGE_NO`);
-- STATUS {"records_expected": 7615, "records_dumped": 7457, "records_lost": true} STATUS END
Primary = 8671379
====step3 : for received_thb.sql dump export to sql file with position 0000000008671379
./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000008671379.page -t dumps/received_thb.sql > dumps/default/received_thb 2> dumps/default/received_thb.sql
==step4: for member.sql
./c_parser -4 -f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 3336397
000082B5C904 D10001532C06B9 SYS_INDEXES 3336397 8671378 "PRIMARY" 1 3 0 152194
===step5: generate and import data
./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000008671378.page -t dumps/member.sql -b pages-ibdata1/FIL_PAGE_TYPE_BLOB -o dumps/default/member5 -l dumps/default/member5.sql
===step6: load data to file
cd dump
mysql --local-infile -uroot -p
source member5.sql
show create table member;
เท่านี้ก็จะได้ข้อมูลจาก table: member ออกมาละครับผม
ขอจงอย่าล้มเลิก ยาก แปลว่าทำได้ สู้ๆ ครับ ^_^
ทีมงาน R&D
กอล์ฟ [at] Packetlove[dot]com
ในการดึงข้อมูลครับ ซึ่งบอกเลยว่าวิธีนี้ จะ advance หน่อย
แต่ถ้ามีพื้นฐานในการ compile source มาดีก็จะผ่านได้ครับ เริ่มจาก download tool undrop
https://twindb.com/undrop-for-innodb/
https://twindb.com/recover-corrupt-mysql-database/
ผมใช้ env เป็น centos 7.x และลง Mysql-server 5.6 ครับซึ่งจะมี tool innodb ให้ใช้งานค่อนข้างเยอะและเสถียรแล้ว
==== install new Mysql 5.5
http://repo.mysql.com/yum/mysql-5.5-community/el/7/x86_64/
https://www.cyberithub.com/install-mysql/
==== install undrop
git clone git@github.com:twindb/undrop-for-innodb.git
yum install make gcc flex bison
ทำการ make ก่อนเพื่อให้ได้
หลังจาก make เสร็จ ก็จะได้
stream_parser
c_parser
มาครับ
ทำการ copy ibdata1 จากเครื่องที่ corrupted หรือ harddisk มีปัญหามา ในกรณีของผมเป็นการรวมไฟล์ อยู่ในไฟล์เดียวคือ ibdata1
และ innodb_file_per_table=0
แล้วทำการ รัน
./stream_parser -f ibdata1
จะได้ไฟล์ตัวที่เป็น INDEX และ BLOB มาครับ ใน folder
/root/undrop-for-innodb/pages-ibdata1
[PKL@db2 pages-ibdata1]# ls -lah
drwxr-xr-x 2 root root 300K Jun 6 19:56 FIL_PAGE_INDEX
drwxr-xr-x 2 root root 4.2M Jun 6 19:56 FIL_PAGE_TYPE_BLOB
ซึ่งถ้าเราเข้าไป string file ดูก็จะเห็นเป็น raw data อยู่ใน folder: FIL_PAGE_INDEX ครับ
# strings 0000000008664211.page
String 0000000008664211.page
==check innodb
show variables like 'innodb_file_per_table';
./c_parser -f pages-ibdata1/FIL_PAGE_INDEX/0000000008671378.page -t dictionary/member_golf.sql
==== step1 begin here =====
./stream_parser -f ibdata1
===ทำการเชคจาก table name จาก 0000000000000001.page ก่อน
./c_parser -4 -f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql
000082B5C909 5400001D8F1CD8 SYS_TABLES "PKL\_sabye/member" 3336397 69 1 0 0 "" 0
000082B5C912 59000185BB2B9C SYS_TABLES "PKL\_sabye/received\_thb" 3336398 3 1 0 0 "" 0
000082B5CAB0 6A0000E78C06CE SYS_TABLES "PKL\_sabye/transfer\_transaction" 3336399 42 3336398
==== step2 for ทำการค้นหา INDEX ของ table: member
./c_parser -4 -f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 3336398
000082B5C90D D600019E61014F SYS_INDEXES 3336398 8671379 "PRIMARY" 1 3 0 41052
SET FOREIGN_KEY_CHECKS=0;
LOAD DATA LOCAL INFILE '/home/centos/undrop-for-innodb/dumps/default/SYS_INDEXES' REPLACE INTO TABLE `SYS_INDEXES` CHARACTER SET UTF8 FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_INDEXES\t' (`TABLE_ID`, `ID`, `NAME`, `N_FIELDS`, `TYPE`, `SPACE`, `PAGE_NO`);
-- STATUS {"records_expected": 7615, "records_dumped": 7457, "records_lost": true} STATUS END
Primary = 8671379
====step3 : for received_thb.sql dump export to sql file with position 0000000008671379
./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000008671379.page -t dumps/received_thb.sql > dumps/default/received_thb 2> dumps/default/received_thb.sql
==step4: for member.sql
./c_parser -4 -f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 3336397
000082B5C904 D10001532C06B9 SYS_INDEXES 3336397 8671378 "PRIMARY" 1 3 0 152194
===step5: generate and import data
./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000008671378.page -t dumps/member.sql -b pages-ibdata1/FIL_PAGE_TYPE_BLOB -o dumps/default/member5 -l dumps/default/member5.sql
===step6: load data to file
cd dump
mysql --local-infile -uroot -p
source member5.sql
show create table member;
เท่านี้ก็จะได้ข้อมูลจาก table: member ออกมาละครับผม
ขอจงอย่าล้มเลิก ยาก แปลว่าทำได้ สู้ๆ ครับ ^_^
ทีมงาน R&D
กอล์ฟ [at] Packetlove[dot]com