Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara:Membersihkan mesin penyimpanan InnoDB mysql?

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:

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 ke ibdata1

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:

  1. Dump (mis., dengan mysqldump ) semua database menjadi .sql file teks (SQLData.sql digunakan di bawah)

  2. Jatuhkan semua database (kecuali mysql dan information_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
    
  3. Login ke mysql dan jalankan SET GLOBAL innodb_fast_shutdown = 0; (Ini akan menghapus semua perubahan transaksional yang tersisa dari ib_logfile0 dan ib_logfile1 )

  4. Matikan MySQL

  5. Tambahkan baris berikut ke /etc/my.cnf (atau my.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 , pastikan innodb_log_file_size adalah 25% dari innodb_buffer_pool_size .

    Juga:innodb_flush_method=O_DIRECT tidak tersedia di Windows)

  6. Hapus ibdata* dan ib_logfile* , Secara opsional, Anda dapat menghapus semua folder di /var/lib/mysql , kecuali /var/lib/mysql/mysql .

  7. Mulai MySQL (Ini akan membuat ulang ibdata1 [10MB secara default] dan ib_logfile0 dan ib_logfile1 pada masing-masing 1G).

  8. 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.

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memasukkan ke dalam tabel yang sama di MySQL?

  2. Fungsi MySQL SQRT() – Mengembalikan Akar Kuadrat Angka di MySQL

  3. Permintaan mysql untuk secara dinamis mengonversi baris ke kolom berdasarkan dua kolom

  4. PHP menampilkan gambar BLOB dari MySQL

  5. Melarikan diri dari kutipan tunggal dalam PHP saat memasukkan ke MySQL