Apa file ibdata1 dalam direktori / var / lib / mysql saya?

32

Masuk ke panel kontrol Webmin saya, saya perhatikan bahwa hampir semua ruang disk saya penuh. Saya mencari sepuluh file / direktori terbesar di sistem saya dan menemukan bahwa file bernama ibdata1 menghabiskan sekitar 94GB ruang. Itu berada di direktori / var / lib / mysql saya.

Apa yang dilakukan ibdata1? Apakah saya aman untuk menghapusnya? Asumsi saya adalah semacam dump, tapi itu hanya tebakan liar.

James
sumber

Jawaban:

38

File ibdata1adalah tablespace sistem untuk infrastruktur InnoDB.

Ini berisi beberapa kelas untuk informasi penting untuk InnoDB

  • Halaman Data Tabel
  • Halaman Indeks Tabel
  • Kamus data
  • Data Kontrol MVCC
    • Batalkan Spasi
    • Segmen kembalikan
  • Buffer Tulis Ganda (Halaman Ditulis di Latar Belakang untuk menghindari caching OS)
  • Masukkan Buffer (Perubahan ke Indeks Sekunder)

Harap perhatikan tempat ibdata1 di InnoDB Universe (di Sisi Kanan)

Arsitektur InnoDB

Anda dapat memisahkan Halaman Data dan Indeks ibdata1dengan mengaktifkan innodb_file_per_table . Ini akan menyebabkan tabel InnoDB yang baru dibuat untuk menyimpan data dan mengindeks halaman dalam .ibdfile eksternal .

Contoh

  • datadir adalah / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;, menciptakan /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table diaktifkan, Halaman Data / Indeks Disimpan /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table dinonaktifkan, Halaman Data / Indeks Disimpan di ibdata1

Tidak masalah di mana tabel InnoDB disimpan, fungsionalitas InnoDB membutuhkan mencari metadata tabel dan menyimpan dan mengambil info MVCC untuk mendukung kepatuhan ACID dan Isolasi Transaksi .

Berikut ini adalah artikel saya sebelumnya tentang memisahkan data tabel dan indeks dari ibdata1

APA YANG HARUS DILAKUKAN BERIKUTNYA

Anda dapat terus memiliki ibdata1 menyimpan semuanya, tetapi itu membuat snapshot LVM benar-benar membosankan (pendapat pribadi saya).

Anda perlu menggunakan pos StackOverflow saya dan mengecilkan file itu secara permanen.

Silakan jalankan kueri ini:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Ini akan memberi tahu seberapa banyak ruang terbuang yang dapat direklamasi setelah menerapkan Pembersihan InnoDB.

RolandoMySQLDBA
sumber
Terima kasih atas masukan Anda. Kuota disk saya telah terisi penuh - sebelum saya menindaklanjuti saran dalam posting Anda, apakah saya perlu ruang kosong? Saya perhatikan bahwa posting asli Anda pada SO menyebutkan tentang melakukan dump SQL, tapi ini mungkin akan membuat file ~ 90GB dengan tempat untuk pergi.
James
mysqldump hanya akan representasi logis dari halaman data, bukan indeks. Anda akan memerlukan disk mount lain, mungkin server jauh, untuk membuang data.
RolandoMySQLDBA
9
Ia mengembalikan 91.25350952148438 untuk saya sebagai SpaceToReclaim. Apakah ini dalam megabita? persen? byte?
Isaac
Saya tahu ini terlalu tua. Tetapi bagi siapa pun yang datang ke sini dengan masalah ini, Anda perlu mengganti nomor 94dengan ukuran ibdata1file apa pun dalam GB dan SpaceToReclaimakan memberi Anda ukuran dalam GB.
anupsabraham
8

File itu ibdata1, tidak ibdataldan itu berisi semua database InnoDB Anda. Jika Anda menghapusnya, Anda kehilangan semua data Anda.

Untuk beberapa ide tentang cara mengatasinya, lihat Cara mengecilkan / membersihkan file ibdata1 di MySQL .

Michael Hampton
sumber
2

Jika Anda menggunakan innodb sebagai mesin MySQL secara default akan menyimpan semua database Anda ke ibdata1. Juga ada file log ib_logfile0 dan ib_logfile1. Jangan hapus file-file itu.

silviud
sumber
Apa yang menghapus file itu di server saya?
Frank