Seberapa besar terlalu besar untuk file ibdata?

9

File ibdata saya sangat besar, setidaknya bagi saya sepertinya sangat besar. Apakah ini berlebihan atau tidak seburuk itu?

-rw-rw---- 1 mysql mysql  15G Apr 18 10:11 ibdata1
nachito
sumber
4
File ibdata Anda sangat kecil.
Jeff Ferland
Apakah membelah file itu menjadi potongan yang lebih kecil (katakanlah 4G) lebih baik atau lebih buruk untuk kinerja?
nachito

Jawaban:

13

Saat ini bisa menjadi masalah

Jika Anda menjalankan show table statusdi atas meja dan Data_freebidang itu merupakan sebagian besar ibdata1ukuran file Anda , maka Anda mungkin memiliki banyak ruang kosong. Banyak memasukkan / menghapus akan membuat masalah. Jika itu adalah kasus dan penyisipan sementara dan penghapusan membuat sebagian besar data Anda, maka Anda memiliki kasus yang baik untuk file per tabel.

Tapi itu bukan "ya" otomatis. Ada banyak pembicaraan di dunia tentang fragmentasi internal di dalam file InnoDB, tetapi menempatkannya ke dalam sistem file sebagai file per tabel hanya memindahkan fragmentasi Anda ke tingkat sistem file, bukan ke tingkat basis data.

Mengapa ini biasanya tidak menjadi masalah

Pikirkan file InnoDB Anda sebagai sistem file daripada file. Jika Anda memiliki banyak file, Anda membutuhkan sistem file yang besar.

Untuk sebagian besar, filesystem melakukannya dengan sangat baik dalam meningkatkan skala untuk menangani terabyte data dan jumlah file yang tak terhitung. Kadang-kadang mereka mengalami masalah dengan pengindeksan yang buruk (misalnya, batasan jumlah file dalam direktori sebelum dampak kinerja), tetapi sebagian besar sistem file modern dapat berjalan dengan baik ke kisaran terabyte.

InnoDB berfungsi dengan cara yang sama. Ukuran file data Anda bisa sangat besar ... dan seperti filesystem besar, yang dapat menyajikan masalah dengan membuat cadangan data Anda. Namun, sama seperti membelah sistem file Anda menjadi beberapa partisi tidak membantu dengan masalah ini, juga tidak mencoba memanipulasi innodb. Meskipun Anda dapat menggunakan innodb_file_per_table , saya jarang merekomendasikannya.

Sama seperti sistem file Anda, jawaban yang lebih baik adalah mengetahui batasan secara internal dan bekerja di dalamnya. Memahami indeks dan menerapkannya dengan tepat. Jangan berusaha memisahkan InnoDB, itu tidak dimaksudkan untuk itu.

Karena saya berjuang untuk menyampaikan konsep secara konstruktif, inilah bacaan cepat bahwa kata-kata ini lebih baik daripada yang saya bisa: Terabytes bukan data besar, petabytes adalah .

Saya ingat slide pemasaran MySQL yang benar-benar sangat tua di mana pelanggan menjalankan data warehouse dengan beberapa terabyte. Bertahun-tahun yang lalu. InnoDB atau MyISAM, keduanya akan berfungsi. Ini merupakan standar dari hal-hal MySQL.

Jangan keringat basis data 15GB.

Jeff Ferland
sumber
Sepertinya saya hanya di bawah 50% dimanfaatkan. InnoDB free: 7364608 kB
nachito
@nachito Kedengarannya seperti itu seharusnya baik-baik saja. Jika Anda merasa perlu ruang kembali untuk sistem file, ambil kembali. Jika Anda hanya khawatir tentang kinerja, jangan. Selain itu, untuk kinerja, yang terbaik adalah menyimpan file database Anda di partisi mereka sendiri, jadi jika Anda berfokus pada kinerja, Anda tetap tidak akan melihat pengembalian yang dapat digunakan.
Jeff Ferland
6

file ibdata tidak menyusut - jika Anda baru saja menjatuhkan beberapa tabel atau menghapus banyak baris - innodb di konfigurasi Anda tidak akan melepaskan ruang kosong kembali ke sistem file. saya akan menyarankan Anda:

  • Cadangkan semua data Anda misalnya dengan mysqldump
  • tambahkan ke direktif innodb_file_per_table my.cnf
  • restart mysql
  • jatuhkan semua database menggunakan mesin innodb
  • hentikan mysql
  • hapus file ibdata
  • rm ib_logfile [01]
  • mulai mysql, periksa syslog jika semuanya baik-baik saja
  • muat ulang dump Anda

dengan cara ini Anda akan dapat memperoleh kembali ruang setiap kali Anda menjatuhkan tabel / database innodb - file idb terkait akan segera dihapus.

pQd
sumber
Saya mengerti itu tidak akan pernah menyusut tanpa membuang dan memuat ulang tabel. Namun, jika saya telah menjatuhkan basis data InnoDB, apakah akan menggunakan ruang "bebas" itu sebelum mulai tumbuh lagi?
nachito
1
@nachito Ya, itu akan.
Jeff Ferland
Jawaban Anda hanyalah saran langsung tanpa mengaburkan masalah seperti jawaban saya tampaknya telah dilakukan. +1 !!!
RolandoMySQLDBA
1
Yah, jawabannya adalah solusi untuk mengurangi ruang yang digunakan oleh file data, tapi itu bukan diskusi tentang manfaat yang terkait dengan itu, dan itulah pertanyaannya saat saya membacanya. Apakah file ibdata 15GB adalah masalah besar?
Jeff Ferland