Berikut adalah jawaban yang lebih lengkap terkait dengan InnoDB. Ini adalah proses yang sedikit panjang, tetapi sepadan dengan usaha.
Ingatlah bahwa /var/lib/mysql/ibdata1
adalah file tersibuk di infrastruktur InnoDB. Biasanya menyimpan enam jenis informasi:
- Data Tabel
- Indeks Tabel
- MVCC (Kontrol Konkurensi Multiversi)
Data
- Segmen Kembalikan
- Urungkan Spasi
- Metadata Tabel (Kamus Data)
- Double Write Buffer (penulisan latar belakang untuk mencegah ketergantungan pada cache OS)
- Sisipkan Buffer (mengelola perubahan pada indeks sekunder non-unik)
- Lihat
Pictorial Representation of ibdata1
Arsitektur InnoDB
Banyak orang membuat beberapa ibdata
file yang mengharapkan manajemen dan kinerja ruang disk yang lebih baik, namun keyakinan itu salah.
Dapatkah saya menjalankan OPTIMIZE TABLE
?
Sayangnya, menjalankan OPTIMIZE TABLE
terhadap tabel InnoDB yang disimpan dalam file ruang tabel bersama ibdata1
melakukan dua hal:
- Membuat data dan indeks tabel bersebelahan di dalam
ibdata1
- Membuat
ibdata1
berkembang karena data yang berdekatan dan halaman indeks ditambahkan keibdata1
Namun Anda dapat, memisahkan Data Tabel dan Indeks Tabel dari ibdata1
dan mengelolanya secara mandiri.
Dapatkah saya menjalankan OPTIMIZE TABLE
dengan innodb_file_per_table
?
Misalkan Anda menambahkan innodb_file_per_table
ke /etc/my.cnf (my.ini)
. Bisakah Anda menjalankan OPTIMIZE TABLE
di semua Tabel InnoDB?
Kabar Baik :Saat Anda menjalankan OPTIMIZE TABLE
dengan innodb_file_per_table
diaktifkan, ini akan menghasilkan .ibd
file untuk tabel itu. Misalnya, jika Anda memiliki tabel mydb.mytable
dengan datadir dari /var/lib/mysql
, maka akan menghasilkan sebagai berikut:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
.ibd
akan berisi Halaman Data dan Halaman Indeks untuk tabel itu. Hebat.
Berita Buruk :Yang telah Anda lakukan hanyalah mengekstrak Halaman Data dan Halaman Indeks dari mydb.mytable
dari tinggal di ibdata
. Entri kamus data untuk setiap tabel, termasuk mydb.mytable
, masih tersimpan dalam kamus data (Lihat Representasi Bergambar dari ibdata1
). ANDA TIDAK BISA HANYA MENGHAPUS ibdata1
PADA TITIK INI !!! Harap diperhatikan bahwa ibdata1
belum menyusut sama sekali.
Pembersihan Infrastruktur InnoDB
Untuk mengecilkan ibdata1
sekali dan untuk semua Anda harus melakukan hal berikut:
-
Dump (mis., dengan
mysqldump
) semua database menjadi.sql
file teks (SQLData.sql
digunakan di bawah) -
Jatuhkan semua database (kecuali
mysql
daninformation_schema
) PERINGATAN :Sebagai tindakan pencegahan, jalankan skrip ini untuk memastikan Anda memiliki semua izin pengguna di tempatnya:mkdir /var/lib/mysql_grants cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/. chown -R mysql:mysql /var/lib/mysql_grants
-
Login ke mysql dan jalankan
SET GLOBAL innodb_fast_shutdown = 0;
(Ini akan menghapus semua perubahan transaksional yang tersisa dariib_logfile0
danib_logfile1
) -
Matikan MySQL
-
Tambahkan baris berikut ke
/etc/my.cnf
(ataumy.ini
di Windows)[mysqld] innodb_file_per_table innodb_flush_method=O_DIRECT innodb_log_file_size=1G innodb_buffer_pool_size=4G
(Catatan:Apapun yang Anda set untuk
innodb_buffer_pool_size
, pastikaninnodb_log_file_size
adalah 25% dariinnodb_buffer_pool_size
.Juga:
innodb_flush_method=O_DIRECT
tidak tersedia di Windows) -
Hapus
ibdata*
danib_logfile*
, Secara opsional, Anda dapat menghapus semua folder di/var/lib/mysql
, kecuali/var/lib/mysql/mysql
. -
Mulai MySQL (Ini akan membuat ulang
ibdata1
[10MB secara default] danib_logfile0
danib_logfile1
pada masing-masing 1G). -
Impor
SQLData.sql
Sekarang, ibdata1
akan tetap tumbuh tetapi hanya berisi metadata tabel karena setiap tabel InnoDB akan ada di luar ibdata1
. ibdata1
tidak akan lagi berisi data dan indeks InnoDB untuk tabel lain.
Misalnya, Anda memiliki tabel InnoDB bernama mydb.mytable
. Jika Anda melihat di /var/lib/mysql/mydb
, Anda akan melihat dua file yang mewakili tabel:
mytable.frm
(Header Mesin Penyimpanan)mytable.ibd
(Tabel Data dan Indeks)
Dengan innodb_file_per_table
pilihan di /etc/my.cnf
, Anda dapat menjalankan OPTIMIZE TABLE mydb.mytable
dan file /var/lib/mysql/mydb/mytable.ibd
sebenarnya akan menyusut.
Saya telah melakukan ini berkali-kali dalam karir saya sebagai DBA MySQL. Faktanya, pertama kali saya melakukan ini, saya mengecilkan 50GB ibdata1
file menjadi hanya 500MB!
Cobalah. Jika Anda memiliki pertanyaan lebih lanjut tentang ini, tanyakan saja. Percaya padaku; ini akan berhasil dalam jangka pendek maupun jangka panjang.
PERINGATAN
Pada Langkah 6, jika mysql tidak dapat memulai ulang karena mysql
skema mulai turun, lihat kembali Langkah 2. Anda membuat salinan fisik mysql
skema. Anda dapat memulihkannya sebagai berikut:
mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql
Kembali ke Langkah 6 dan lanjutkan
PERBARUI 2013-06-04 11:13 EDT
Berkenaan dengan pengaturan innodb_log_file_size hingga 25% dari innodb_buffer_pool_size di Langkah 5, aturan umum itu agak kuno.
Kembali pada July 03, 2006
, Percona memiliki artikel yang bagus mengapa memilih innodb_log_file_size yang tepat . Nanti, pada Nov 21, 2008
, Percona menindaklanjuti dengan artikel lain di cara menghitung ukuran yang tepat berdasarkan beban kerja puncak dengan menyimpan perubahan selama satu jam
.
Sejak itu saya telah menulis posting di DBA StackExchange tentang menghitung ukuran log dan di mana saya mereferensikan kedua artikel Percona itu.
Aug 27, 2012
:Penyetelan yang tepat untuk tabel InnoDB 30 GB di server dengan RAM 48 GBJan 17, 2013
:MySQL 5.5 - Innodb - innodb_log_file_size lebih tinggi dari gabungan 4 GB?
Secara pribadi, saya masih akan menggunakan aturan 25% untuk pengaturan awal. Kemudian, karena beban kerja dapat ditentukan secara lebih akurat dari waktu ke waktu dalam produksi, Anda dapat mengubah ukuran log selama siklus pemeliharaan hanya dalam hitungan menit.