Bagaimana cara menampilkan kueri terakhir yang dijalankan di MySQL?

471

Apakah ada kueri / cara untuk menampilkan kueri terakhir yang dijalankan pada SEMUA server?

FerranB
sumber

Jawaban:

793

Bagi mereka yang diberkati dengan MySQL> = 5.1.12, Anda dapat mengontrol opsi ini secara global saat runtime:

  1. Menjalankan SET GLOBAL log_output = 'TABLE';
  2. Menjalankan SET GLOBAL general_log = 'ON';
  3. Lihatlah meja mysql.general_log

Jika Anda lebih memilih untuk menampilkan file daripada tabel:

  1. SET GLOBAL log_output = "FILE"; default .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Saya lebih suka metode ini daripada mengedit file .cnf karena:

  1. Anda tidak sedang mengedit my.cnf file dan berpotensi mengaktifkan pencatatan secara permanen
  2. Anda tidak memancing di sekitar filesystem mencari log kueri - atau bahkan lebih buruk, terganggu oleh kebutuhan untuk tujuan yang sempurna. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Anda tidak perlu me-restart server dan mengganggu koneksi saat ini.
  4. memulai kembali server membuat Anda memulai (log secara default masih mati)

Untuk informasi lebih lanjut, lihat Manual Referensi MySQL 5.1 - Variabel Sistem Server - general_log

FlipMcF
sumber
4
Desain UI hebat. Bagaimanapun, tabel log MySQL sebenarnya menggunakan mesin CSV sehingga Anda dapat melakukan semua yang dikatakan FlipMcF dalam jawaban tentang mengaktifkan logging ke tabel general_log, dan memiliki tail -f dari general_log seperti ini: tail -f / var / lib / mysql / mysql / general_log.CSV
2
sial, doc mysql untuk ini bahkan tidak menembak parameter tabel. Terima kasih banyak.
Abhishek Dujari
6
ingatlah untuk menghapus tabel log umum Anda ketika Anda selesai: "truncate table mysql.general_log"
pdwalker
1
Saya mendapatkan hasilnya dengan cara ini, tetapi parameter hadir dengan tanda tanya, misalnya, pilih foo dari bilah di mana x = ?. Bagaimana saya bisa mendapatkan kueri lengkap?
okwap
43

Anda dapat mengaktifkan log kueri umum untuk diagnostik semacam itu. Namun, umumnya Anda tidak mencatat semua kueri SELECT pada server produksi, itu adalah pembunuh kinerja.

Edit konfigurasi MySQL Anda, mis. /Etc/mysql/my.cnf - cari, atau tambahkan, baris seperti ini

[mysqld]
log = /var/log/mysql/mysql.log

Mulai ulang mysql untuk mengambil perubahan itu, sekarang Anda bisa

tail -f /var/log/mysql/mysql.log

Hai presto, Anda dapat menonton pertanyaan saat mereka masuk.

Paul Dixon
sumber
4
general_log_file dan general_log di my.cnf saya
Martin Thoma
Ini berfungsi jika Anda ingin tahu me-restart mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar
1
Versi Mac OS X yang lebih baru (setidaknya di Mac OS X) memerlukan opsi general_log_file dan general_log alih-alih hanya "log =". Jika tidak, Anda mendapatkan kesalahan seperti ini: ERROR / usr / local / mysql / bin / mysqld: opsi ambigu '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth
@ JaySheth, saya mendapatkan kesalahan itu di Mariadb 10.2, jadi saya tidak yakin itu hanya terkait Mac OS.
user10089632
16

Anda dapat melakukan hal yang mengalir untuk memantau log kueri mysql.

Buka file konfigurasi mysql my.cnf

sudo nano /etc/mysql/my.cnf

Cari baris berikut di bawah [mysqld]judul dan batalkan komentar pada baris ini untuk mengaktifkan log

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Mulai ulang server mysql Anda untuk mencerminkan perubahan

sudo service mysql start

Pantau log server mysql dengan perintah berikut di terminal

