Apakah innodb_file_per_table disarankan?

19

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.

pemula14
sumber

Jawaban:

24

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.

RolandoMySQLDBA
sumber
ini akan menjadi server baru. jadi apa yang harus saya lakukan? Mengapa menurut Anda bagus untuk menggunakan innodb_file_per_table? Lembur a tabel ini akan tumbuh apa yang harus dilihat waspada segala jenis kesalahan batas?
newbie14
7

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.

Jan Steinman
sumber
Sayang semua ya saya berencana untuk menjalankan backup juga. jika saya perlu master untuk menguasai cadangan apa bedanya dari hanya master ke budak? Apakah keduanya akan saling membackupkan? Pada pengaturan apa yang perlu diubah?
newbie14
4

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

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

Aku melakukannya dengan memiliki innodb_file_per_tablediaktifkan secara default dan hanya mematikannya sementara untuk memindahkan meja untuk ibdata1dengan ALTER TABLE.

glglgl
sumber
@gigigi cara meninggalkan yang kecil di ibdata1 dan yang besar di file mereka sendiri bukankah itu jika Anda mengatur innodb_file_per_table ini berarti semua akan berada di file mereka sendiri?
newbie14
Hanya setelah Anda ALTER TABLEmereka. Jadi strategi saya adalah untuk innodb_file_per_tablemenyalakan secara teratur dan dengan santai mematikannya untuk memindahkan meja kecil ke ibdata1dan setelah itu menyalakannya lagi.
glglgl
apakah boleh tetap sebagai innodb_file_per_table bukan masalah di sini kan?
newbie14
harus ok, IMHO ...
glglgl