Mysql ล้มเหลวและจะไม่เริ่มทำงาน


19

เซิร์ฟเวอร์ mysql ที่ใช้ในการผลิตของเราเพิ่งพังและจะไม่กลับมาทำงานอีก มันให้ข้อผิดพลาด segfault ฉันลองรีบูตเครื่องแล้วก็ไม่รู้ว่าจะลองอะไรอีก นี่คือ stacktrace:

140502 14:13:05 [หมายเหตุ] ปลั๊กอิน 'FEDERATED' ถูกปิดใช้งาน
InnoDB: การสแกนเข้าสู่ระบบดำเนินการผ่านจุดตรวจสอบ 108 1057948207
140502 14:13:06 InnoDB: ฐานข้อมูลไม่ได้ปิดตัวลงตามปกติ!
InnoDB: เริ่มการกู้คืนความผิดพลาด
InnoDB: กำลังอ่านข้อมูลพื้นที่ตารางจากไฟล์. ibd ...
InnoDB: การกู้คืนหน้าข้อมูลครึ่งเขียนที่เป็นไปได้จาก doublewrite
InnoDB: บัฟเฟอร์ ...
InnoDB: ทำการกู้คืน: สแกนเพื่อบันทึกหมายเลขลำดับ 108 1058059648
InnoDB: 1 ธุรกรรมที่ต้องย้อนกลับหรือลบล้าง
InnoDB: ยกเลิกการดำเนินการทั้งหมด 15 แถว
InnoDB: ตัวนับ Trx id คือ 0 562485504
140502 14:13:06 InnoDB: การเริ่มใช้ชุดระเบียนบันทึกกับฐานข้อมูล ...
InnoDB: ความก้าวหน้าเป็นร้อยละ: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 84 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
InnoDB: สมัครแบทช์เสร็จ
InnoDB: เริ่มต้นในพื้นหลังการย้อนกลับของการทำธุรกรรมที่ปราศจากข้อผูกมัด
140502 14:13:06 InnoDB: ย้อนกลับ trx ด้วยรหัส 0 562485192, 15 แถวเพื่อยกเลิก
140502 14:13:06 InnoDB: เริ่มแล้ว หมายเลขลำดับการบันทึก 108 1058059648
140502 14:13:06 InnoDB: ความล้มเหลวในการยืนยันในเธรด 1873206128 ในไฟล์ ../../../storage/innobase/fsp/fsp0fsp.c line 1593
InnoDB: การยืนยันล้มเหลว: frag_n_used> 0
InnoDB: เราตั้งใจสร้างกับดักหน่วยความจำ
InnoDB: ส่งรายงานข้อผิดพลาดแบบละเอียดไปที่ http://bugs.mysql.com
InnoDB: หากคุณได้รับความล้มเหลวในการยืนยันหรือล่มซ้ำ ๆ
InnoDB: ทันทีหลังจากการเริ่มต้น mysqld อาจจะมี
InnoDB: ความเสียหายในตาราง InnoDB โปรดอ้างอิงถึง
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: เกี่ยวกับการบังคับให้มีการกู้คืน
140502 14:13:06 - mysqld มีสัญญาณ 6
อาจเป็นเพราะคุณกดจุดบกพร่อง เป็นไปได้ว่าไบนารีนี้
หรือหนึ่งในห้องสมุดที่เชื่อมโยงกับเสียหายสร้างไม่ถูกต้อง
หรือกำหนดค่าผิดพลาด ข้อผิดพลาดนี้อาจเกิดจากฮาร์ดแวร์ชำรุด
เราจะพยายามอย่างดีที่สุดเพื่อขูดข้อมูลบางส่วนที่หวังว่าจะช่วยในการวินิจฉัย
ปัญหา แต่เนื่องจากเราได้ขัดข้องแล้วบางสิ่งผิดปกติอย่างแน่นอน
และสิ่งนี้อาจล้มเหลว

