Golfreeze.packetlove.com: Life style of Golfreeze Canon400D Family kammtan.com Jazz Freebsd Unix Linux System Admin guitar Music
All about unix linux freebsd and FAQ for Packetlove.com Web hosting , Mail hosting , VoIP + IP PBX server => Trick เกี่ยวกับการแก้ปัญหา เกี่ยวกับ compiler gcc c++ c build make install => Topic started by: golfreeze 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 ครับผม ^^
-
อ.กอล์ฟ รบกวนสอบถาม database เป็น mysql แบบ innodb หากเราทำการลบไฟล์ ib_logfile0 กับ ib_logfile1 ใน Server
ทำให้ไม่สามารถเปิดตารางที่เป็น innodb ได้เลย จะมีวิธีการอย่างไรกู้คืนทำให้เปิดไฟล์ได้บ้างครับ ขอบคุณครับ
-
ลองปรับเป็น mode "innodb-force-recovery = 6"
ได้ปะครับผม
แล้วทำการ dump ข้อมูลออกมาก่อนแล้วก็ค่อย dump กลับไปอีกที
-
ขอบคุณงับ ^^
-
ถ้าท่านใดใช้งานเป็น myisam ลองดูตามนี้นะครับผม
http://golfreeze.packetlove.com/smileboard/index.php?topic=81.msg1390;topicseen#msg1390 (http://golfreeze.packetlove.com/smileboard/index.php?topic=81.msg1390;topicseen#msg1390)
-
==== 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
-
ในกรณีถ้า ไม่สามารถรัน 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