informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Secara umum, MySQL dapat dibagi menjadi dua lapisan
mysql -h$ip -P$port -u$user -p
Mysql dalam perintah koneksi adalah alat klien yang digunakan untuk membuat koneksi dengan server.Setelah menyelesaikan jabat tangan TCP klasik, konektor
Ini akan mulai mengautentikasi identitas Anda. Saat ini, nama pengguna dan kata sandi yang Anda masukkan akan digunakan.
Jika klien tidak aktif terlalu lama, konektor akan memutuskan sambungannya secara otomatis. Kali ini dikontrol oleh parameter wait_timeout, dan nilai defaultnya adalah 8 jam.
Jika klien mengirimkan permintaan lagi setelah koneksi terputus, klien akan menerima pengingat kesalahan: Lost connection to MySQL server during query
. Jika Anda ingin melanjutkan saat ini, Anda perlu menyambungkan kembali dan kemudian menjalankan permintaan.
Dalam database, koneksi yang panjang berarti setelah koneksi berhasil, jika klien terus melakukan permintaan, koneksi yang sama akan selalu digunakan. Sambungan pendek berarti sambungan terputus setelah beberapa kueri dijalankan, dan sambungan baru dibuat kembali untuk kueri berikutnya.
Proses membuat koneksi biasanya rumit, jadi saya sarankan Anda mencoba meminimalkan tindakan membuat koneksi saat digunakan, yaitu coba gunakan koneksi yang panjang.
Namun setelah semua koneksi lama digunakan, Anda mungkin menemukan bahwa terkadang memori yang digunakan oleh MySQL meningkat dengan sangat cepatMemori yang digunakan sementara oleh MySQL selama eksekusi dikelola di objek koneksi. . Sumber daya ini akan dilepaskan ketika koneksi terputus.Jadi jikaAkumulasi koneksi yang lama dapat menyebabkan penggunaan memori yang berlebihan., dibunuh secara paksa oleh sistem (OOM). Dilihat dari fenomena tersebut, MySQL restart secara tidak normal.
Bagaimana cara mengatasi masalah ini? Anda dapat mempertimbangkan dua opsi berikut.
mysql_reset_connection
untuk menginisialisasi ulang sumber daya koneksi. Proses ini tidak memerlukan koneksi ulang dan verifikasi izin, namun akan mengembalikan koneksi ke keadaan saat baru saja dibuat.Setelah MySQL mendapat permintaan kueri, ia akan masuk ke cache kueri terlebih dahulu untuk melihat apakah pernyataan ini telah dieksekusi sebelumnya. Pernyataan yang dieksekusi sebelumnya dan hasilnya dapat disimpan dalam cache langsung di memori dalam bentuk pasangan nilai kunci. Kuncinya adalah pernyataan kueri, dan nilainya adalah hasil kueri. Jika kueri Anda dapat menemukan kunci secara langsung di cache ini, maka nilainya akan dikembalikan langsung ke klien.
Jika pernyataan tidak ada dalam cache kueri, tahap eksekusi dilanjutkan. Setelah eksekusi selesai, hasil eksekusi akan disimpan dalam cache query. Anda dapat melihat bahwa jika kueri mencapai cache, MySQL dapat langsung mengembalikan hasilnya tanpa melakukan operasi rumit selanjutnya, yang sangat efisien.
Namun seringkali saya akan melakukannyaDisarankan agar Anda tidak menggunakan cache kueri ,Mengapa? Karena cache kueri sering kali lebih banyak merugikan daripada menguntungkan.
Cache kueri sangat sering tidak valid. Selama ada pembaruan pada tabel, semua cache kueri pada tabel ini akan dihapus. Jadi mungkin saja Anda bersusah payah menyimpan hasilnya, dan bahkan sebelum Anda menggunakannya, hasilnya telah terhapus oleh pembaruan. Untuk database dengan tekanan pembaruan yang tinggi, tingkat hit cache kueri akan sangat rendah. Kecuali jika bisnis Anda memiliki tabel statis yang hanya akan diperbarui sekali dalam jangka waktu yang lama. Misalnya, jika tabel konfigurasi sistem, maka kueri pada tabel ini cocok untuk cache kueri.
Untungnya, MySQL juga menyediakan metode "use on demand" ini. Anda dapat mengatur parameter query_cache_type ke DEMAND sehingga cache kueri tidak digunakan untuk pernyataan SQL default. Untuk pernyataan yang Anda yakin ingin menggunakan cache kueri, Anda dapat menggunakan SQL_CACHE untuk menentukannya secara eksplisit, seperti pernyataan berikut:
select SQL_CACHE * from T where ID=10;
yang perlu diwaspadai adalah,Versi MySQL 8.0 langsung menghapus seluruh fungsi cache kueri, yang berarti fungsi ini tidak lagi tersedia mulai versi 8.0.
Jika cache kueri tidak tercapai, eksekusi pernyataan yang sebenarnya akan dimulai. Pertama, MySQL perlu mengetahui apa yang ingin Anda lakukan, sehingga perlu mengurai pernyataan SQL.
Entah apakah Anda masih ingat artikel "Kong Yiji". Manajer hotel memiliki papan berwarna merah muda yang khusus digunakan untuk mencatat catatan kredit para tamu. Jika tidak banyak orang yang membayar secara kredit, maka ia dapat menuliskan nama dan rekening nasabahnya di papan tulis. Namun jika terlalu banyak orang yang memiliki rekening kredit, akan selalu ada saatnya fan board tidak dapat melacaknya. Pada saat ini, penjaga toko harus memiliki buku besar yang khusus untuk mencatat rekening kredit.
Jika seseorang ingin melunasi kredit atau melunasi hutang, pemilik toko umumnya mempunyai dua pilihan:
Saat bisnis sedang booming dan konter sibuk, pemilik toko pasti akan memilihyang terakhir , karena operasi sebelumnya terlalu merepotkan. Pertama, Anda harus mencari catatan total rekening kredit orang tersebut. Coba pikirkan, ada puluhan halaman yang padat. Untuk menemukan namanya, penjaga toko mungkin harus memakai kacamata baca dan mencari perlahan. Setelah menemukannya, dia akan mengeluarkan sempoa untuk menghitung, dan akhirnya menulis kembali hasilnya buku besar.
Seluruh proses ini sulit untuk dipikirkan. Sebaliknya, lebih mudah untuk menuliskannya di papan berwarna merah muda terlebih dahulu. Coba pikirkan, jika penjaga toko tidak mendapat bantuan papan merah muda, dia harus membalik buku besar setiap kali dia mencatat akun.
Demikian pula, masalah ini juga terjadi di MySQL. Jika setiap operasi pembaruan perlu ditulis ke disk, dan disk juga harus menemukan catatan yang sesuai sebelum memperbarui, biaya IO dan biaya pencarian seluruh proses akan sangat tinggi. Untuk mengatasi masalah ini, para perancang MySQL menggunakan ide yang mirip dengan papan merah muda penjaga toko hotel untuk meningkatkan efisiensi pembaruan.
Seluruh proses kerjasama antara pink board dan ledger sebenarnya adalah apa yang sering disebutkan di MySQL. WAL
teknologi,WAL
Nama lengkapnya adalahWrite-Ahead Logging
, poin kuncinya adalahTulis log terlebih dahulu, lalu tulis ke diskArtinya, tulislah papan merah jambu terlebih dahulu, kemudian tulislah buku rekening bila tidak sedang sibuk.
Khususnya, ketika suatu catatan perlu diperbarui, mesin InnoDB pertama-tama akan menulis catatan tersebut ke log pengulangan (papan merah muda) dan memperbarui memori. Pada saat ini, pembaruan telah selesai. Pada saat yang sama, mesin InnoDB akan memperbarui catatan operasi ke disk pada waktu yang tepat, dan pembaruan ini sering kali dilakukan ketika sistem relatif menganggur, seperti yang dilakukan penjaga toko setelah penutupan.
Jika rekening kredit hari ini tidak banyak, pemilik toko dapat menunggu hingga waktu tutup untuk memilah barang. Namun apa yang harus kita lakukan jika pada hari tertentu rekening pulsa banyak dan papan merah mudanya penuh? Pada saat ini, penjaga toko harus meletakkan pekerjaannya, memperbarui beberapa catatan kredit di papan merah muda ke buku besar, dan kemudian menghapus catatan ini dari papan merah muda untuk memberi ruang bagi rekening baru.
Demikian pula, log ulang InnoDB memiliki ukuran tetap. Misalnya, dapat dikonfigurasi sebagai satu set 4 file, setiap file berukuran 1GB. Kemudian "papan merah muda" ini dapat merekam total operasi 4GB. Mulailah menulis dari awal, lalu kembali ke awal untuk menulis secara berulang-ulang, seperti terlihat pada gambar di bawah ini.
write pos adalah posisi record saat ini, bergerak mundur saat menulis. Setelah menulis ke akhir file No. 3, ia kembali ke awal file No. 0. Pos pemeriksaan adalah posisi saat ini yang akan dihapus, dan juga bergerak maju dan berulang. Sebelum menghapus catatan, catatan harus diperbarui ke file data.
Jarak antara pos tulis dan pos pemeriksaan adalah bagian kosong dari "papan merah muda" yang dapat digunakan untuk mencatat operasi baru. Jika pos tulis berhasil mencapai pos pemeriksaan, itu berarti "papan merah muda" sudah penuh, dan tidak ada pembaruan baru yang dapat dilakukan saat ini. Anda harus berhenti dan menghapus beberapa catatan terlebih dahulu untuk memajukan pos pemeriksaan.
Dengan redo log, InnoDB dapat memastikan bahwa meskipun database dimulai ulang secara tidak normal, catatan yang dikirimkan sebelumnya tidak akan hilangcrash-safe
。
Untuk memahami konsep aman dari kecelakaan, pikirkan contoh catatan kredit kita sebelumnya. Selama catatan kredit dicatat di papan merah muda atau ditulis di buku besar, meskipun kemudian pemilik toko lupa, seperti tiba-tiba menghentikan usahanya selama beberapa hari, dia tetap dapat mengklarifikasi rekening kredit tersebut melalui data di buku besar dan papan merah muda setelah melanjutkan bisnis.
Seperti yang kami katakan sebelumnya, MySQL secara keseluruhan sebenarnya memiliki dua bagian: satu adalah lapisan server, yang terutama melakukan hal-hal pada tingkat fungsional MySQL; yang lainnya adalah lapisan mesin, yang bertanggung jawab atas hal-hal spesifik yang berkaitan dengan penyimpanan.Papan merah muda yang kita bicarakan di atasredo log adalah log unik untuk mesin InnoDB,Dan Lapisan Server juga memiliki lognya sendiri, yang disebut binlog (log arsip)。
Saya rasa Anda akan bertanya, mengapa ada dua log?
Karena pada awalnya tidak ada mesin InnoDB di MySQL. Mesin MySQL sendiri adalah MyISAM, tetapi MyISAM tidak memiliki kemampuan anti-crash, dan log binlog hanya dapat digunakan untuk pengarsipan. InnoDB diperkenalkan ke MySQL dalam bentuk plug-in oleh perusahaan lain. Karena hanya mengandalkan binlog tidak memiliki kemampuan anti-crash, InnoDB menggunakan sistem log lain, yaitu redo log, untuk mencapai kemampuan anti-crash.
Kedua log ini memiliki tiga perbedaan berikut.
Dengan pemahaman konseptual tentang kedua log ini, mari kita lihat proses internal eksekutor dan mesin InnoDB saat menjalankan pernyataan pembaruan sederhana ini.
Di sini saya memberikan diagram alur eksekusi pernyataan pembaruan ini. Kotak terang pada gambar menunjukkan bahwa itu dijalankan di dalam InnoDB, dan kotak gelap menunjukkan bahwa itu dijalankan di eksekutor.
perbarui proses eksekusi pernyataan
Anda mungkin telah memperhatikan bahwa tiga langkah terakhir tampak agak "melingkar". Penulisan log ulang dibagi menjadi dua langkah: persiapan dan penerapan.
Mengapa perlu adanya “penyerahan dua tahap”?Hal ini untuk memungkinkan perbedaan antara kedua logkonsisten secara logis . Untuk menjelaskan masalah ini, kita harus mulai dengan pertanyaan di awal artikel: Bagaimana cara mengembalikan database ke keadaan setiap detik dalam waktu setengah bulan?
Seperti yang kami katakan sebelumnya, binlog akan mencatat semua operasi logis dan mengadopsi bentuk "tambahkan tulisan". Jika DBA Anda menjanjikan dapat dipulihkan dalam waktu setengah bulan, maka sistem pencadangan pasti akan menyimpan semua binlog dalam setengah bulan terakhir, dan sistem akan melakukan pencadangan rutin seluruh database. Yang "reguler" di sini tergantung pada pentingnya sistem, bisa sehari sekali atau seminggu sekali.
Ketika Anda perlu memulihkan ke detik tertentu, misalnya, pada pukul dua siang suatu hari, Anda menemukan bahwa sebuah tabel tidak sengaja terhapus pada siang hari, dan Anda perlu mengambil datanya, Anda dapat melakukan ini:
Oke, setelah membahas proses pemulihan data, mari kita kembali dan membahas mengapa log memerlukan "komit dua fase". Di sini kita sebaiknya menggunakan bukti dengan kontradiksi untuk menjelaskan.
Karena redo log dan binlog adalah dua logika independen, jika penerapan dua fase tidak digunakan, maka redo log harus ditulis terlebih dahulu lalu binlog harus ditulis, atau urutan sebaliknya harus digunakan. Mari kita lihat masalah apa saja yang ada pada kedua metode ini.
Masih menggunakan pernyataan update sebelumnya sebagai contoh. Asumsikan bahwa nilai bidang c pada baris saat ini dengan ID=2 adalah 0, dan anggaplah bahwa selama eksekusi pernyataan pembaruan, kerusakan terjadi setelah log pertama ditulis tetapi sebelum log kedua ditulis. Apa yang akan terjadi?
Anda mungkin berkata, apakah kemungkinan ini sangat rendah? Tidak ada situasi di mana perpustakaan sementara perlu dipulihkan kapan saja.
Sebenarnya tidak, proses ini tidak hanya diperlukan untuk memulihkan data setelah kesalahan pengoperasian. Ketika Anda perlu memperluas kapasitas, yaitu ketika Anda perlu membangun lebih banyak database cadangan untuk meningkatkan kapasitas baca sistem, praktik umum sekarang adalah menggunakan cadangan penuh dan menerapkan binlog untuk mencapai hal ini adalah ketidakkonsistenan antara database master dan slave online.
Sederhananya, redo log dan binlog dapat digunakan untuk mewakili status penerapan suatu transaksi, danPengajuan dua fase bertujuan untuk menjaga kedua negara tetap konsisten secara logis.。