key_buffer_size = 16777216
read_buffer_size = 131072
max_used_connections = 0
max_threads = 151
threads_connected = 0
เป็นไปได้ที่ mysqld สามารถใช้งานได้ถึง 
key_buffer_size + (read_buffer_size + sort_buffer_size) * max_threads = 345919 K
หน่วยความจำไบต์
หวังว่าจะโอเค ถ้าไม่ลดตัวแปรบางตัวในสมการ

thd: 0x0
พยายาม backtrace คุณสามารถใช้ข้อมูลต่อไปนี้เพื่อค้นหา
ที่ mysqld เสียชีวิต หากคุณไม่เห็นข้อความใด ๆ เลย
ผิดมหันต์ ...
stack_bottom = (ไม่มี) thread_stack 0x30000
140502 14:13:06 [หมายเหตุ] ตัวกำหนดตารางเหตุการณ์: โหลด 0 กิจกรรม
140502 14:13:06 [หมายเหตุ] / usr / sbin / mysqld: พร้อมสำหรับการเชื่อมต่อ
รุ่น: ซ็อกเก็ต '5.1.41-3ubuntu12.10': พอร์ต '/var/run/mysqld/mysqld.sock': 3306 (Ubuntu)
/ usr / sbin / mysqld (my_print_stacktrace + 0x2d) [0xb7579cbd]
/ usr / sbin / mysqld (handle_segfault + 0x494) [0xb7245854]
[0xb6fc0400]
/lib/tls/i686/cmov/libc.so.6(abort+0x182) [0xb6cc5a82]
/ usr / sbin / mysqld (+ 0x4867e9) [0xb74647e9]
/ usr / sbin / mysqld (btr_page_free_low + 0x122) [0xb74f1622]
/ usr / sbin / mysqld (btr_compress + 0x684) [0xb74f4ca4]
/ usr / sbin / mysqld (btr_cur_compress_if_useful + 0xe7) [0xb74284e7]
/ usr / sbin / mysqld (btr_cur_pessimistic_delete + 0x332) [0xb7429e72]
/ usr / sbin / mysqld (btr_node_ptr_delete + 0x82) [0xb74f4012]
/ usr / sbin / mysqld (btr_discard_page + 0x175) [0xb74f41e5]
/ usr / sbin / mysqld (btr_cur_pessimistic_delete + 0x3e8) [0xb7429f28]
/ usr / sbin / mysqld (+ 0x526197) [0xb7504197]
/ usr / sbin / mysqld (row_undo_ins + 0x1b1) [0xb7504771]
/ usr / sbin / mysqld (row_undo_step + 0x25f) [0xb74c210f]
/ usr / sbin / mysqld (que_run_threads + 0x58a) [0xb74a31da]
/ usr / sbin / mysqld (trx_rollback_or_clean_all_without_sess + 0x3e3) [0xb74ded43]
/lib/tls/i686/cmov/libpthread.so.0(+0x596e) [0xb6f9f96e]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e) [0xb6d65a4e]
หน้าคู่มือที่ http://dev.mysql.com/doc/mysql/th/crashing.html มี
ข้อมูลที่จะช่วยคุณค้นหาสิ่งที่ทำให้เกิดความผิดพลาด

คำแนะนำใด ๆ


สิ่งแรกแรก; มีคนเปลี่ยนการตั้งค่า MySQL อย่างใด? ดูวันที่แก้ไขล่าสุดสำหรับ/etc/mysql/my.cnfหรือดังนั้น
Janne Pikkarainen

ไม่ได้สิ้นสุดต้องตั้ง innodb_force_recovery = 3 เพื่อทำ mysqldump จากนั้นทำดร็อปและอ่าน DB สิ่งนี้แก้ไขได้
tilleryj

คำตอบ:


26

อุ๊ยตาย

InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: about forcing recovery.

ตรวจสอบหน้าเว็บแนะนำ: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html

