Saya punya satu tabel MySQL menggunakan mesin penyimpanan InnoDB; ini berisi sekitar 2M baris data. Ketika saya menghapus baris data dari tabel, itu tidak merilis ruang disk yang dialokasikan. Ukuran file ibdata1 juga tidak berkurang setelah menjalankan optimize table
perintah.
Apakah ada cara untuk mendapatkan kembali ruang disk dari MySQL?
Saya dalam situasi yang buruk; aplikasi ini berjalan di sekitar 50 lokasi yang berbeda dan sekarang masalah ruang disk yang rendah muncul di hampir semuanya.
mysql
innodb
delete-row
Sumit Deo
sumber
sumber
innodb_file_per_table
dimatikan. Kabar baiknya adalah bahwa opsi inion
secara default di versi terbaru MySQL.Jawaban:
MySQL tidak mengurangi ukuran ibdata1. Pernah. Bahkan jika Anda menggunakan
optimize table
untuk membebaskan ruang yang digunakan dari catatan yang dihapus, itu akan digunakan kembali nanti.Alternatifnya adalah mengkonfigurasi server yang akan digunakan
innodb_file_per_table
, tetapi ini akan membutuhkan cadangan, letakkan basis data, dan pulihkan. Sisi positifnya adalah bahwa file .ibd untuk tabel berkurang setelahoptimize table
.sumber
ALTER TABLE t ENGINE=INNODB
di tabel yang ada. " Ini menyiratkan bahwa Anda dapat mengaktifkan fitur ini, "mengubah" tabel yang ada untuk menggunakan file InnoDB terpisah dengan perintah ALTER TABLE, kemudian MENGOPTIMASI tabel untuk memperkecil ukurannya. Namun, begitu Anda selesai, Anda harus mencari cara untuk menghapus file InnoDB sumber (besar) ...Baru saja mengalami masalah yang sama.
Apa yang terjadi adalah, bahwa bahkan jika Anda menjatuhkan basis data, innodb masih tidak akan merilis ruang disk. Saya harus mengekspor, menghentikan mysql, menghapus file secara manual, memulai mysql, membuat database dan pengguna, dan kemudian mengimpor. Terima kasih Tuhan, aku hanya punya 200MB baris, tapi itu menyelamatkan 250GB file innodb.
Gagal karena desain.
sumber
Jika Anda tidak menggunakan innodb_file_per_table , reklamasi ruang disk adalah mungkin, tetapi cukup membosankan, dan membutuhkan banyak waktu henti.
The Cara ini cukup mendalam - tapi saya disisipkan bagian yang relevan di bawah ini.
Pastikan juga menyimpan salinan skema Anda di tempat sampah Anda.
sumber
Sepuluh tahun kemudian dan saya memiliki masalah yang sama. Saya memecahkannya dengan cara berikut:
Itu semuanya :)
sumber
Cara lain untuk memecahkan masalah reklamasi ruang adalah, Buat beberapa partisi dalam tabel - Rentang berbasis, partisi berbasis Nilai dan cukup jatuhkan / potong partisi untuk merebut kembali ruang, yang akan melepaskan ruang yang digunakan oleh seluruh data yang disimpan dalam partisi tertentu.
Akan ada beberapa perubahan yang diperlukan dalam skema tabel ketika Anda memperkenalkan partisi untuk tabel Anda seperti - Tombol Unik, Indeks untuk memasukkan kolom partisi dll.
sumber
Tahun lalu saya juga menghadapi masalah yang sama pada versi mysql5.7 dan ibdata1 menempati 150 Gb. jadi saya menambahkan batalkan tablespace
Ambil cadangan Mysqldump
Hentikan layanan mysql
Hapus semua data dari dir data
Tambahkan di bawah ini batalkan parameter tablespace di my.cnf saat ini
Mulai layanan mysql
menyimpan cadangan mysqldump
Masalah terpecahkan !!
sumber
Ada beberapa cara untuk mendapatkan kembali diskspace setelah menghapus data dari tabel untuk mesin MySQL Inodb
Jika Anda tidak menggunakan innodb_file_per_table dari awal, membuang semua data, menghapus semua file, membuat ulang basis data dan mengimpor data lagi adalah satu-satunya cara (periksa jawaban dari FlipMcF di atas)
Jika Anda menggunakan innodb_file_per_table, Anda dapat mencoba
sumber