Saya punya jawaban lengkap untuk yang ini.
Setelah innodb_file_per_table dimasukkan, dan tabel InnoDB baru dapat menyusut menggunakan ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
Ini akan menyusutkan .ibd
file baru DIJAMIN.
Jika Anda menjalankan ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
tabel InnoDB yang dibuat sebelum Anda menggunakan innodb_file_per_table, itu akan menarik data dan indeks untuk tabel itu dari file ibdata1 dan menyimpannya dalam .ibd
file, Ini akan meninggalkan seluruh merpati permanen di dalam ibdata1 yang tidak pernah dapat digunakan kembali. .
The ibdata1
berkas biasanya rumah empat jenis informasi
Inilah cara yang dijamin untuk menyusutkan file ibdata1 cukup lama ...
LANGKAH 01) MySQLDump semua database menjadi file teks SQL (sebut saja SQLData.sql)
LANGKAH 02) Letakkan semua basis data (kecuali skema mysql, information_schema, dan performance_schema)
LANGKAH 03) Matikan mysql
LANGKAH 04) Tambahkan baris berikut ke /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
Sidenote: Apa pun yang Anda atur untuk innodb_buffer_pool_size, pastikan innodb_log_file_size adalah 25% dari innodb_buffer_pool_size.
- LANGKAH 05) Hapus ibdata1, ib_logfile0 dan ib_logfile1 ( lihat pembaruan di bawah ini sebelum menghapus! )
Pada titik ini, seharusnya hanya ada skema mysql di / var / lib / mysql
- LANGKAH 06) Mulai kembali mysql
Ini akan membuat ulang ibdata1 pada 10MB (tidak mengkonfigurasi opsi), ib_logfile0 dan ib_logfile1 masing-masing 1G
- LANGKAH 07) Muat ulang SQLData.sql ke mysql
ibdata1
akan tumbuh tetapi hanya berisi metadata tabel dan data MVCC intermiten.
Setiap tabel InnoDB akan ada di luar ibdata1
Misalkan Anda memiliki tabel InnoDB bernama mydb.mytable. Jika Anda masuk ke /var/lib/mysql/mydb
, Anda akan melihat dua file yang mewakili tabel
mytable.frm
(Header Mesin Penyimpan)
mytable.ibd
(Rumah Data Tabel dan Indeks Tabel untuk mydb.mytable
)
ibdata1
tidak akan lagi berisi data dan Indeks InnoDB.
Dengan opsi innodb_file_per_table di /etc/my.cnf
, Anda dapat menjalankan OPTIMIZE TABLE mydb.mytable
ATAU ALTER TABLE mydb.mytable ENGINE=InnoDB;
dan file /var/lib/mysql/mydb/mytable.ibd
akan benar-benar menyusut.
Saya telah melakukan ini berkali-kali dalam karir saya sebagai DBA MySQL tanpa banyak masalah setelahnya. Bahkan, pertama kali saya melakukan ini, saya menciutkan file ibdata1 50GB menjadi 50MB.
Cobalah. Jika Anda memiliki pertanyaan lebih lanjut tentang ini, email saya. Percayalah kepadaku. Ini akan bekerja dalam jangka pendek dan jangka panjang.
UPDATE 2013-07-02 15:08 EDT
Ada peringatan yang saya miliki dalam hal ini yang saya perbarui di posting saya yang lain tetapi saya melewatkan ini: Saya memperbarui jawaban saya sedikit lagi dengan innodb_fast_shutdown karena saya digunakan untuk me-restart mysql dan menghentikan mysql untuk melakukan ini. Sekarang, satu langkah ini sangat penting karena setiap transaksi yang tidak berkomitmen dapat memiliki bagian bergerak lainnya di dalam dan di luar Log Transaksi InnoDB ( Lihat Infrastruktur InnoDB ).
Harap dicatat bahwa pengaturan innodb_fast_shutdown ke 2 akan membersihkan log juga, tetapi lebih banyak bagian yang bergerak masih ada dan dipilih pada Crash Recovery selama startup mysqld. Pengaturan 0 adalah yang terbaik.