it-swarm.asia

Apakah innodb_file_per_table disarankan?

Kami memiliki aplikasi di mana hanya satu dari tabel akan tumbuh menjadi jutaan baris tetapi sisanya hanya di bawah satu juta. Jadi apa saran yang harus kita gunakan dengan innodb_file_per_table atau biarkan hanya sebagai .ibd? Saya membaca beberapa artikel mengatakan jangan ikuti karena Anda memerlukan lebih banyak akses disk ketika ada yang harus dilakukan? Kami akan bergabung di antara tabel ini dan lainnya untuk melaporkan tujuan pembuatan.

19
newbie14

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 mengatur MySQL dan meninggalkan InnoDB dalam kondisi standarnya. 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 menambah 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 menyusutkan 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 database untuk digunakan jika Anda juga membuat salinan ibdata1. Itu membahayakan tablespace_id dari semua tabel InnoDB lainnya. Sehubungan dengan 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.

24
RolandoMySQLDBA

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 apa saja akan menyebabkan cadangan tambahan tabel .ibd Anda menjadi bijaksana, dan Anda dapat melihat bahwa Anda dengan cepat kehabisan penyimpanan cadangan.

7
Jan Steinman

Saya memiliki aplikasi di mana saya memiliki situasi ini: beberapa meja besar dan beberapa yang lebih kecil.

Saya memutuskan untuk meninggalkan yang kecil di ibdata1 sambil meletakkan yang lebih besar di file mereka sendiri.

Saya melakukannya dengan meminta innodb_file_per_table diaktifkan secara default dan hanya mematikannya sementara untuk memindahkan tabel ke ibdata1 dengan ALTER TABLE.

4
glglgl