it-swarm.asia

Bagaimana mengubah variabel innodb MySQL dengan aman 'innodb_log_file_size'?

Jadi saya cukup baru dalam menyetel InnoDB. Saya perlahan-lahan mengubah tabel (jika perlu) dari MyIsam ke InnoDB. Saya punya sekitar 100MB di innodb, jadi saya meningkatkan innodb_buffer_pool_size variabel hingga 128MB:

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

Ketika saya pergi untuk mengubah innodb_log_file_size nilai (contoh my.cnf aktif halaman konfigurasi innodb mysql komentar untuk mengubah ukuran file log menjadi 25% dari ukuran buffer. Jadi sekarang my.cnf saya terlihat seperti ini:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Ketika saya me-restart server, saya mendapatkan kesalahan ini:

110216 9:48:41 InnoDB: Menginisialisasi kumpulan buffer, ukuran = 128.0M
110216 9:48:41 InnoDB: Inisialisasi kolam buffer yang lengkap
InnoDB: Kesalahan: file log ./ib_logfile0 berbeda ukuran 0 5242880 byte
InnoDB: dari yang ditentukan dalam file .cnf 0 33554432 bytes!
110216 9:48:41 [GALAT] Fungsi init 'InnoDB' Plugin mengembalikan kesalahan.
110216 9:48:41 [ERROR] Pendaftaran plugin 'InnoDB' sebagai MESIN PENYIMPANAN gagal.

Jadi pertanyaan saya: Apakah aman untuk menghapus log_files lama, atau apakah ada metode lain untuk mengubah innodb_log_file_size variabel?

108
Derek Downey

Ya aman untuk menghapus file log setelah mysqld telah dimatikan

Untuk itu, lakukan saja langkah-langkah berikut:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

Memulai mysqld akan membuat ulang ib_logfile0 dan ib_logfile1

Cobalah !!!

UPDATE 2011-10-20 16:40 EDT

Itu membersihkan semua data di Pool Buffer InnoDB sebelum mengulang File Log, Anda harus mengatur opsi ini sekitar 1 jam sebelum shutdown:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Secara default, innodb_max_dirty_pages_pct adalah 75 (MySQL 5.5+) atau 90 (sebelum MySQL 5.5). Mengatur ini ke nol akan menjaga jumlah halaman kotor di bawah 1% dari Pool Buffer InnoDB. Pertunjukan service mysql stop tetap melakukan ini. Selain itu, shutdown akan menyelesaikan semua item yang tersisa di redo log. Untuk mempertahankan opsi ini, tambahkan saja ke /etc/my.cnf:

[mysqld]
innodb_max_dirty_pages_pct = 0

UPDATE 2013-04-19 16:16 EDT

Saya memperbarui jawaban saya sedikit lebih banyak dengan innodb_fast_shutdown karena saya biasa 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 perhatikan bahwa pengaturan innodb_fast_shutdown ke 2 akan membersihkan log juga tetapi lebih banyak bagian yang bergerak masih ada dan dipilih di Crash Pemulihan selama startup mysqld. Pengaturan 0 adalah yang terbaik.

86
RolandoMySQLDBA

Saya malah akan merekomendasikan metode resmi , yang saya buat di sini untuk kenyamanan:

Untuk mengubah jumlah atau ukuran file log InnoDB di MySQL 5.6.7 atau yang lebih lama , gunakan instruksi berikut. Prosedur untuk menggunakan tergantung pada nilai innodb_fast_shutdown, yang menentukan apakah sistem tablespace sepenuhnya diperbarui atau tidak sebelum operasi shutdown:

  • Jika innodb_fast_shutdown tidak diatur ke 2: Hentikan server MySQL dan pastikan server dimatikan tanpa kesalahan, untuk memastikan bahwa tidak ada informasi untuk transaksi luar biasa dalam redo log. Salin file redo log lama ke tempat yang aman, jika terjadi kesalahan selama shutdown dan Anda membutuhkannya untuk memulihkan tablespace. Hapus file log lama dari direktori file log, edit my.cnf untuk mengubah konfigurasi file log, dan mulai server MySQL lagi. mysqld melihat bahwa tidak ada file log InnoDB ada saat startup dan membuat yang baru.

  • Jika innodb_fast_shutdown diatur ke 2: Set innodb_fast_shutdown ke 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

Kemudian ikuti instruksi pada item sebelumnya.

Pada MySQL 5.6.8 , pengaturan innodb_fast_shutdown tidak lagi relevan ketika mengubah jumlah atau ukuran file log InnoDB. Selain itu, Anda tidak lagi diharuskan menghapus file log lama, meskipun Anda mungkin masih ingin menyalin file log lama ke tempat yang aman, sebagai cadangan. Untuk mengubah jumlah atau ukuran file log InnoDB, lakukan langkah-langkah berikut:

  1. Hentikan server MySQL dan pastikan server dimatikan tanpa kesalahan.

  2. Edit my.cnf untuk mengubah konfigurasi file log. Untuk mengubah ukuran file log, konfigurasikan innodb_log_file_size. Untuk menambah jumlah file log, konfigurasikan innodb_log_files_in_group.

  3. Mulai server MySQL lagi.

Jika InnoDB mendeteksi bahwa innodb_log_file_size berbeda dari ukuran file redo log, itu akan menulis pos pemeriksaan log, menutup dan menghapus file log lama, membuat file log baru pada ukuran yang diminta, dan membuka file log baru.

31
RandomSeed

innodb_buffer_pool_size - cukup ubah my.cnf (my.ini) dan mulai kembali mysqld.

innodb_log_file_size kurang kritis. Jangan mengubahnya kecuali ada alasan untuk itu. Roland memberikan langkah-langkahnya , tetapi satu aspek membuatku khawatir ... Saya tidak tahu apakah dua langkah pertama itu penting; sepertinya mereka bisa:

  1. set innodb_fast_shutdown = OFF
  2. restart mysql
  3. hentikan mysql
  4. hapus file log
  5. mulai mysql

File log melacak bisnis yang belum selesai; " innodb_fast_shutdown "mengatakan untuk menangani hal-hal itu setelah memulai ulang. Jadi menghapus file dapat kehilangan info?

Versi baru telah meningkatkan hal-hal: (lebih banyak diskusi di Komentar)

  • 5.6 Memungkinkan untuk innodb_log_file_size> 4GB
  • 5,6 innodb_log_file_size dapat diubah tanpa terlebih dahulu menghapus iblog *
  • 5.7 memungkinkan untuk mengubah ukuran secara dinamis innodb_buffer_pool_size

Haruskah saya mengubah log_file_size?

Gunakan GLOBAL STATUS untuk menghitung jumlah menit sebelum siklus log.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

Jika jauh kurang dari 60 (menit), maka mungkin membantu meningkatkan log_file_size. Jika jauh lebih banyak, maka file log membuang ruang disk. Itu "1 jam" agak sewenang-wenang, jadi jika Anda dekat dengan itu, jangan repot-repot mengubah log_file_size.

Tinggalkan innodb_log_files_in_group pada nilai default 2.

22
Rick James

Saat Anda masuk ke mysql ketik perintah-perintah itu:

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

Anda akan mendapatkan dua angka. Pertama Anda mendapatkan satu dan kemudian tunggu sebentar. Anda akan mendapatkan yang lain.

Katakan yang pertama adalah 3.456.718.123 dan yang kedua 4.098.873.134

Sekarang (4.098.873.134-3.856.718.123) * 60/1024/1024

Hasilnya adalah = 13.856 MB

Anda memiliki dua file log. Jadi bagilah dengan dua dan Anda akan mendapatkan nomor dekat 7.000 MB. Hanya untuk memastikan, atur ukuran file log Anda 8GB

2
Linux Newbie