Perubahan dinamis ke innodb_flush_log_at_trx_commit

11

Ini terkait dengan pertanyaan ini . Itu membantu untuk mendapatkan kinerja yang lebih baik untuk tabel InnoDB.

Menurut manual MySQL , innodb_flush_log_at_trx_commitadalah variabel dinamis global. Dengan demikian, saya dapat mengubahnya menggunakan perintah SET GLOBAL dan sepertinya berfungsi.

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

Tapi, itu tidak membuat pengaturan MySQL yang sebenarnya berubah. Ketika saya memperbarui my.cnf dan me -restart server MySQL, itu berhasil. Jadi, saya tidak bisa mengubah variabel global saat dijalankan?

Saya lebih suka nilai default innodb_flush_log_at_trx_commit=1, tetapi saya harus mengubahnya ke 2 sebelum saya menjalankan proses pemulihan untuk database besar agar lebih cepat. Tetapi ketika proses selesai, saya ingin mengubah nilai kembali ke 1. Apakah mungkin untuk melakukan ini pada saat run time?

Saya tidak memiliki akses ke my.cnf di server hosting bersama saya.

Sithu
sumber

Jawaban:

12

Meskipun saya setuju dengan rekomendasi Rolando untuk berubah innodb_flush_method, saya tidak 100% mengerti apa yang Anda maksud dengan:

itu tidak membuat pengaturan MySQL yang sebenarnya berubah

Saya ingin menunjukkan peringatan bahwa membuat perubahan pada variabel GLOBAL memengaruhi koneksi baru, tetapi tidak mengubah sesi saat ini (penekanan saya):

Perubahan variabel global tidak mempengaruhi variabel sesi untuk setiap klien yang saat ini terhubung ( bahkan tidak dari klien yang mengeluarkan pernyataan SET GLOBAL ).

Jadi untuk memeriksa itu:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)
Derek Downey
sumber
2
Jawaban ini masuk akal. Dokumentasi ( dev.mysql.com/doc/refman/5.5/en/… ) tidak mengatakan bahwa variabel di tingkat sesi dapat diubah, hanya tingkat global. Saya mengalami itu berkali-kali mengubah max_connections dengan SET GLOBAL max_connections = 1000;dan ketika saya menjalankan SHOW VARIABLES LIKE 'max_connections';untuk melihat nilai lama akan mendorong kacang berarti sampai saya log out dan kembali. +1 untuk sudut pandang ini yang diterima begitu saja dan sering dilupakan.
RolandoMySQLDBA
@Rando aku juga! juga, senang ketika saya menemukan bahwa saya dapat 'terhubung;' alih-alih keluar dan kembali. Menghemat waktu!
Derek Downey
Konsep menjalankan connectitu sebenarnya baru bagi saya di MySQL. Saya telah melakukan itu sejuta kali di PostgreSQL dan Oracle. Saya tidak pernah berpikir bahwa MySQL mengizinkannya
RolandoMySQLDBA
@Dest, Terima kasih atas jawaban Anda. Menurut tes saya yang dalam, itu bekerja secara dinamis. Di localhost saya, variabel sesi diubah tanpa menjalankan koneksi (saya mendapat kesalahan saat masalah connect). Dengan nilai 2, mengimpor 2.241 catatan mengambil 27 menit 43 detik, sedangkan butuh sekitar 1 hari dengan nilai 1. Pengaturan tampaknya berfungsi di sesi saat ini tetapi mengembalikan pengaturan asli (dari my.cnf) setelah restart.
Sithu
@DerekDowney, Apakah ini hanya untuk pengaturan tertentu seperti innodb_flush_log_at_trx_commit? Atau apakah itu untuk semua pengaturan, pengaturan globaltidak akan memengaruhi sesi saat ini?
Pacerier
7

Dengan mengatur innodb_flush_log_at_trx_commit , Anda berisiko kebingungan dengan interoperabilitas mysqld / OS. Saya mengatakan ini karena OS sedang dipercaya untuk melakukan flush.

Perhatikan peringatan dari dalam Dokumentasi MySQL

Banyak sistem operasi dan beberapa perangkat keras disk mengelabui operasi flush-to-disk. Mereka mungkin memberi tahu mysqld bahwa flush telah terjadi, walaupun belum. Maka daya tahan transaksi tidak dijamin bahkan dengan pengaturan 1, dan dalam kasus terburuk pemadaman listrik bahkan dapat merusak database InnoDB. Menggunakan cache disk yang didukung baterai dalam pengontrol disk SCSI atau dalam disk itu sendiri mempercepat flush file, dan membuat operasi lebih aman. Anda juga dapat mencoba menggunakan perintah Unix hdparm untuk menonaktifkan cache tulis di cache perangkat keras, atau menggunakan perintah lain yang khusus untuk vendor perangkat keras.

Yang diceritakan adalah sebagai berikut: OS dapat berbohong seperti suami yang selingkuh. OS mengatakan akan mem-flush ke disk dan tidak melakukannya. Oleh karena itu, bahkan jika Anda mengatur innodb_flush_log_at_trx_commit, Anda harus menceraikan OS flushing ke disk dari mysqld's flushing ke disk.

Coba atur innodb_flush_method ke O_DIRECT jika Anda belum melakukannya. Anda mungkin melihat perbedaan karena metode flush sangat berbeda (Lihat Mar 04, 2011posting saya Klarifikasi pada variabel innodb_flush_method MySQL ).

CAVEAT

Seperti yang Anda sebutkan, Anda tidak memiliki akses ke my.cnf. Silakan hubungi SysAdmin di penyedia Anda dan dapatkan innodb_flush_method berubah.

UPDATE 2012-12-10 12:45 EDT

Saya saat ini menjalankan MySQL 5.5.12 di PC saya. Ketika saya terhubung dan menjalankan show variables like 'innodb_flush_method';saya dapatkan

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

Karena kosong, itu hanya menunjukkan bahwa pengaturan default digunakan. Silakan baca posting saya Mar 04, 2011 untuk Klarifikasi tentang variabel innodb_flush_method MySQL

RolandoMySQLDBA
sumber
Saya menguji di localhost saya terlebih dahulu. Saya tidak bisa menemukan innodb_flush_methoddi my.ini(tidak my.cnf). Informasi server - Apache 2.4.1, PHP 5.4.4, MySQL 5.5
Sithu
Saya perhatikan bahwa terlepas dari versi server atau ini / cnf, file konfigurasi tidak memiliki innodb_flush_methodpengaturan dan SHOW VARIABLEStidak menunjukkannya.
Sithu
Terima kasih atas UPDATE Anda, saya mengerti juga, saya hanya ingin tahu mengapa kami tidak dapat melihat nilainya. Karena saya tidak dapat menemukannya di my.iniatau my.cnfdan itu bukan variabel dinamis, saya tidak yakin bagaimana saya bisa mengkonfigurasinya.
Sithu