Anda harus menggunakan innodb_file_per_table dan Anda perlu melakukan beberapa cara pembersihan dengan infrastruktur InnoDB saat ini.
Saya telah melihat banyak klien hosting DB yang mengatur MySQL dan membiarkan InnoDB dalam keadaan default. Ini menyebabkan tablespace sistem (lebih dikenal sebagai ibdata1) tumbuh liar.
Bahkan jika Anda beralih ke innodb_file_per_table, file .ibd harus diekstraksi dari ibdata1 dan ibdata tidak akan pernah menyusut. Misalnya, jika Anda memiliki tabel bernama mydb.mytable yang ada di dalam ibdata1 yang menghabiskan 2GB, untuk mengekstraknya Anda harus melakukan hal berikut:
LANGKAH 01) Tambahkan ini ke /etc/my.cnf
[mysqld]
innodb_file_per_table
LANGKAH 02) service mysql restart
LANGKAH 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;
Itu akan membuat file /var/lib/mysql/mydb/mytable.ibd
Sayangnya, 2GB ruang yang ditempati oleh tabel sebelum perubahan tidak dapat direklamasi. Saya menulis posting sebelumnya tentang bagaimana dan mengapa membersihkan infrastruktur InnoDB:
Setelah Anda melakukan perubahan besar ini, jangan lupa untuk meningkatkan innodb_open_files (default 300) . Kalau tidak, akses disk sangat terbatas.
Sehubungan dengan bergabung, pastikan Anda memiliki indeks yang tepat yang mendukung kriteria bergabung.
UPDATE 2012-04-02 11:30 EDT
Menggunakan innodb_file_per_table di installattion baru menyebabkan ibdata1 tumbuh sangat lambat karena semua DDL dilakukan di luar ibdata. Anda dapat mengecilkan tabel InnoDB apa pun seperti yang saya sebutkan sebelumnya seperti ini:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
UPDATE 2012-04-02 16:50 EDT
Ketika datang ke backup, berhati-hatilah membuat salinan file .ibd. Mengapa?
Di dalam setiap file .ibd adalah nilai khusus yang dikenal sebagai tablespace_id. Ada daftar nilai tablespace_id di ibdata1. Jika Anda pernah melakukan pemeliharaan tabel yang mengharuskan menjatuhkan dan membuat ulang tabel, tablespace_id akan menjadi berbeda. Membuat salinan file .ibd tersebut hanya dapat diintegrasikan kembali ke dalam database untuk digunakan jika Anda juga membuat salinan ibdata1. Itu membahayakan tablespace_id dari semua tabel InnoDB lainnya. Sehubungan dengan hal ini, Anda sebaiknya melakukan backup mysqldump karena mysqldumps adalah salinan logis dari data. Dengan kata lain, cadangan tidak tergantung pada titik-waktu ibdata1 dan Anda bebas memuat ulang tanpa masalah pengoperasian.
Setuju dengan @Rando_MySQLDBA, untuk sesuatu yang tidak ia sebutkan: backup.
Jika Anda telah mengatur semua cadangan MySQL Anda, DAN Anda tidak memasukkan file .ibd dalam strategi cadangan sistem file Anda, maka ini tidak begitu penting. Tetapi pertimbangkan bahwa menambahkan ONE BYTES ke tabel innodb mana saja akan menyebabkan cadangan tambahan dari tabel .ibd Anda menjadi bijaksana, dan Anda dapat melihat bahwa Anda dengan cepat kehabisan penyimpanan cadangan.
sumber
Saya memiliki aplikasi di mana saya memiliki situasi ini: beberapa meja besar dan beberapa yang lebih kecil.
Saya memutuskan untuk meninggalkan yang kecil
ibdata1
sementara meletakkan yang lebih besar di file mereka sendiri.Aku melakukannya dengan memiliki
innodb_file_per_table
diaktifkan secara default dan hanya mematikannya sementara untuk memindahkan meja untukibdata1
denganALTER TABLE
.sumber
ALTER TABLE
mereka. Jadi strategi saya adalah untukinnodb_file_per_table
menyalakan secara teratur dan dengan santai mematikannya untuk memindahkan meja kecil keibdata1
dan setelah itu menyalakannya lagi.