โดยทั่วไปพยายามที่จะเริ่มต้นเซิร์ฟเวอร์ MySQL ในโหมดการกู้คืนและสำรองข้อมูลของตารางการตรวจค้นของคุณ

แก้ไข/etc/my.cnfและเพิ่ม:

 innodb_force_recovery = 1

... เพื่อดูว่าคุณสามารถเข้าสู่ฐานข้อมูลและรับข้อมูลของคุณ / ค้นหาตารางที่เสียหายหรือไม่

โดยปกติเมื่อเกิดเหตุการณ์นี้มันจะสร้างขึ้นใหม่ (อย่างน้อยของตารางที่เสียหายหรือสอง)

จากhttp://chepri.com/mysql-innodb-corruption-and-recovery/ :

  1. หยุดmysqld( service mysql stop)
  2. การสำรองข้อมูล /var/lib/mysql/ib*
  3. เพิ่มบรรทัดต่อไปนี้ลงใน/etc/my.cnf:

    innodb_force_recovery = 1
    

    (พวกเขาแนะนำ 4 แต่วิธีที่ดีที่สุดคือเริ่มต้นด้วย 1 และเพิ่มขึ้นหากไม่เริ่มต้น)

  4. รีสตาร์ทmysqld( service mysql start)

  5. ดัมพ์ตารางทั้งหมด: mysqldump -A > dump.sql
  6. วางฐานข้อมูลทั้งหมดที่ต้องการการกู้คืน
  7. หยุดmysqld( service mysql stop)
  8. ลบ /var/lib/mysql/ib*
  9. แสดงความคิดเห็นinnodb_force_recoveryใน/etc/my.cnf
  10. mysqldเริ่มต้นใหม่ ดูบันทึกข้อผิดพลาด mysql โดยค่าเริ่มต้นควร/var/lib/mysql/server/hostname.com.errดูว่าจะสร้างib*ไฟล์ใหม่ได้อย่างไร
  11. กู้คืนฐานข้อมูลจากดัมพ์: mysql < dump.sql

ฉันก่อนพิจารณาว่าคุณอาจมีความเสียหายของระบบไฟล์หรือดิสก์ที่ไม่ดี
Bombcar

1
ลองใช้ค่า Innodb_force_recovery ทั้งหมดถึง 6 และเพิ่ม innodb_purge_threads = 0 - บางครั้งเธรดหลักไม่สามารถเริ่มต้นได้คุณจะเห็นค่าในบันทึกข้อผิดพลาด
akuzminsky

2
ฉันรู้ว่านี่เป็นเธรดเก่า แต่มีรายละเอียดเกี่ยวกับการกำหนดฐานข้อมูลที่ต้องการกู้คืนหรือไม่
nkanderson

@nicolekanderson ฉันต้องการชี้แจงบางอย่างในจุดนั้น หลังจากที่ฉันเรียกใช้ mysqldump มันไม่ได้บ่งบอกว่าในทางใดทางหนึ่งว่าฐานข้อมูลใด ๆ เสียหาย
Andrew Thaddeus Martin

จุดที่ 10 ในคำตอบ - ลองรีสตาร์ทเซิร์ฟเวอร์ฐานข้อมูลและอ่านบันทึกข้อผิดพลาดควรให้ชื่อของตารางที่ล้มเหลว mysqldump ให้สำเนาของตารางเท่านั้น
Jonathan

2

ฉันพบข้อผิดพลาดเดียวกันนี้ในขณะที่ใช้อิมเมจ mysql: 5.7 ข้อผิดพลาดหลักคือพยายามสร้างผู้ใช้รูทซึ่งมีอยู่ตามค่าเริ่มต้น ข้อมูลเพิ่มเติม: https://github.com/docker-library/mysql/issues/129

