Apa cara terbaik untuk mengurangi ukuran ibdata di mysql?

63

Saya memiliki beberapa server Produksi yang ibdataukuran file-nya bertambah dari hari ke hari.

Sudah mengkonsumsi ruang 290GB.

Tabel di server sebagian besar adalah InnoDB dan ada permintaan baca dan tulis yang tinggi.

Ukuran file log juga meningkat. Ada sejumlah besar Data di Tabel.

Bagaimana saya bisa mengendalikan ukuran pertumbuhan keduanya?

Saya tidak menggunakan innodb_file_per_table.

Abdul Manaf
sumber

Jawaban:

104

Perlu diingat bahwa file tersibuk di infrastruktur InnoDB adalah / var / lib / mysql / ibdata1

File ini biasanya menampung banyak kelas informasi (ketika innodb_file_per_table adalah 0)

  • Tabel Data
  • Indeks Tabel
  • Data MVCC (Multiversioning Concurrency Control)
    • Segmen Kembalikan
    • Batalkan Tablespace
  • Tabel Metadata
  • Lihat Representasi Pictorial

Banyak orang membuat banyak file ibdata dengan harapan untuk manajemen dan kinerja disk yang lebih baik. Itu tidak membantu.

Sayangnya, MENGOPTIMALKAN TABEL terhadap tabel InnoDB yang disimpan di ibdata1 melakukan dua hal:

  • Membuat data tabel dan indeks berdekatan di dalam ibdata1
  • Itu membuat ibdata1 tumbuh karena data yang berdekatan ditambahkan ke ibdata1

Anda bisa memisahkan Data Tabel dan Indeks Tabel dari ibdata1 dan mengelolanya secara independen menggunakan innodb_file_per_table . Untuk menyusutkan ibdata1 sekali dan untuk semua Anda harus melakukan hal berikut

Langkah 01) MySQLDump semua database menjadi file teks SQL (sebut saja SQLData.sql) ( Lebih detail di sini )

Langkah 02) Drop semua database (kecuali mysql, performance_schema, dan information_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

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

Pada titik ini, seharusnya hanya ada skema mysql di / var / lib / mysql

Langkah 06) Mulai ulang mysql

Ini akan membuat ulang ibdata1 pada 10MB, ib_logfile0 dan ib_logfile1 masing-masing 1G

Langkah 07) Reload SQLData.sql ke mysql

ibdata1 akan tumbuh tetapi hanya berisi tabel metadata

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 Tabel Data dan Indeks Tabel untuk mydb.mytable)

ibdata1 tidak akan pernah lagi memuat data dan Indeks InnoDB.

Dengan opsi innodb_file_per_table di /etc/my.cnf, Anda dapat menjalankan OPTIMIZE TABLE mydb.mytabledan file tersebut /var/lib/mysql/mydb/mytable.ibdakan menyusut.

Saya telah melakukan ini berkali-kali dalam karir saya sebagai DBA MySQL

Faktanya, pertama kali saya melakukan ini, saya menciutkan file ibdata1 50GB menjadi 500MB.

Cobalah. Jika Anda memiliki pertanyaan lebih lanjut tentang ini, email saya. Percayalah kepadaku. Ini akan bekerja dalam jangka pendek dan jangka panjang. !!!

Jika Anda ingin melihat seberapa banyak data aktual disimpan di MyISAM dan InnoDB, jalankan kueri ini:

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
RolandoMySQLDBA
sumber
Bahkan dengan pengaturan yang disarankan untuk my.cnf (yang sudah saya miliki), menghapus ib_logfile0 dan 1 dan kemudian memulai mysql, file-file baru dibuat dan dalam hitungan detik mereka tumbuh sama dengan ukuran database seperti yang ditampilkan oleh kueri Anda di atas. Tidak yakin apakah mysql menyalin semua tabel dan indeks ke file-file ini sambil juga menjaga setiap tabel dalam file terpisah.
Allen King