Bagaimana saya bisa melacak permintaan MySQL di server Linux saya saat terjadi?
Misalnya saya ingin menyiapkan semacam pendengar, kemudian meminta halaman web dan melihat semua permintaan yang dieksekusi mesin, atau hanya melihat semua permintaan yang dijalankan di server produksi. Bagaimana saya bisa melakukan ini?
mysql
monitoring
barfoon
sumber
sumber
Jawaban:
Anda dapat menjalankan perintah MySQL
SHOW FULL PROCESSLIST;
untuk melihat permintaan apa yang sedang diproses pada waktu tertentu, tetapi itu mungkin tidak akan mencapai apa yang Anda harapkan.Metode terbaik untuk mendapatkan riwayat tanpa harus memodifikasi setiap aplikasi menggunakan server mungkin melalui pemicu. Anda bisa mengatur pemicu sehingga setiap kueri menjalankan hasil dalam kueri yang dimasukkan ke dalam semacam tabel riwayat, dan kemudian membuat halaman terpisah untuk mengakses informasi ini.
Perlu diketahui bahwa ini mungkin akan sangat memperlambat segala sesuatu di server, dengan menambahkan tambahan
INSERT
di atas setiap permintaan tunggal.Sunting: alternatif lain adalah General Query Log , tetapi dengan menuliskannya pada file datar akan menghapus banyak kemungkinan untuk fleksibilitas tampilan, terutama dalam waktu nyata. Jika Anda hanya ingin cara sederhana, mudah diimplementasikan untuk melihat apa yang terjadi, mengaktifkan GQL dan kemudian menggunakan menjalankan
tail -f
pada logfile akan melakukan trik.sumber
Anda dapat mencatat setiap kueri ke file log dengan sangat mudah:
Lakukan pertanyaan Anda (pada db apa pun). Grep atau periksa
/var/run/mysqld/mysqld.log
Maka jangan lupa
atau kinerjanya akan menurun dan disk Anda akan terisi!
sumber
tail -f -n300 /var/run/mysqld/mysqld.log
untuk melacak langsung file log AndaSELECT name FROM person where id=?
tetapi saya tidak tahu apaid
itu.SHOW VARIABLES
tidak bekerja untuk saya. NamunSELECT @@GLOBAL.general_log_file;
berfungsi dengan baik. (MariaDB 10.1.9)SHOW VARIABLES LIKE "log_output%"
. Jika diatur ketable
, maka log akan disimpan ke dalam database itu sendiri, tabelmysql.general_log
tidak dalam sistem file. Anda dapat mengubahnyafile
denganSET GLOBAL log_output = 'file';
Meskipun jawaban telah diterima, saya ingin menyampaikan apa yang mungkin menjadi pilihan paling sederhana:
Ini akan mencetak pertanyaan saat ini di layar Anda setiap detik.
-u
Pengguna mysql yang ingin Anda jalankan sebagai perintah-p
Meminta kata sandi Anda (jadi Anda tidak harus menyimpannya di file atau memiliki perintah muncul di riwayat perintah Anda)i
Interval dalam hitungan detik.--verbose
bendera untuk menampilkan daftar proses lengkap, menampilkan seluruh permintaan untuk setiap proses. (Terima kasih, nmat )Ada kemungkinan downside: kueri cepat mungkin tidak muncul jika mereka berjalan di antara interval yang Anda atur. IE: Interval saya disetel pada satu detik dan jika ada kueri yang membutuhkan
.02
detik untuk dijalankan dan dijalankan di antara interval, Anda tidak akan melihatnya.Gunakan opsi ini lebih disukai ketika Anda dengan cepat ingin memeriksa menjalankan kueri tanpa harus mengatur pendengar atau apa pun.
sumber
--verbose
untuk melihat kueri lengkapJalankan query SQL yang mudah ini untuk melihat menjalankan query MySQL. Itu dapat dijalankan dari lingkungan apa pun yang Anda suka, kapan pun Anda suka, tanpa ada perubahan kode atau overhead. Mungkin memerlukan beberapa konfigurasi izin MySQL, tetapi bagi saya itu hanya berjalan tanpa setup khusus.
Satu-satunya masalah adalah Anda sering melewatkan kueri yang dieksekusi dengan sangat cepat, sehingga sangat berguna untuk kueri yang berjalan lebih lama atau ketika server MySQL memiliki kueri yang mencadangkan - dalam pengalaman saya ini adalah waktu yang tepat ketika saya ingin melihat " pertanyaan "langsung".
Anda juga dapat menambahkan kondisi untuk membuatnya lebih spesifik sembarang query SQL.
mis. Menunjukkan semua permintaan berjalan selama 5 detik atau lebih:
mis. Tampilkan semua UPDATE yang sedang berjalan:
Untuk detail selengkapnya, lihat: http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html
sumber
Saya berada dalam situasi tertentu di mana saya tidak memiliki izin untuk menghidupkan logging, dan tidak akan memiliki izin untuk melihat log jika mereka dihidupkan. Saya tidak dapat menambahkan pemicu, tetapi saya memiliki izin untuk memanggil daftar proses tampilkan. Jadi, saya memberikan upaya terbaik dan membuat ini:
Buat skrip bash yang disebut "showsqlprocesslist":
Jalankan skrip:
Buntut keluaran:
Bingo bango. Meskipun tidak dibatasi, hanya membutuhkan 2-4% CPU pada kotak tempat saya menjalankannya. Saya harap mungkin ini membantu seseorang.
sumber
strace
Cara tercepat untuk melihat permintaan langsung MySQL / MariaDB adalah dengan menggunakan debugger. Di Linux Anda dapat menggunakan
strace
, misalnya:Karena ada banyak karakter yang lolos, Anda dapat memformat output strace dengan memipet (cukup tambahkan
|
antara dua satu-liner) di atas ke dalam perintah berikut:Jadi Anda akan melihat pertanyaan SQL yang cukup bersih tanpa waktu, tanpa menyentuh file konfigurasi.
Jelas ini tidak akan menggantikan cara standar untuk mengaktifkan log, yang dijelaskan di bawah ini (yang melibatkan memuat ulang server SQL).
dtrace
Gunakan probe MySQL untuk melihat permintaan langsung MySQL tanpa menyentuh server. Skrip contoh:
Simpan skrip di atas ke file (seperti
watch.d
), dan jalankan:Pelajari lebih lanjut: Memulai dengan DTracing MySQL
Gibbs MySQL Spyglass
Lihat jawaban ini .
Log
Berikut adalah langkah-langkah yang berguna untuk proposal pengembangan.
Tambahkan baris ini ke dalam
~/.my.cnf
atau global Andamy.cnf
:Jalur:
/var/log/mysqld.log
atau/usr/local/var/log/mysqld.log
mungkin juga berfungsi tergantung pada izin file Anda.kemudian restart MySQL / MariaDB Anda dengan (awalan dengan
sudo
jika perlu):Kemudian periksa log Anda:
Setelah selesai, perubahan
general_log
ke0
(sehingga Anda dapat menggunakannya di masa depan), kemudian hapus file dan me-restart SQL Server lagi:killall -HUP mysqld
.sumber
general_log
dari kueri MySQL. Itu akan mulai menulis ke file yanggeneral_log_file
menunjuk ke.Ini adalah pengaturan termudah pada mesin Linux Ubuntu yang saya temui. Gila melihat semua pertanyaan langsung.
Temukan dan buka file konfigurasi MySQL Anda, biasanya /etc/mysql/my.cnf di Ubuntu. Cari bagian yang mengatakan "Penebangan dan Replikasi"
Batalkan komentar pada variabel "log" untuk menghidupkan logging. Mulai ulang MySQL dengan perintah ini:
Sekarang kita siap untuk mulai memantau permintaan ketika mereka masuk. Buka terminal baru dan jalankan perintah ini untuk menggulir file log, menyesuaikan jalur jika perlu.
Sekarang jalankan aplikasi Anda. Anda akan melihat permintaan basis data mulai terbang di jendela terminal Anda. (pastikan Anda telah mengaktifkan scrolling dan history pada terminal)
DARI http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/
sumber
Dari baris perintah Anda dapat menjalankan:
Ganti nilai [x] dengan nilai Anda.
Atau lebih baik lagi:
sumber
Lihatlah mtop .
sumber
mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete.
mtop.sourceforge.net Terkadang cukup berguna.Saya sudah mencari untuk melakukan hal yang sama, dan telah mengumpulkan solusi dari berbagai posting, ditambah membuat aplikasi konsol kecil untuk menampilkan teks permintaan langsung seperti yang ditulis ke file log. Ini penting dalam kasus saya karena saya menggunakan Entity Framework dengan MySQL dan saya harus dapat memeriksa SQL yang dihasilkan.
Langkah-langkah untuk membuat file log (beberapa duplikasi posting lain, semuanya di sini untuk kesederhanaan):
Edit file yang terletak di:
Tambahkan "log = development.log" ke bagian bawah file. (Catatan menyimpan file ini mengharuskan saya untuk menjalankan editor teks saya sebagai admin).
Gunakan meja kerja MySql untuk membuka baris perintah, masukkan kata sandi.
Jalankan berikut ini untuk mengaktifkan pencatatan umum yang akan mencatat semua kueri yang dijalankan:
Ini akan menyebabkan kueri yang sedang berjalan ditulis ke file teks di lokasi berikut.
Buat / Jalankan aplikasi konsol yang akan menampilkan informasi log secara real time:
Sumber tersedia untuk diunduh di sini
Sumber:
sumber
Selain jawaban sebelumnya yang menjelaskan cara mengaktifkan pencatatan umum, saya harus memodifikasi satu variabel tambahan di instalasi vanilla MySql 5.6 saya sebelum SQL ditulis ke log:
Pengaturan default adalah 'NONE'.
sumber
Gibbs MySQL Spyglass
AgilData baru-baru ini meluncurkan Gibbs MySQL Scalability Advisor (alat swalayan gratis) yang memungkinkan pengguna untuk menangkap streaming langsung kueri yang akan diunggah ke Gibbs. Spyglass (yang merupakan Open Source) akan menonton interaksi antara Server MySQL Anda dan aplikasi klien. Tidak diperlukan konfigurasi ulang atau restart server database MySQL (baik klien atau aplikasi).
GitHub: AgilData / gibbs-mysql-spyglass
Pelajari lebih lanjut: Paket Menangkap MySQL dengan Rust
Instal perintah:
sumber