Aku berbalik innodb_flush_log_at_trx_commit = 2
dan mendapatkan sangat cepat kecepatan menulis. Tetapi apakah itu aman digunakan dalam produksi situs web?
Anda dapat kehilangan hingga satu detik's senilai transaksi. Nilai default adalah 1, yang membantu menjaga InnoDB ACID Compliant.
Menurut Dokumentasi MySQL pada innodb_flush_log_at_trx_commit
Jika nilai innodb_flush_log_at_trx_commit adalah 0, log buffer adalah ditulis ke file log sekali per detik dan siram ke disk operasi yang dilakukan pada file log, tapi tidak ada yang dilakukan di transaksi commit. Ketika nilai adalah 1 (default), log buffer ditulis ke file log pada setiap transaksi commit dan siram ke disk dilakukan pada file log. Ketika nilai 2, log buffer adalah menulis ke file pada masing-masing melakukan, tapi flush ke disk operasi tidak dilakukan di atasnya. Namun, flushing pada log file yang berlangsung sekali per detik juga ketika nilai adalah 2. Perhatikan bahwa sekali-per-detik pembilasan ini tidak 100% dijamin terjadi setiap detik, karena proses penjadwalan masalah.
nilai default 1 diperlukan untuk full ASAM kepatuhan. Anda dapat mencapai kinerja yang lebih baik dengan menetapkan nilai yang berbeda dari 1, tapi maka anda dapat kehilangan hingga satu detik senilai transaksi dalam kecelakaan. Dengan nilai 0, setiap proses mysqld kecelakaan dapat menghapus detik terakhir transaksi. Dengan nilai 2, hanya sebuah sistem operasi crash atau pemadaman listrik dapat menghapus terakhir kedua transaksi. InnoDB's crash recovery bekerja terlepas dari nilai.
Untuk kemungkinan terbesar daya tahan dan konsistensi dalam replikasi setup menggunakan InnoDB dengan transaksi, menggunakan innodb_flush_log_at_trx_commit=1 dan sync_binlog=1 di master server saya.cnf file.
hati-Hati
Banyak sistem operasi dan beberapa perangkat keras disk bodoh flush-to-disk operasi. Mereka dapat memberitahu mysqld bahwa siram telah terjadi, bahkan meskipun belum. Maka daya tahan transaksi tidak dijamin bahkan dengan pengaturan 1, dan dalam kasus terburuk listrik pemadaman bahkan dapat merusak database InnoDB. Menggunakan baterai yang didukung disk cache pada disk controller SCSI atau di disk itu sendiri mempercepat file flushes, dan membuat operasi lebih aman. Anda juga dapat mencoba menggunakan Unix perintah hdparm untuk menonaktifkan caching disk dalam menulis hardware cache, atau menggunakan beberapa perintah lain yang spesifik untuk perangkat keras vendor.
Berdasarkan hal ini, nilai-nilai lain dari 1 menempatkan InnoDB pada risiko kehilangan 1 detik's senilai transaksi, atau transaksi commit's senilai data.
Dokumentasi juga menggunakan kata sync_binlog=1
.
Menurut Dokumentasi MySQL pada sync_binlog
nilai 1 adalah pilihan yang paling aman karena dalam peristiwa kecelakaan anda kehilangan paling banyak satu pernyataan atau transaksi dari binary log. Namun, itu juga paling lambat pilihan (kecuali disk baterai didukung cache, yang membuat sinkronisasi sangat cepat).
Anda pilihan yang paling aman adalah
[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1
Jika anda tidak keberatan kehilangan data yang mungkin (sampai 1 detik's bernilai) maka anda dapat menggunakan 0 atau 2 di risiko anda sendiri jika imbalan (lebih cepat kecepatan tulis) yang layak.
The innodb_flush_log_at_trx_commit
digunakan dengan tujuan sebagai ..
Jika nilai innodb_flush_log_at_trx_commit
adalah 0, log buffer adalah ditulis ke file log sekali per detik dan siram ke disk dilakukan pada file log, tapi tidak ada yang dilakukan pada suatu transaksi commit.
Ketika nilai adalah 1 (default), log buffer adalah ditulis ke file log pada setiap transaksi commit dan siram ke disk dilakukan pada file log.
Ketika nilai 2, log buffer adalah menulis ke file pada masing-masing melakukan, tapi siram ke disk operasi tidak dilakukan di atasnya. Namun, flushing pada log file yang berlangsung sekali per detik juga ketika nilai adalah 2. Perhatikan bahwa sekali-per-detik pembilasan ini tidak 100% dijamin terjadi setiap detik, karena proses penjadwalan masalah.
Nilai default 1 diperlukan untuk full ASAM kepatuhan. Anda dapat mencapai kinerja yang lebih baik dengan menetapkan nilai yang berbeda dari 1, tapi kemudian anda dapat kehilangan hingga satu detik senilai transaksi dalam kecelakaan. Dengan nilai 0, setiap proses mysqld kecelakaan dapat menghapus terakhir kedua transaksi. Dengan nilai 2, hanya sebuah sistem operasi crash atau listrik dapat menghapus terakhir kedua transaksi. InnoDB's crash recovery bekerja terlepas dari nilai.
Dalam pendapat Saya menggunakan innodb_flush_log_at_trx_commit
2 seharusnya tidak menjadi masalah.Tapi untuk menggunakan 1 adalah yang paling aman.
Pendapat saya berbeda dari yang lain. innodb_flush_log_at_trx_commit = 0 jika: ini adalah perkembangan komputer atau rumah mini database di mana tidak ada data sensitif.
innodb_flush_log_at_trx_commit = 2 jika: ini adalah blog/statistik/e-commerce (dengan ~100x toko di hari), dll.
innodb_flush_log_at_trx_commit = 1 jika: anda memiliki banyak pelanggan atau yang anda butuhkan untuk bekerja dengan transaksi uang seperti bank. jadi saat ini anda harus membagi dataflow antara beberapa server memiliki kecepatan & keselamatan.
Saya lebih memilih 2, karena itu telah ~75x lebih cepat kecepatan menulis dan gagal HANYA jika perangkat keras yang gagal.
Pokoknya anda harus tahu apa yang anda butuhkan lebih banyak lagi menulis kecepatan hingga 1 detik informasi?
Saya mencoba untuk menjawab, apa tujuan dari innodb_flush_log_at_trx_commit?
InnoDB melakukan sebagian besar operasi di memori (InnoDB Buffer Pool
). Al dimodifikasi data ditulis ke InnoDB transaksi log file
dan kemudian memerah (tertulis) untuk tahan lama penyimpanan (hard disk).
Untuk keamanan data (daya Tahan dari ASAM
), InnoDB memiliki untuk menyimpan data yang dimodifikasi dari setiap transaksi ke dalam penyimpanan permanen. Pada saat yang sama, melakukan disk untuk setiap transaksi adalah proses yang mahal.
Disk I/O adalah suatu proses pemblokiran dan itu sangat lambat, hal itu adalah lambat disk, selanjutnya akan mengurangi jumlah InnoDB transaksi per detik
(Disk throughput).
InnoDB menyediakan, innodb_flush_log_at_trx_commit
variabel untuk mengontrol frekuensi ini flush operasi. Berdasarkan nilai, InnoDB flush operasi berperilaku berbeda.
(Sudah dijelaskan pada jawaban yang lain)
0 - Menulis ke file log dan siram ke disk di setiap detik (data di buffer pool tidak ditulis ke log file - untuk kinerja gain). 1 - Flush untuk disk ketika melakukan transaksi - default(Untuk keamanan data - ASAM kepatuhan) 2 - menulis ke file log untuk setiap transaksi dan siram ke disk di setiap detik. (Untuk keuntungan kinerja)
Tergantung pada kebutuhan aplikasi (Kinerja yang Lebih baik dari data keselamatan
) , anda dapat mengatur variabel ini. Perbedaan antara 0 dan 2 - baik akan meningkatkan kinerja, nilai 2 menyimpan data dalam file transaksi dan dapat dipulihkan, dalam kasus kecelakaan atau kegagalan, tapi tidak dalam 0.
Dalam banyak kasus, siram ke disk ini berarti, data tertulis dari InnoDB buffer pool (memori) untuk sistem Operasi cache
tidak benar-benar ditulis ke disk storage (penyimpanan permanen). Dalam kasus kegagalan, pada kasus terburuk, anda mungkin kehilangan data hingga satu detik)
Kinerja gain tergantung pada lingkungan dan anda dapat menguji dan mengidentifikasi. Dalam lingkungan replikasi, untuk keamanan data dan konsistensi, set innodb_flush_log_trx_commit = 1
dan sync_binlog=1
.
Jika kinerja adalah tujuan utama dari aplikasi, InnoDB menyediakan sebuah variabel untuk mengontrol frekuensi log flushing - innodb_flush_log_at_timeout
- yang memungkinkan anda mengatur log flushing rentang frekuensi dari 1 2700 detik
, secara default adalah 1.
Diketahui, ketika anda meningkatkan flushing interval sampai dengan N detik, keuntungan kinerja dilengkapi dengan kompromi pada keamanan data ke N detik. Misalnya - jika anda mengatur pembilasan terjadi pada setiap 5 detik - throughput gain yang sangat tinggi, tapi dalam kasus kegagalan daya atau sistem crash, anda akan kehilangan data bernilai 5 detik .
Artikel ini membahas tentang InnoDB pembilasan dan transaksi commit operasi.
Anda dapat mengubah setelah anda melakukan mode 2 pada aws rds:
Unmodifiable dalam beberapa kasus seperti jika anda memiliki replikasi multi a-z:
Jika hardware anda gagal, anda dapat kehilangan semua data anda, jadi saya menggunakan param = 2 tanpa ada kekhawatiran. Pokoknya anda dapat membagi anda sensitif (order, uang virtual,...) dan regular (statistik, keranjang,...) data antara 2 db server dan menjaga mereka tetap aman dan cepat. Untuk transaksi antara database yang dapat anda gunakan http://dev.mysql.com/doc/refman/5.7/en/xa.html