Bagaimana cara mengubah variabel innodb MySQL dengan aman 'innodb_log_file_size'?

105

Jadi saya cukup baru dalam menyetel InnoDB. Saya perlahan-lahan mengubah tabel (jika perlu) dari MyIsam ke InnoDB. Saya memiliki sekitar 100MB di innodb, jadi saya meningkatkan innodb_buffer_pool_sizevariabel menjadi 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_sizenilai (contoh my.cnf di halaman konfigurasi innodb mysql berkomentar 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: Menyelesaikan inisialisasi pool buffer
InnoDB: Kesalahan: file log ./ib_logfile0 berukuran berbeda 0 5242880 byte
InnoDB: dari yang ditentukan dalam file .cnf 0 33554432 byte!
110216 9:48:41 [ERROR] Fungsi init 'InnoDB' Plugin mengembalikan kesalahan.
110216 9:48:41 [GALAT] Plugin 'InnoDB' pendaftaran sebagai MESIN PENYIMPANAN gagal.

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

Derek Downey
sumber
1
Komentari innodb_log_file_size di my.ini .....
5
hmm, mengapa saya ingin berkomentar untuk menggunakan nilai default ketika saya mencoba mengubahnya dari nilai default?
Derek Downey
Ya dengan mengomentari baris innodb_log_file_size kerjanya .. Terima kasih.
muhammad umar farooq frank
2
@muhammadumarfarooqfrank Tentu saja berhasil - karena Anda tidak mengubah nilai variabel lagi, oleh karena itu membuat seluruh poin diperdebatkan. Saya berharap ada cara untuk menurunkan komentar.
dr01

Jawaban:

83

Ya aman untuk menghapus file log setelah mysqld telah dimatikan

Sehubungan dengan ini, 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_logfile0danib_logfile1

Cobalah !!!

UPDATE 2011-10-20 16:40 EDT

Itu bersihkan semua data di InnoDB Buffer Pool 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 stoptetap 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 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.

RolandoMySQLDBA
sumber
1
Jawaban yang bagus dan pembaruannya juga bagus. Satu-satunya saran saya adalah SALINKAN ib_logfiles ke lokasi lain jika terjadi kesalahan. Ini akan membantu Anda mendapatkan ide untuk mengukur ukuran file: mysqlperformanceblog.com/2011/07/09/…
Justin Noel
5
Bekerja untuk saya juga, TETAPI: konsol linux UI bisa menyesatkan - startup mysqld membutuhkan banyak waktu jika Anda mengatur ukuran file log besar (beberapa ratus MB atau lebih). UI konsol menunjukkan titik kepada Anda dan kemudian menampilkan "gagal!", Tetapi sebenarnya MySQL masih memulai. Tunggu dan terus baca file log (atau pantau file log dengan "tail -f [log-file]") hingga Anda melihat "mysqld: ready for koneksi." dan kedua file log dialokasikan pada disk.
f055
2
PERINGATAN!! langkah 3 tidak bekerja untuk saya dan hati saya hampir berhenti ketika saya melihat mysql memuat tanpa InnoDB, Harus menghentikan mysql dan menghapusnya secara manual dan mulai MySQL lagi. dua saran: 1. Cadangkan file log yang sudah ada, 2. hapus file secara manual
Peeyush Kushwaha
2
Peeyush benar. Bahkan dokumentasi mysql merekomendasikan untuk mencadangkan file log Anda jika ada masalah
Greg
1
@Greg inilah sebabnya saya menggunakan SET GLOBAL innodb_fast_shutdown = 0;. Ketika MySQL dimatikan, semua transaksi dialihkan dari semua bagian yang bergerak, termasuk redo log (ib_logfile0 dan ib_logfile1). Seseorang dapat menyimpannya. Saya belum menemukan masalah dengan log yang benar-benar memerah.
RolandoMySQLDBA
31

Sebagai gantinya saya 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 sebelumnya , 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 di 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.

RandomSeed
sumber
Ini adalah jawaban yang bagus sebagai pembaruan untuk pertanyaan ini. +1 !!!
RolandoMySQLDBA
2
Ini bukan "pembaruan". Halaman manual ini sudah lama ada. Saya selalu merekomendasikan informasi tangan pertama dari manual (salah satu manual terbaik di luar sana) daripada menciptakan kembali roda dan menggandakan informasi (yang merupakan sesuatu yang paling kita benci DBA).
RandomSeed
Ini adalah metode yang disukai pada MySQL 5.6. Jika Anda masih menjalankan versi sebelum 5.6, ini tidak akan berfungsi.
Derek Downey
20

innodb_buffer_pool_size- cukup ganti my.cnf( my.ini) dan mulai ulang mysqld.

innodb_log_file_sizekurang kritis. Jangan mengubahnya kecuali ada alasan untuk itu. Roland menyediakan langkah-langkahnya , tetapi satu aspek membuatku khawatir ... Aku 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 kembali. 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_sizedapat 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 STATUSuntuk menghitung jumlah menit sebelum siklus log.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

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

Biarkan innodb_log_files_in_groupdefault 2.

Rick James
sumber
1 kekhawatiran Anda tampaknya didukung oleh dokumen
Jack Douglas
Saya melihat jawaban ini dan saya suka baris pertama. Saya biasanya memiliki klien membawa mysql turun dan naik dengan --skip-networkingsebagai tindakan pencegahan untuk mendapatkan perubahan menit-menit terakhir keluar dari jalan. Baris pertama Anda (atur innodb_fast_shutdown = OFF) menghilangkan itu. +1 !!!
RolandoMySQLDBA
1
Terima kasih atas upvotesnya. Pembaca baru mungkin tidak membutuhkan ini. Di 5.6.8 , innodb_log_file_sizeditingkatkan untuk memungkinkan mengubahnya tanpa menghapus file iblog.
Rick James
Apakah maksud Anda "lebih kritis", bukan "kurang kritis"?
Igor
@ Igor - Tidak. Jika Anda memiliki log_file_size terlalu kecil, akan ada tambahan I / O meronta-ronta itu. Saya jarang melihatnya. Jika Anda memilikinya terlalu besar, Anda hanya membuang ruang disk. Tujuan dalam pengaturannya adalah untuk siklus dalam satu jam. Tapi 10 menit versus 10 jam - tidak ada masalah. lebih lanjut ...
Rick James
1

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

Pemula Linux
sumber
1
Tidak jelas (setidaknya bagi saya) bahwa ini sebenarnya menjawab pertanyaan. Ini tampaknya menjadi saran untuk ukuran alternatif untuk file log, bukan bagaimana mengubah ukuran file log dengan aman.
RDFozz
1
@RDFozz Anda benar. Ini tidak menjawab bagaimana mengubah ukuran file log. Pertanyaan ini menjawab bagaimana cara mencari tahu nomor untuk mengatur innodb_log_file_size. Saya sudah menjawab pertanyaan seperti itu lima tahun lalu (Lihat subpos Log File Sizedi dba.stackexchange.com/questions/23189/… )
RolandoMySQLDBA
Saya hanya ingin membantu: / Saya tahu itu bukan jawaban yang tepat.
Linux Newbie
-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || layanan restart mysql

Cobalah, dijamin akan berfungsi [diuji pada Debian 6]

Gregory
sumber
2
Ini tidak menjamin shutdown yang bersih. Ini mungkin bekerja dalam kasus rata-rata pada server dengan hanya beban ringan, tetapi tidak dianjurkan jika Anda peduli dengan integritas database Anda.
Emil Vikström