Author Topic: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]  (Read 12713 times)

golfreeze

  • Administrator
  • Hero Member
  • *****
  • Posts: 2140
    • View Profile
    • นั่งสมาธิ สติปัฏฐานสี่ พาเที่ยววัด แนะนำวัด แจกcd ธรรมะฟรี
    • Email
innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« on: สิงหาคม 26, 2011, 11:09:37 AM »
Recovery mysql data from innodb database .
วันก่อนมี case เกี่ยวกับตัว file ib_logfile0 , ib_logfile1 ของ database ตัวหนึ่งที่ type เป็น innodb มีปัญหาครับ
file มัน corrupt จนทำให้เปิด mysql engine ไม่ขึ้น ทำให้ mysql service down ไป

สำหรับวิธีการแก้ปัญหาของผมคือ ต้องเปิด recovery mode ของ innodb
แล้วทำการเข้าไป dump database ก้อนนั้นออกมา
drop database ที่ใช้งาน innodb ออก

จากนั้นทำการ ลบ ib_logfile0 แล้วเปิด mysql engine แบบปกติแล้วให้ มัน generate ib_logfile0
จากนั้นทำการ create database ที่ต้องการใช้งาน เป็น innodb
ทำการ import database ลงไปใน database ที่สร้าง

วิธีการปรับ recovery mode มี อยู่ 6 ค่าด้วยกันครับลองอ่านเพิ่มได้ที่นี่นะ
http://dev.mysql.com/doc/refman/5.1/en/forcing-innodb-recovery.html
แต่ในเคสผม ผมจะ enable recovery mode ระดับ 5
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
Do not look at undo logs when starting the database: InnoDB treats even incomplete transactions as committed.

เริ่มโดยการ backup file (ibdata1 , ib_logfile0 , ib_logfile1 ) ไว้ก่อนนะครับ
แล้วทำ
###Enable innodb recovery mode in my.cnf
[mysqld]
innodb-force-recovery = 5

เสร็จทำการ restart mysql service.
เข้าไป dump database ที่ใช้งาน innodb ออกมา

#mysqldump -uxxx -p amavis > amavis_2011.sql

#mysql -p
>drop database amavis;
เข้าไป drop database amavis ครับ

เสร็จแล้วทำการ stop mysql engine
ลบ ibdata1 , ib_logfile0 , ib_logfile1

ทำการ comment ใน my.cnf
#innodb-force-recovery = 5
restart mysql service.

รอให้มัน generate ไฟล์
ibdata1 , ib_logfile0 , ib_logfile1

เสร็จทำการเข้าไป create database ครับ
#mysql -p
>create database amavis;
แล้วทำการ dump database กลับลงไปใน amavis.
#mysql -uxxx -p amavis < amavis_2011.sql

ก็เป็นการเสร็จสิ้นการ recovery ibdata1 ของ innodb ครับผม ^^

sukjai.krub

  • Newbie
  • *
  • Posts: 1
    • View Profile
    • Email
Re: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« Reply #1 on: สิงหาคม 12, 2012, 06:51:37 PM »
อ.กอล์ฟ รบกวนสอบถาม database เป็น mysql แบบ innodb หากเราทำการลบไฟล์ ib_logfile0 กับ ib_logfile1 ใน Server
  ทำให้ไม่สามารถเปิดตารางที่เป็น innodb ได้เลย จะมีวิธีการอย่างไรกู้คืนทำให้เปิดไฟล์ได้บ้างครับ ขอบคุณครับ

golfreeze

  • Administrator
  • Hero Member
  • *****
  • Posts: 2140
    • View Profile
    • นั่งสมาธิ สติปัฏฐานสี่ พาเที่ยววัด แนะนำวัด แจกcd ธรรมะฟรี
    • Email
Re: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« Reply #2 on: สิงหาคม 14, 2012, 02:10:17 PM »
ลองปรับเป็น mode "innodb-force-recovery = 6"
ได้ปะครับผม

แล้วทำการ dump ข้อมูลออกมาก่อนแล้วก็ค่อย dump กลับไปอีกที

whitevampire66

  • Newbie
  • *
  • Posts: 2
    • View Profile
Re: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« Reply #3 on: เมษายน 18, 2013, 06:53:48 PM »
ขอบคุณงับ ^^

golfreeze

  • Administrator
  • Hero Member
  • *****
  • Posts: 2140
    • View Profile
    • นั่งสมาธิ สติปัฏฐานสี่ พาเที่ยววัด แนะนำวัด แจกcd ธรรมะฟรี
    • Email
Re: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« Reply #4 on: มีนาคม 04, 2015, 12:20:59 AM »
ถ้าท่านใดใช้งานเป็น myisam ลองดูตามนี้นะครับผม
http://golfreeze.packetlove.com/smileboard/index.php?topic=81.msg1390;topicseen#msg1390

golfreeze

  • Administrator
  • Hero Member
  • *****
  • Posts: 2140
    • View Profile
    • นั่งสมาธิ สติปัฏฐานสี่ พาเที่ยววัด แนะนำวัด แจกcd ธรรมะฟรี
    • Email
Re: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« Reply #5 on: พฤษภาคม 23, 2021, 10:46:36 PM »
==== found error mysql could not start ==== tail -f /var/log/mysql/mysqld.log
2021-05-23T15:26:05.167047Z 0 [System] [MY-010910] [Server] /usr/libexec/mysqld: Shutdown complete (mysqld 8.0.21)  Source distribution.
2021-05-23T15:27:10.587795Z 0 [Warning] [MY-010139] [Server] Changed limits: max_open_files: 10000 (requested 25980)
2021-05-23T15:27:10.587801Z 0 [Warning] [MY-010142] [Server] Changed limits: table_open_cache: 2397 (requested 4000)
2021-05-23T15:27:10.821955Z 0 [System] [MY-010116] [Server] /usr/libexec/mysqld (mysqld 8.0.21) starting as process 5593
2021-05-23T15:27:10.829416Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-05-23T15:27:10.847916Z 1 [ERROR] [MY-012263] [InnoDB] The Auto-extending innodb_system data file './ibdata1' is of a different size 0 pages (rounded down to MB) than specified in the .cnf file: initial 32000 pages, max 0 (relevant if non-zero) pages!
2021-05-23T15:27:10.848094Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2021-05-23T15:27:11.348117Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2021-05-23T15:27:11.348381Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

===>ทำการแก้ไขโดย
vi /etc/my.cnf.d/mysql-server.cnf
[mysqld]
innodb_data_file_path = ibdata1:20M:autoextend

cd /var/lib/
mv mysql mysql.ori
systemctl restart mysqld

mysql -p
create database newdb;

mysql_secure_installation
ตั้งรหัส root ใหม่

import db:
mysql -uroot -p newdb < newdb.sql

golfreeze

  • Administrator
  • Hero Member
  • *****
  • Posts: 2140
    • View Profile
    • นั่งสมาธิ สติปัฏฐานสี่ พาเที่ยววัด แนะนำวัด แจกcd ธรรมะฟรี
    • Email
Re: innodb database file ibdata1 and ib_logfile0 was corrupt [how to fix]
« Reply #6 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 ออกมาละครับผม
ขอจงอย่าล้มเลิก ยาก แปลว่าทำได้ สู้ๆ ครับ ^_^  8)

ทีมงาน R&D
กอล์ฟ [at] Packetlove[dot]com
« Last Edit: มิถุนายน 10, 2021, 08:25:42 PM by golfreeze »