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

Di MySQL, mengapa aman mematikan innodb_support_xa untuk pembaruan utas tunggal?

Untuk memulai dengan...

http://yoshinorimatsunobu.blogspot.com/2009 /08/great-performance-effect-of-fixing.html

Sebelum Plugin InnoDB 1.0.4, itu seperti:

obtain mutex
  write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log and fsync, for commit-phase
release mutex

Pada dan setelah Plugin InnoDB 1.0.4 (dan MySQL 5.5), sekarang:

write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
obtain mutex
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log, for commit-phase
release mutex
fsync innodb log, for commit-phase

Seperti yang Anda lihat, di versi baru, tidak ada apa pun (kecuali jika sync_binlog> 0) disinkronkan di bagian kritis. Dengan begitu, komit grup sekarang berfungsi dan memastikan throughput bersamaan yang jauh lebih baik.

Misalnya, dengan versi "rusak" sebelumnya, jika Anda memiliki 100 utas komit bersamaan, semua fsync diserialkan dan Anda akan mendapatkan 100 fsyncs untuk persiapan dan 100 fsyncs lainnya untuk komit. Oleh karena itu, komit grup benar-benar rusak.

Sekarang dengan implementasi yang lebih baru, fsyncs dikelompokkan tergantung pada konkurensi transaksi, sambil memastikan pemesanan operasi antara log innodb dan binlog. Ini juga berarti bahwa jika hanya ada satu utas, tidak ada peningkatan kinerja.

Mengenai pertanyaan Anda bahwa, ketika crash terjadi setelah transaksi ditulis ke binlog, tetapi sebelum ditulis ke log transaksi - saya berada di halaman yang sama dengan Anda.

Jika server mogok sebelum langkah terakhir, ada kemungkinan kecil bahwa Anda memiliki perbedaan antara log innodb dan binlog (salah satu dapat mendahului yang lain), tetapi dijamin Anda memiliki semua informasi tentang apa yang harus periksa di log innodb, seperti yang dicatat dalam fase persiapan.

Namun, apa yang harus dilakukan dengan yang tidak berkomitmen masih nondeterministik. Misalnya, kecuali sync_binlog = 1 ada kemungkinan bahwa seorang budak menerima data tetapi belum sepenuhnya menyinkronkan binlog pada master. Anda tidak bisa hanya mengulang transaksi yang gagal karena mungkin sudah berjalan di salah satu slave.

Yang juga berarti, binlog bisa lebih pendek dari log innodb, mengembalikan "Log biner [nama_file] lebih pendek dari ukuran yang diharapkan." seperti yang dijelaskan dalam dokumen resmi, dan Anda harus membangun kembali slave dari awal. Sangat tidak ramah manusia.

http://dev.mysql.com/doc/refman /5.1/en/binary-log.html

Karena konsistensi dalam hal pemesanan operasi dijamin terlepas dari innodb_support_xa pengaturan (yang bertentangan dengan apa yang dikatakan dalam dokumen resmi di innodb_support_xa , mungkin karena itu ditulis tentang stok innodb 5.0.3 jauh sebelum perbaikan konkurensi), dan konsistensi antara log innodb pada master dan relai log pada budak tidak sepenuhnya dijamin bahkan dengan innodb_support_xa , saya tidak melihat ada gunanya menggunakan innodb_support_xa . Sangat menakutkan untuk tidak mengikuti rekomendasi resmi, namun tampaknya basi dan salah dalam banyak hal.

Saya ingin tahu apakah ada korelasi antara innodb_flush_log_at_trx_commit pengaturan dan innodb_support_xa perilaku ketika yang pertama disetel ke 2 atau 0.

Salah satu cara berpikir praktis adalah, failover ke slave aman - lagi pula, transaksi yang gagal adalah sesuatu yang ingin Anda selesaikan - tetapi jangan pernah gagal kembali untuk dikuasai, karena mungkin ada beberapa perbedaan dalam data. Anda harus sepenuhnya menyalin data dari budak, sebelum Anda membuat master menjadi budak baru. Dengan kata lain, ketika master crash, percayalah pada slave sejak saat itu - dengan begitu, Anda tidak perlu mengacaukan log innodb untuk pemulihan crash.

Perhatikan juga bahwa MySQL 5.5 mendukung replikasi semi-sinkron, sama seperti "trust the slave" - ​​mungkin Anda tertarik.

http://dev.mysql.com/doc/refman /5.5/en/replication-semisync.html




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah otorisasi awal di mysql

  2. Jumlah perkalian kolom untuk baris dengan ID serupa di MySQL

  3. Bagaimana saya bisa melihat/mengubah pengaturan batas waktu koneksi MySQL?

  4. Apakah mysqldump mendukung bilah kemajuan?

  5. Libpuzzle Mengindeks jutaan gambar?