Mysql mogok dan tidak mau mulai

19

Server mysql produksi kami baru saja mogok dan tidak akan muncul kembali. Ini memberikan kesalahan segfault. Saya mencoba reboot, dan tidak tahu harus mencoba apa lagi. Inilah stacktrace:

140502 14:13:05 [Catatan] Plugin 'FEDERATED' dinonaktifkan.
InnoDB: Pemindaian log berkembang melewati pos pemeriksaan lsn 108 1057948207
140502 14:13:06 InnoDB: Database tidak dimatikan secara normal!
InnoDB: Mulai pemulihan kerusakan.
InnoDB: Membaca informasi tablespace dari file .ibd ...
InnoDB: Memulihkan kemungkinan halaman data setengah tertulis dari doublewrite
InnoDB: buffer ...
InnoDB: Melakukan pemulihan: dipindai hingga mencatat nomor urut 108 1058059648
InnoDB: 1 transaksi yang harus dibatalkan atau dibersihkan
InnoDB: total 15 operasi baris dibatalkan
InnoDB: Penghitung id trx adalah 0 562485504
140502 14:13:06 InnoDB: Memulai kumpulan catatan log yang berlaku ke database ...
InnoDB: Kemajuan dalam persen: 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 84 85 86 87 88 89 90 91 92 93 94 94 95 96 97 98 99 
InnoDB: Terapkan batch selesai
InnoDB: Mulai di latar belakang kemunduran transaksi tidak berkomitmen
140502 14:13:06 InnoDB: Rolling back trx dengan id 0 562485192, 15 baris untuk diurungkan
140502 14:13:06 InnoDB: Dimulai; nomor urut log 108 1058059648
140502 14:13:06 InnoDB: Kegagalan pernyataan di utas 1873206128 dalam file ../../../storage/innobase/fsp/fsp0fsp.c line 1593
InnoDB: Pernyataan gagal: terpecah belah> 0
InnoDB: Kami sengaja membuat jebakan memori.
InnoDB: Kirim laporan bug terperinci ke http://bugs.mysql.com.
InnoDB: Jika Anda mendapatkan kegagalan pernyataan berulang atau crash, bahkan
InnoDB: segera setelah startup mysqld, mungkin ada
InnoDB: korupsi di tablespace InnoDB. Silakan merujuk
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: tentang memaksa pemulihan.
140502 14:13:06 - mysqld mendapat sinyal 6;
Ini bisa jadi karena Anda menekan bug. Mungkin juga biner ini
atau salah satu perpustakaan yang ditautkan dengannya rusak, tidak dibangun dengan benar,
atau salah konfigurasi. Kesalahan ini juga bisa disebabkan oleh kerusakan perangkat keras.
Kami akan berusaha sebaik mungkin untuk mengorek beberapa info yang diharapkan akan membantu mendiagnosis
masalahnya, tapi karena kita sudah crash, pasti ada sesuatu yang salah
dan ini mungkin gagal.

key_buffer_size = 16777216
read_buffer_size = 131072
max_used_connections = 0
max_threads = 151
threads_connected = 0
Mungkin mysqld dapat digunakan hingga 
key_buffer_size + (read_buffer_size + sort_buffer_size) * max_threads = 345919 K
byte memori
Semoga tidak apa-apa; jika tidak, kurangi beberapa variabel dalam persamaan.

thd: 0x0
Mencoba backtrace. Anda dapat menggunakan informasi berikut untuk mengetahuinya
di mana mysqld meninggal. Jika Anda tidak melihat pesan setelah ini, ada sesuatu yang terjadi
sangat salah ...
stack_bottom = (nil) thread_stack 0x30000
140502 14:13:06 [Catatan] Penjadwal Acara: Memuat 0 acara
140502 14:13:06 [Note] / usr / sbin / mysqld: siap untuk koneksi.
Versi: '5.1.41-3ubuntu12.10' socket: '/var/run/mysqld/mysqld.sock' port: 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]
Halaman manual di http://dev.mysql.com/doc/mysql/en/crashing.html berisi
informasi yang seharusnya membantu Anda mengetahui apa yang menyebabkan crash.

Ada rekomendasi?

tilleryj
sumber
Hal pertama yang pertama; sudahkah seseorang mengubah konfigurasi MySQL? Lihat tanggal modifikasi terbaru untuk sekitar /etc/mysql/my.cnfitu.
Janne Pikkarainen
Tidak. Akhirnya harus menetapkan innodb_force_recovery = 3 untuk melakukan mysqldump, lalu menjatuhkan dan menyiapkan DB. Ini memperbaikinya.
tilleryj

Jawaban:

26

Aduh.

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.

Periksa halaman web yang disarankan: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html .

Pada dasarnya, cobalah untuk memulai server MySQL dalam mode pemulihan dan buat cadangan tabel macet Anda .

Edit /etc/my.cnfdan tambahkan:

 innodb_force_recovery = 1