tail -f /var/log/mysql/mysql.log
Rokibul Hasan
sumber
15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;
zloctb
sumber
9

1) Jika logging mysql umum diaktifkan maka kita dapat memeriksa pertanyaan dalam file log atau tabel berdasarkan apa yang telah kita sebutkan dalam konfigurasi. Periksa apa yang diaktifkan dengan perintah berikut

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Jika kita membutuhkan histori query dalam tabel maka

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Lihatlah tabel mysql.general_log

Jika Anda lebih memilih untuk menghasilkan file:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) Kami juga dapat memeriksa kueri di file .mysql_history cat ~ / .mysql_history

minhas23
sumber
4

Mungkin Anda bisa mengetahuinya dengan melihat log kueri .

cherouvim
sumber
4

Jika mysql binlog diaktifkan, Anda dapat memeriksa perintah yang dijalankan oleh pengguna dengan menjalankan perintah berikut di konsol linux dengan menelusuri ke direktori mysql binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

memungkinkan

[mysqld]
log = /var/log/mysql/mysql.log

atau log umum akan berpengaruh pada kinerja mysql

Avinash Singh
sumber
mungkin, tetapi menyakitkan. lebih berguna jika Anda ingin melihat apa yang terjadi di masa lalu.
pdwalker
2

Jika Anda tidak ingin mengubah konfigurasi MySQL, Anda dapat menggunakan profiler SQL seperti "Neor Profile SQL" http://www.profilesql.com .

Bitclaw
sumber
2

Setelah membaca jawaban Paul, saya terus menggali informasi lebih lanjut tentang https://dev.mysql.com/doc/refman/5.7/en/query-log.html

Saya menemukan kode yang sangat berguna oleh seseorang. Inilah ringkasan konteksnya.

(Catatan: Kode berikut bukan milik saya)

Script ini adalah contoh untuk menjaga tabel tetap bersih yang akan membantu Anda mengurangi ukuran tabel Anda. Seperti setelah sehari, akan ada sekitar 180 ribu permintaan log. (dalam file, itu akan menjadi 30MB per hari)

Anda perlu menambahkan kolom tambahan (event_unix) dan kemudian Anda dapat menggunakan skrip ini untuk menjaga log tetap bersih ... itu akan memperbarui timestamp menjadi timest-Unix, menghapus log lebih tua dari 1 hari dan kemudian memperbarui event_time ke Timestamp dari event_unix ... kedengarannya agak membingungkan, tapi ini bekerja dengan baik.

Perintah untuk kolom baru:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Skrip pembersihan:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Penghargaan diberikan kepada Sebastian Kaiser (Penulis asli kode).

Semoga seseorang akan merasakan manfaatnya seperti saya.

Dev Aggarwal
sumber
Menarik. Anda akan melewatkan pertanyaan selama pembersihan kecuali Anda mengunci semua db terlebih dahulu. Ada masalah lain yang mungkin muncul di sini. Jika kita sampai pada tahap logging terus menerus, saya akan menggunakan logging file atau log bin dan rotator log off-the-shelf.
FlipMcF
1

Anda dapat melihat yang berikut ini di linux

cd /root

ls -al

vi .mysql_history Ini mungkin membantu

Avinash Singh
sumber
6
Sepertinya ini hanya akan berfungsi untuk klien mysql baris perintah resmi, dan hanya untuk permintaan yang dijalankan oleh pengguna root
golimar
Pertanyaan mengatakan 'semua server' yang membuat jawaban ini salah. Ini akan menampilkan semua permintaan yang dijalankan oleh satu klien.
FlipMcF
Jika mysql binlog diaktifkan, Anda dapat memeriksa perintah yang dijalankan oleh pengguna dengan menjalankan perintah berikut di konsol linux dengan meramban direktori mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql mengaktifkan [mysqld] log = / var / log / mysql / mysql.log atau genral log akan berpengaruh pada kinerja mysql
Avinash Singh
Beberapa entri dalam hal ini ditekan secara default, string yang berisi "kata sandi" misalnya.
mckenzm