Bagian pertama dari jawabannya adalah kabar baiknya... bahwa mysqlcheck -o
tidak lebih mungkin merusak database Anda daripada menjalankan OPTIMIZE TABLE
di setiap meja, karena hanya itu. Ini adalah utilitas praktis yang masuk ke server, mengambil daftar tabel, dan mengulanginya, mengirimkan OPTIMIZE TABLE
kueri ke server untuk satu tabel pada satu waktu, hingga selesai.
Sekarang, beberapa berita buruk. Jika Anda memiliki kerusakan laten di tablespace Anda, OPTIMIZE TABLE
mungkin mengalaminya, jadi Anda harus yakin bahwa Anda siap untuk kemungkinan itu, dengan cadangan dan rencana pemulihan. Peluangnya cukup kecil, tetapi adalah satu kemungkinan hasil.
Berita lebih buruk:hampir pasti menggonggong pohon yang salah.
Menjalankan Apache dan MySQL bersama-sama pada mesin yang sama dengan lalu lintas yang signifikan -- atau variasi lalu lintas yang signifikan -- bertentangan dengan praktik terbaik dan merupakan resep untuk masalah, karena kedua layanan cenderung meningkatkan konsumsi memori mereka di bawah beban, dan jika basis data adalah pendukung menyimpan data situs web, maka peningkatan beban cenderung terjadi pada kedua layanan secara bersamaan.
Lihat jawaban saya untuk InnoDB Crash Post Mortem di Database Administrators Stack Exchange dan Mengapa Apache Berjalan Liar dan Membunuh MySQL pada Kesalahan Server untuk cakupan menyeluruh dari masalah yang cukup umum ini, di mana MySQL adalah korbannya, lebih dari segalanya.
Perhatikan bahwa tidak masalah apakah Anda menggunakan InnoDB atau tidak. Entri pemulihan basis data di log kesalahan MySQL akan sedikit berbeda, tetapi hadiah utamanya adalah ini:didahului oleh tidak ada yang mencurigakan sama sekali, log kesalahan MySQL mengatakan:
mysqld_safe Number of processes running now: 0
Pesan-pesan berikut yang sering disalahartikan sebagai MySQL "crash," tapi bukan itu yang terjadi... Itu telah dibunuh. MySQL bahkan mungkin menolak untuk memulai ulang, sampai Apache tenang atau dimulai ulang, atau server di-boot ulang. Sekali lagi, dari log kesalahan, Anda mungkin atau mungkin tidak melihat sesuatu seperti ini:
InnoDB: Initializing buffer pool, size = 4.0G
InnoDB: mmap(4395630592 bytes) failed; errno 12
InnoDB: Completed initialization of buffer pool
InnoDB: Fatal error: cannot allocate memory for the buffer pool
[ERROR] Aborting
[Note] /usr/libexec/mysqld: Shutdown complete
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
Memeriksa /var/log/syslog
atau /var/log/messages
(tergantung distro mana yang Anda jalankan) akan menunjukkan masalah sebenarnya.
$ sudo egrep 'kernel|oom' /var/log/syslog
...atau pesan... akan mengungkapkan sejumlah entri yang dimulai seperti ini:
kernel: pcscd invoked oom-killer: gfp_mask=0xd0, order=0, oomkilladj=0
Apache menjadi sangat haus memori sehingga sistem berisiko mengalami ketidakstabilan secara keseluruhan, sehingga "sesuatu" dikorbankan. "Sesuatu" itu kemungkinan adalah daemon Server MySQL, mysqld
.
kernel: Out of memory: Killed process 3044, UID 27, (mysqld)
MySQL biasanya akan mencoba untuk me-restart sendiri, dan untuk semua yang Anda tahu, ini mungkin kadang-kadang terjadi juga... tetapi kecuali permintaan memori Apache turun dengan cepat, MySQL tidak akan diizinkan untuk meminta memori yang cukup dari sistem, dan akan menyerah.
Mengoptimalkan tabel memiliki aplikasi yang valid... tetapi, dalam kasus ini, jika saya telah mengidentifikasi masalah Anda dengan benar, itu akan sangat mirip dengan menata ulang kursi geladak di kapal yang tenggelam Titanic. Ini mungkin menghemat beberapa ruang disk, tetapi juga akan dikenakan biaya beberapa ruang disk cadangan saat berjalan karena beberapa mesin penyimpanan membuat salinan tabel yang sama sekali baru, kemudian mengganti nama salinan dan menghapus tabel lama. Bagaimanapun, itu tidak mungkin berdampak berarti pada konsumsi memori.