ตามที่ระบุในลิงก์ด้านบนวิธีแก้ปัญหาคือไม่ตั้ง MYSQL_USER และ MYSQL_PASSWORD ในตัวแปรสภาพแวดล้อมในขณะที่เริ่มอิมเมจนักเทียบท่า


1

สิ่งนี้เกิดขึ้นกับฉันใน Laravel Homestead (คนจรจัดหลังจากเคอร์เนลตื่นตระหนกที่ใช้ Mac OS Sierra 10.12.4 (16E195):

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:    14.04
Codename:   trusty

$ mysql -V
mysql  Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using  EditLine 
wrapper

นี่คือแหล่งข้อมูลบางส่วนที่คุณสามารถลองได้แม้ว่าจะไม่มีตัวเลือกการซ่อมให้ฉัน :

https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html

https://forums.mysql.com/read.php?22,603093,604631#msg-604631

https://support.plesk.com/hc/en-us/articles/213939865-How-to-fix-InnoDB-corruption-cases-for-the-MySQL-database

ฉันพยายามเพิ่มกำลังการกู้คืนเพื่อกำหนดค่า mysql (เริ่มต้นที่ 1 และสูงขึ้นไปเรื่อย ๆ เนื่องจากตัวเลขที่สูงกว่าคาดว่าอาจทำให้เกิดความเสียหายถาวร):

sudo nano /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1
#innodb-read-only=1
#innodb_purge_threads=0
#key_buffer_size=16M
#event-scheduler=disabled

ในหน้าต่างอื่นให้เรียกใช้:

tail -f /var/log/mysql/error.log

จากนั้นลองรีสตาร์ท mysqld โดยเปิดใช้งานตัวเลือกต่างๆ:

sudo /etc/init.d/mysql restart

หากหมดเวลาคุณสามารถบังคับให้รีสตาร์ทกระบวนการ mysql ด้วย:

# process id is first column with number, just ignore lines with grep because they list the process running 'grep mysql'
ps aux | grep mysql
sudo kill -9 <process-id>
sudo /etc/init.d/mysql restart

หากใช้งานได้บันทึกจะแสดงรายการดังนี้:

Version: '5.7.9' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

ถ้ามันล้มเหลวบันทึกจะแสดงสิ่งที่ชอบ:

InnoDB: Assertion failure in thread 140049488692992 in file log0recv.cc line 1420


เมื่อแย่ลงมาแย่ลงฉันพยายามลบฐานข้อมูลที่น่าจะเสียหาย:

sudo ls -alt /var/lib/mysql

ปรากฎว่าฐานข้อมูลที่ฉันทำงานอยู่นั้นเป็นฐานข้อมูลที่ถูกแก้ไขล่าสุดที่ด้านบนสุดของรายการ โชคดีที่ฉันมี SQL dump สำหรับมันตั้งแต่วันนั้นดังนั้นสามารถลบได้:

sudo rm -rf /var/lib/mysql/<database_name>

ฉันออกจากไฟล์อื่นทั้งหมดและ mysql ก็สามารถเริ่มต้นได้

อัปเดต: โปรดปิดใช้งานinnodb_force_recovery = 1เมื่อ mysql ทำงานอีกครั้งมิฉะนั้นคุณจะได้รับข้อผิดพลาดเมื่อคุณพยายามแก้ไขฐานข้อมูลและตาราง

จากนั้นฉันสร้างฐานข้อมูลใหม่ด้วย Sequel Pro นำเข้าข้อมูลของฉันอีกครั้งและสามารถดำเนินการต่อได้โดยไม่ต้องทิ้งฐานข้อมูลทั้งหมดจากโครงการอื่นของฉัน

ต่อไปฉันต้องสมมติว่าฐานข้อมูล mysql ใด ๆ สามารถเสียหายและพยายามเก็บข้อมูลสำรองรายวันและมีสคริปต์สันทนาการของฐานข้อมูลที่บันทึกไว้หรือเขียนลงในเครื่องมือการรวมอย่างต่อเนื่องของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.