Menghapus tabel MySQL dengan transaksi yang tertunda

10

Apakah ada cara untuk menghapus tabel atau database InnoDB dengan transaksi yang tertunda di MySQL (lebih disukai pada level sistem file)?

Apa yang terjadi:

Saya menggunakan MySQL 5.5.28 dan berlari LOAD DATA INFILE…untuk mengimpor kumpulan data besar (300M baris) ke tabel InnoDB. Saya tidak menggunakan set autocommit = 0;sebelumnya. Sayangnya, mysqlddihentikan tepat di tengah impor.

Ketika saya memulai kembali mysql, itu mencoba untuk memutar kembali transaksi mengisi log sistem dengan pesan-pesan seperti ini:

mysqld_safe [4433]: 121212 16:58:52 InnoDB: Menunggu 1 transaksi aktif selesai

Masalahnya adalah bahwa roll kembali berjalan lebih dari 25 jam sekarang selama yang mysqldtidak menerima koneksi soket.

Saya tidak bisa hanya menghapus /var/lib/mysql/*dan mulai dari awal karena ada beberapa database / tabel InnoDB lain pada mesin ini juga. Namun, tabel bermasalah adalah satu-satunya tabel dalam database terpisah. Menghapus seluruh tabel atau seluruh database tidak menjadi masalah karena saya dapat mengimpor kembali semua data sesudahnya.

dasup
sumber

Jawaban:

8

Tidak ada yang benar-benar dapat Anda lakukan karena kemunduran sedang dilakukan melalui tablespace UNDO di dalam ibdata1 , yang seharusnya tumbuh dengan sangat pesat.

Jika Anda mematikan proses mysqld dan me-restart mysql, itu hanya akan mengambil di mana ia tinggalkan sebagai bagian dari siklus pemulihan kecelakaan.

DISCLAIMER: Tidak Bertanggung jawab atas Kehilangan Data

Apa yang bisa Anda lakukan dapat mengakibatkan hilangnya data untuk tabel lainnya, tetapi ada sesuatu yang dapat Anda lakukan untuk menghindari siklus pemulihan kecelakaan InnoDB yang normal.

Ada opsi startup yang disebut innodb_force_recovery , yang memungkinkan Anda untuk melewati berbagai tahapan pemulihan crash InnoDB.

Menurut Dokumentasi MySQL tentang Memaksa InnoDB Recovery , berikut adalah pengaturan dan efeknya:

1 (SRV_FORCE_IGNORE_CORRUPT)

Biarkan server berjalan meskipun mendeteksi halaman yang rusak. Cobalah untuk membuat SELECT * FROM tbl_name melompati catatan indeks dan halaman yang korup, yang membantu dalam membuang tabel.

2 (SRV_FORCE_NO_BACKGROUND)

Cegah agar utas induk tidak berjalan. Jika crash akan terjadi selama operasi pembersihan, nilai pemulihan ini mencegahnya.

3 (SRV_FORCE_NO_TRX_UNDO)

Jangan menjalankan pengembalian transaksi setelah pemulihan macet.

4 (SRV_FORCE_NO_IBUF_MERGE)

Cegah operasi penyatuan penyisipan penyisipan. Jika mereka akan menyebabkan crash, jangan lakukan itu. Jangan hitung statistik tabel.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

Jangan melihat batalkan log ketika memulai basis data: InnoDB memperlakukan bahkan transaksi yang tidak lengkap sebagai komitmen.

6 (SRV_FORCE_NO_LOG_REDO)

Jangan lakukan redo log roll-forward sehubungan dengan pemulihan.

Dengan perubahan transaksional yang terkubur dalam log UNDO dan REDO, Anda menanggung risiko

  • kehilangan data yang dimaksudkan untuk ditulis
  • menyimpan data yang dimaksudkan untuk dihapus

Jika Anda mengharapkan efek samping yang buruk, cadangkan seluruh / var / lib / mysql dan letakkan di suatu tempat jika Anda ingin menyalin ibdata1, ib_logfile0, dan ib_logfile1 dan coba kembali pemulihan normal.

Jika mysql sepenuhnya di salah satu mode

  • mysqldump semua data kecuali tabel yang menyinggung
  • shutdown mysql
  • hapus semua yang ada di / var / lib / mysql kecuali / var / lib / mysql / mysql
  • mulai mysql
  • memuat ulang mysqldump

CAVEAT: Pastikan Anda membuat cadangan semuanya !!!

Saya harap ini membantu !!!

RolandoMySQLDBA
sumber
1

Saya memiliki situasi yang sama minggu ini.

Dan setelah empat iterasi mengembalikan cadangan penuh ke server uji dan mencoba untuk menjatuhkan, menghapus, atau membunuh tabel dengan transaksi raksasa yang tertunda, kami akhirnya sampai pada Jumat sore dan memutuskan untuk membiarkannya berjalan. Selama tiga hari, transaksi selesai dengan beban server yang dapat diabaikan dan database baik-baik saja. Yang jauh lebih baik daripada operasi manual pada file .frm dan tabel mysql yang telah mencoba dan gagal.

Solusi saya: Jangan hapus itu . Biarkan transaksi yang tertunda selesai, bahkan jika Anda harus menunda operasi lain selama beberapa hari, atau menemukan beberapa ruang disk di suatu tempat, atau biarkan server slave Anda mengambil beban.

andrew lorien
sumber