... untuk melihat apakah Anda dapat masuk ke database Anda dan mendapatkan data Anda / temukan tabel yang rusak.

Biasanya, ketika ini terjadi itu adalah membangun kembali (setidaknya satu atau dua tabel rusak).

Dari http://chepri.com/mysql-innodb-corruption-and-recovery/ :

  1. Hentikan mysqld( service mysql stop).
  2. Cadangkan /var/lib/mysql/ib*
  3. Tambahkan baris berikut ke /etc/my.cnf:

    innodb_force_recovery = 1
    

    (mereka menyarankan 4, tetapi yang terbaik untuk memulai dengan 1 dan kenaikan jika tidak akan mulai)

  4. Mulai ulang mysqld( service mysql start).

  5. Buang semua tabel: mysqldump -A > dump.sql
  6. Jatuhkan semua basis data yang membutuhkan pemulihan.
  7. Hentikan mysqld( service mysql stop).
  8. Menghapus /var/lib/mysql/ib*
  9. Komentar innodb_force_recoverydalam/etc/my.cnf
  10. Mulai ulang mysqld. Lihatlah log kesalahan mysql. Secara default seharusnya /var/lib/mysql/server/hostname.com.erruntuk melihat cara membuat ib*file baru .
  11. Kembalikan database dari dump: mysql < dump.sql
Jonathan
sumber
Saya pertama kali mempertimbangkan bahwa Anda mungkin memiliki sistem file yang rusak atau disk yang buruk.
bombcar
1
coba semua nilai innodb_force_recovery hingga 6. Dan tambahkan innodb_purge_threads = 0 - terkadang utas utama tidak dapat memulai, Anda akan melihatnya di log kesalahan
akuzminsky
2
Saya tahu ini adalah utas lama, tetapi setiap elaborasi untuk menentukan basis data mana yang perlu dipulihkan?
nkanderson
@nicolekanderson Saya juga ingin klarifikasi tentang hal itu. Setelah saya menjalankan mysqldump, itu tidak menunjukkan kepada saya dengan cara apa pun bahwa salah satu database rusak.
Andrew Thaddeus Martin
titik 10 dalam jawaban - mencoba me-restart server database dan membaca log kesalahan, itu harus memberi nama tabel jatuh. mysqldump hanya memberi Anda salinan tabel, tidak ada yang lain.
Jonathan
2

Saya menghadapi kesalahan yang sama saat menggunakan mysql: 5.7 buruh pelabuhan gambar. Kesalahan utama adalah mencoba membuat root user yang ada secara default. Informasi lebih lanjut: https://github.com/docker-library/mysql/issues/129

Seperti yang diberikan dalam tautan di atas, solusinya adalah TIDAK mengatur MYSQL_USER dan MYSQL_PASSWORD dalam variabel lingkungan saat memulai gambar buruh pelabuhan.

rahuljain1311
sumber
1

Ini terjadi pada saya di Laravel Homestead (Vagrant setelah panik kernel yang menjalankan 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

Berikut adalah beberapa sumber yang dapat Anda coba, meskipun tidak ada opsi perbaikan yang berfungsi untuk saya :

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

Saya mencoba menambahkan pemulihan paksa ke konfigurasi mysql (mulai dari 1 dan semakin tinggi karena seharusnya angka yang lebih tinggi dapat menyebabkan korupsi permanen):

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

Di jendela lain, jalankan:

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

Kemudian coba mulai ulang mysqld dengan berbagai opsi yang diaktifkan:

sudo /etc/init.d/mysql restart

Jika waktu habis, Anda dapat memaksa memulai kembali proses mysql dengan:

# 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

Jika berhasil, log akan menampilkan sesuatu seperti:

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

Jika gagal, log akan menampilkan sesuatu seperti:

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


Ketika semakin buruk menjadi lebih buruk, saya mencoba menghapus database yang kemungkinan rusak:

sudo ls -alt /var/lib/mysql

Ternyata database yang saya kerjakan adalah yang paling baru-baru ini dimodifikasi di bagian atas daftar. Untungnya saya punya dump SQL untuk itu sejak hari itu sehingga dapat menghapusnya:

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

Saya meninggalkan semua file lainnya, dan mysql tetap dapat memulai.

UPDATE: pastikan untuk menonaktifkan innodb_force_recovery = 1sekali mysql bekerja lagi, jika tidak, Anda akan mendapatkan kesalahan ketika Anda mencoba untuk memodifikasi database dan tabel.

Kemudian saya membuat ulang database dengan Sequel Pro, mengimpor kembali data saya dan dapat melanjutkan tanpa harus membuang semua database dari proyek saya yang lain.

Ke depan, saya harus berasumsi bahwa basis data mysql apa pun dapat rusak dan berusaha menyimpan cadangan harian dan membuat naskah rekreasi basis data didokumentasikan atau dikodekan ke dalam alat integrasi berkelanjutan saya.

Zack Morris
sumber