Pembelajaran yang disyorkan: tutorial video mysql
REDO LOG dipanggil redo log After pelayan MySQL secara tiba-tiba ranap atau jatuh, ia dijamin bahawa transaksi yang diserahkan diteruskan ke cakera (persistence).
InnoDB mengendalikan rekod dalam unit halaman Penambahan, pemadaman, pengubahsuaian dan pertanyaan akan memuatkan keseluruhan halaman ke dalam kumpulan penimbal (cakera -> memori Operasi pengubahsuaian dalam transaksi tidak mengubah suai data secara langsung). Sebaliknya, data dalam kumpulan penimbal dalam ingatan diubah suai terlebih dahulu, dan benang latar belakang menyegarkannya ke cakera sekali-sekala.
Kolam penimbal: Ia boleh menyimpan indeks dan data, mempercepatkan membaca dan menulis, mengendalikan halaman data secara terus dalam ingatan dan mempunyai urutan khusus untuk menulis halaman kotor dalam kumpulan penimbal ke cakera.
Mengapa tidak mengubah suai terus data pada cakera?
Kerana jika anda mengubah suai data cakera secara langsung, ia adalah IO rawak Data yang diubah suai diedarkan di lokasi yang berbeza pada cakera dan perlu dicari ke belakang dan ke belakang, kadar hit adalah rendah, penggunaan adalah tinggi, dan pengubahsuaian kecil tidak boleh dilakukan Keseluruhan halaman tidak dimuat semula ke cakera, dan kadar penggunaan adalah rendah; cakera, jadi proses carian ditinggalkan dan masa carian disimpan.
Menggunakan benang latar belakang untuk menyegarkan cakera pada frekuensi tertentu boleh mengurangkan kekerapan IO rawak dan meningkatkan daya pemprosesan Ini adalah sebab asas untuk menggunakan kumpulan penimbal.
Masalah dengan mengubah suai memori dan kemudian menyegerakkannya secara tidak segerak ke cakera:
Oleh kerana kumpulan penimbal ialah kawasan dalam memori, data mungkin hilang jika sistem ranap secara tidak dijangka, dan beberapa data kotor mungkin tidak dimuat semula dalam masa Cakera, ketahanan transaksi tidak dijamin. Oleh itu, buat semula log diperkenalkan. Apabila mengubah suai data, log tambahan direkodkan, yang menunjukkan bahawa offset xx halaman xx telah berubah sebanyak xx Apabila sistem ranap, ia boleh dipulihkan berdasarkan kandungan log.
Perbezaan antara menulis log dan menyegarkan cakera secara langsung ialah: menulis log ialah menambah penulisan, IO berjujukan, lebih pantas dan kandungan bertulis lebih kecil
Log buat semula terdiri daripada dua bahagian :
buat semula penimbal log (tahap memori, lalai 16M, boleh diubah suai melalui parameter innodb_log_buffer_size)Langkah 1: Mula-mula baca data asal daripada cakera ke dalam memori, ubah suai salinan memori data dan jana data kotor
Langkah 2: Jana log buat semula dan tuliskannya ke dalam penimbal log buat semula, yang merekodkan nilai data yang diubah suai
Langkah 3: Secara lalai, selepas transaksi dilakukan, Kandungannya dimuatkan semula ke fail log buat semula, dan fail log buat semula dilampirkan
Langkah 4: Sentiasa menyegarkan semula data yang diubah suai dalam memori ke cakera (di sini kita bercakap tentang data yang belum. telah disegarkan semula oleh benang latar belakang dalam masa Data kotor pada cakera)
Apa yang biasanya dipanggil Log Tulis Ke Hadapan (ketekalan pra-log) merujuk kepada mengekalkan halaman log yang sepadan dalam ingatan sebelum meneruskan halaman data.
Faedah log buat semula:
Kekerapan muat semula cakera dikurangkanTidak semestinya ini bergantung pada strategi penyiraman semula log, kerana penimbal log buat semula juga berada dalam ingatan Jika transaksi diserahkan, penimbal semula log belum sempat memuat semula data ke log semula fail untuk kegigihan, jika masa henti berlaku pada masa ini, data masih akan hilang. Bagaimana untuk menyelesaikannya? Strategi sapuan.
strategi siram semula log
Oleh kerana terdapat selang 1s, 1 saat data akan hilang dalam kes yang paling teruk. Nilai
ialah 1:
Apabila membuat komitmen, anda perlu menyegarkan semula penimbal log buat semula secara aktif ke fail log buat semula. Tetapi kecekapan adalah yang paling teruk.
Jika nilai ialah 2: ia ditentukan mengikut os.
Boleh dilaraskan kepada 0 atau 2 untuk meningkatkan prestasi transaksi, tetapi ciri ACID hilang
Buat asal log digunakan untuk memastikan atomicity dan konsistensi transaksi. Ia mempunyai dua fungsi: ① Menyediakan operasi rollback ② MVVC kawalan berbilang versi
Operasi rollback
Seperti yang dinyatakan dalam log buat semula tadi, benang latar belakang akan menyegarkan semula data dalam kumpulan penimbal dari masa ke masa ke masa.
MVVC
Apabila baris baca dikunci oleh transaksi lain, ia boleh menganalisis versi data sebelumnya bagi rekod baris daripada log buat asal, supaya pengguna boleh membacanya Kepada data sebelum operasi transaksi semasa - baca gambar.
Bacaan syot kilat: Data yang dibaca oleh SQL ialah versi sejarah, tiada penguncian diperlukan, SELECT biasa ialah bacaan syot kilat.
Komponen log buat asal:
Operasi pilih tidak akan menjana log asal
Dalam enjin storan InnoDB, log buat asal menggunakan segmen gulung balik segmen untuk storan , setiap segmen rollback mengandungi 1024 segmen log asal. Selepas MySQL5.5, terdapat sejumlah 128 segmen rollback. Iaitu, sejumlah 128 * 1024 operasi buat asal boleh direkodkan.
Setiap urus niaga hanya akan menggunakan satu segmen gulung balik dan satu segmen gulung balik mungkin menyediakan berbilang transaksi pada masa yang sama.
Log buat asal tidak boleh dipadamkan serta-merta selepas transaksi diserahkan. Sesetengah transaksi mungkin mahu membaca versi data sebelumnya (dibaca gambar). Oleh itu, apabila transaksi dilakukan, log buat asal dimasukkan ke dalam senarai terpaut, dipanggil rantaian versi Sama ada log buat asal dipadamkan atau tidak dinilai oleh benang yang dipanggil pembersihan.
buat asal log terbahagi kepada:
masukkan buat asal log
Kerana rekod operasi sisipan hanya boleh dilihat oleh transaksi itu sendiri dan tidak kepada transaksi lain. Ia boleh dilihat (ini adalah keperluan pengasingan transaksi), jadi log batal boleh dipadamkan terus selepas transaksi dilakukan. Tiada operasi pembersihan diperlukan.
kemas kini log asal
kemas kini log asal merekodkan log buat asal yang dijana oleh operasi pemadaman dan kemas kini. Log buat asal mungkin perlu menyediakan mekanisme MVCC, jadi ia tidak boleh dipadamkan apabila transaksi dilakukan. Apabila menyerahkan, masukkannya ke dalam senarai log batal dan tunggu benang pembersihan melakukan pemadaman terakhir.
Andaikan terdapat 2 nilai, A=1 dan B=2, dan kemudian transaksi mengubah suai A kepada 3 dan B kepada 4. Proses pengubahsuaian Boleh dipermudahkan kepada:
Jika ia turun antara 8-9, anda boleh memilih untuk melancarkan semula selepas pemulihan, atau anda boleh memilih untuk meneruskan penyerahan transaksi, kerana log buat semula telah berterusan pada masa ini.1.mulakan
2. Rekod A=1 untuk membuat asal log
3.kemas kini A=3
4 5. Rekod B=2 untuk membatalkan log
6.kemas kini B=4
7 Rekod B=4 untuk membuat semula log
8 🎜>
Jika sistem turun dalam mana-mana langkah langkah 1-8 dan transaksi tidak dilakukan, urus niaga itu tidak akan memberi kesan kepada data pada cakera.
Untuk enjin InnoDB, sebagai tambahan kepada data rekod itu sendiri, setiap rekod baris juga mempunyai beberapa Lajur tersembunyi :
DB_ROW_ID∶Id kunci utama rekod. DB_TRX_ID: ID Transaksi Apabila rekod diubah suai, ID transaksi akan direkodkan.begin; INSERT INTO user (name) VALUES ('tom');
Data yang dimasukkan akan menjana log buat asal sisipan dan penuding balik data akan menghala kepadanya. Log buat asal akan merekodkan nombor siri log buat asal, lajur dan nilai kunci utama yang dimasukkan... Kemudian apabila melakukan rollback, data yang sepadan boleh dipadamkan terus melalui kunci utama.
Apabila kami melaksanakan KEMASKINI:
Log buat asal kemas kini akan dijana untuk operasi kemas kini dan ia akan dibahagikan kepada yang mengemas kini kunci utama dan yang tidak. Andaikan Sekarang laksanakan:
UPDATE user SET name='Sun' WHERE id=1;
Pada masa ini, rekod log asal baharu akan ditambahkan pada rantaian versi, no buat asalnya ialah 1 , dan respons log buat asal baharu Penunjuk gulung akan menghala ke log buat asal lama (buat asal tidak=0).
Andaikan anda melaksanakan sekarang:
UPDATE user SET id=2 WHERE id=1;
Untuk operasi mengemas kini kunci utama, tanda pemadam data asal akan dibuka dahulu , tiada sebenar Apabila memadam data, pemadaman sebenar akan diserahkan kepada benang pembersihan untuk menilai, dan kemudian sekeping data baharu akan dimasukkan kemudian Data baharu juga akan menjana log batal, dan nombor jujukan batal log akan dinaikkan.
Anda boleh mendapati bahawa setiap perubahan pada data akan menjana log buat asal Apabila rekod ditukar beberapa kali, berbilang log buat asal akan dijana log sebelum perubahan, dan Nombor jujukan setiap log buat asal semakin meningkat, jadi apabila anda ingin berpatah balik, tolak ke hadapan mengikut nombor urutan untuk mencari data asal kami.
Mengambil contoh di atas, dengan mengandaikan pemulangan semula dilaksanakan, proses yang sepadan hendaklah seperti berikut:
1 daripada 3 memadamkan data dengan id=2
2 Log undo no=2 memulihkan tanda padam data id=1 kepada 0
3 1 Log memulihkan nama data dengan id=1 kepada Tom
4 Padamkan data dengan id=1 melalui log batal no=0
kawalan konkurensi berbilang versi MySQL MVVC.
binlog ialah log binari, fail log binari, juga dipanggil log perubahan (log kemas kini). Ia merekodkan semua kenyataan kemas kini yang dilaksanakan oleh pangkalan data.
Senario aplikasi utama binlog:
show variables like '%log_bin%';
Lihat log tong:
mysqlbinlog -v "/var/lib/mysql/binlog/xxx.000002"
Gunakan log untuk memulihkan data:
mysqlbinlog [option] filename|mysql –uuser -ppass;
Padam log binari:
PURGE {MASTER | BINARY} LOGS TO ‘指定日志文件名' PURGE {MASTER | BINARY} LOGS BEFORE ‘指定日期'
Semasa pelaksanaan urus niaga, log pertama kali ditulis ke cache log bin, dan apabila transaksi diserahkan, cache binlog ditulis ke fail binlog. Oleh kerana binlog transaksi tidak boleh dipecahkan, tidak kira betapa besar transaksi itu, ia mesti ditulis sekali, jadi sistem akan memperuntukkan blok memori kepada setiap utas sebagai cache binlog.
Dua fokus juga berbeza Log Redo memberikan InnoDB keupayaan untuk pulih daripada ranap sistem, dan binlog memastikan ketekalan data seni bina kelompok MySQL.
Semasa pelaksanaan kenyataan kemas kini, dua log, log buat semula dan binlog, akan direkodkan Berdasarkan transaksi asas, log buat semula boleh ditulis secara berterusan semasa proses pelaksanaan transaksi Binlog hanya ditulis apabila transaksi dilakukan, jadi masa penulisan log semula dan binlog adalah berbeza.
Jika logik antara redo log dan binlog tidak konsisten, apakah masalah yang akan berlaku?
Ambil penyataan kemas kini sebagai contoh Andaikan bahawa untuk rekod dengan id=2, nilai medan c ialah 0. Kemas kini nilai medan c kepada 1. Pernyataan SQL ialah kemas kini T set c=1 di mana. id=2.
Andaikan selepas log buat semula ditulis semasa proses pelaksanaan, pengecualian berlaku semasa penulisan log binlog Apakah yang akan berlaku?
Kerana binlog. tidak ditulis Pengecualian berlaku pada penghujung Pada masa ini, tiada rekod pengubahsuaian yang sepadan dalam binlog. Oleh itu, apabila log binlog digunakan untuk memulihkan data atau hamba membaca binlog tuan, kemas kini ini akan ditinggalkan Nilai c baris yang dipulihkan ialah 0, dan nilai c baris ini dalam pangkalan data asal ialah 1 disebabkan oleh. pemulihan log buat semula Data akhir tidak konsisten.
Untuk menyelesaikan masalah ketekalan logik antara dua log, enjin storan InnoDB menggunakan skema komit dua fasa. Pisahkan log buat semula kepada dua langkah, sediakan dan komit, yang merupakan komit dua peringkat.
Biarkan penyerahan akhir log buat semula dan log bin diikat bersama Seperti yang dinyatakan sebelum ini, apabila transaksi dilakukan, secara lalai, log buat semula perlu disegerakkan terlebih dahulu sebelum komit berjaya, jadi jika mereka. terikat bersama, bin Log juga mempunyai ciri ini, yang memastikan bahawa data tidak akan hilang.
Selepas menggunakan komit dua fasa, pengecualian semasa menulis binlog tidak akan terjejas, kerana apabila MySQL memulihkan data berdasarkan log redo log, didapati log redo masih dalam peringkat penyediaan Dan jika tiada log binlog yang sepadan, penyerahan akan gagal dan data akan ditarik balik.
Dalam senario lain, pengecualian berlaku semasa fasa komit log buat semula Adakah urus niaga akan ditarik balik?
tidak akan melancarkan semula transaksi Ia akan melaksanakan logik yang dibingkai dalam gambar di atas Walaupun log buat semula berada dalam peringkat penyediaan, log binlog yang sepadan boleh ditemui melalui ID transaksi , jadi MySQL fikir ia sudah lengkap dan akan menyerahkan transaksi untuk memulihkan data.
Pembelajaran yang disyorkan: tutorial video mysql
Atas ialah kandungan terperinci Susunan khas log MySQL: buat semula log dan buat asal log. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!