Bagaimana cara mengaktifkan MySQL Query Log?

252

Bagaimana cara mengaktifkan fungsi MySQL yang mencatat setiap pernyataan kueri SQL yang diterima dari klien dan waktu yang dikirimkan pernyataan kueri? Bisakah saya melakukannya di phpmyadmin atau NaviCat? Bagaimana cara menganalisis log?

Feng-Chun Ting
sumber

Jawaban:

301

Pertama, Ingat bahwa file log ini dapat tumbuh sangat besar di server yang sibuk.

Untuk mysql <5.1.29:

Untuk mengaktifkan log query, menempatkan ini di /etc/my.cnfdalam [mysqld]bagian

log   = /path/to/query.log  #works for mysql < 5.1.29

Juga, untuk mengaktifkannya dari konsol MySQL

SET general_log = 1;

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

Untuk mysql 5.1.29+

Dengan mysql 5.1.29+, logopsi ini tidak digunakan lagi. Untuk menentukan file log dan mengaktifkan logging, gunakan ini di my.cnf di [mysqld]bagian:

general_log_file = /path/to/query.log
general_log      = 1

Sebagai alternatif, untuk mengaktifkan pencatatan log dari konsol MySQL (juga harus menentukan lokasi file log, atau menemukan lokasi default):

SET global general_log = 1;

Perhatikan juga bahwa ada opsi tambahan untuk mencatat hanya permintaan yang lambat, atau yang tidak menggunakan indeks.

Gryphius
sumber
1
Ini tidak berfungsi di MySQL 5.6.19. Apakah mereka mengubahnya lagi?
Alex R
5
general_log = pada general_log_file = / path / to / query.log bekerja untuk saya
Kiren Siva
27
Ini bekerja untuk saya (MySQL 5.6.12 di Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
youen
Pastikan bahwa pengguna mysql mengakses izin untuk file log, atau itu akan mengembalikan kesalahan 'tidak ditemukan' ketika mengatur parameter general_log di konsol MySQL
Will R.
Untuk 5.6.22 @ Anda sudah benar. Terima kasih! Satu-satunya hal untuk memastikan bahwa direktori dan file yang sedang ditulis ada dan dapat ditulis oleh mysql.
NightOwlPrgmr
189

Lihatlah jawaban ini untuk pertanyaan terkait lainnya. Ini menunjukkan cara mengaktifkan, menonaktifkan, dan melihat log di server langsung tanpa memulai ulang.

Log semua kueri di mysql


Berikut ini ringkasannya:

Jika Anda tidak ingin atau tidak dapat memulai kembali server MySQL, Anda dapat melanjutkan seperti ini di server Anda yang sedang berjalan:

  • Buat tabel log Anda (lihat jawaban )

  • Aktifkan Pencatatan kueri pada basis data (Perhatikan bahwa string 'tabel' harus diletakkan secara harfiah dan tidak diganti dengan nama tabel apa pun. Terima kasih Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Lihat log
select * from mysql.general_log;
  • Nonaktifkan Log kueri pada database
SET global general_log = 0;
Alexandre Marcondes
sumber
19
Perlu dicatat bahwa 'tabel' dimaksudkan untuk dimasukkan secara harfiah, dan tidak diganti dengan nama tabel di database Anda.
Nicholas Pickering
1
Pada Mac OS X, penginstal perangkat lunak MySQL tampaknya secara otomatis membuat tabel general_log, dengan tipe CSV. Ini berarti bahwa saya juga dapat mengekor file CSV yang sesuai: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth
Setelah MENGATUR global log_output = 'table'; apakah permintaan lambat akan ditulis ke file? Saya pikir setelah SET general_log global = 0; Anda harus menetapkan nilai 'log_output' sebelumnya, kemungkinan menjadi 'FILE'
user2602807
59

Saya menggunakan metode ini untuk mencatat ketika saya ingin mengoptimalkan berbagai halaman dengan cepat. Ini sedikit tip ...

Masuk ke TABEL

SET global general_log = 1;
SET global log_output = 'table';

Anda kemudian dapat memilih dari menu saya mysql.general_log meja untuk mengambil pertanyaan terbaru.

Saya kemudian dapat melakukan sesuatu yang mirip dengan tail -fdi mysql.log, tetapi dengan lebih banyak perbaikan ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

Ini membuatnya mudah untuk melihat pertanyaan saya yang dapat saya coba dan kurangi. Saya menggunakan interval 8 detik untuk hanya mengambil kueri yang dieksekusi dalam 8 detik terakhir.

Layke
sumber
57

Ini sudah ada di komentar, tetapi pantas jawabannya sendiri: Tanpa mengedit file konfigurasi: di mysql, sebagai root, lakukan

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

Jangan lupa untuk mematikannya setelah itu:

SET global general_log = off;
Commonpike
sumber
1
Saya telah menemukan bahwa di bawah systemd Linux, jika Anda mencoba untuk login ke file /tmp/, mungkin berakhir di suatu tempat seperti/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley
15

Anda dapat menonaktifkan atau mengaktifkan log kueri umum (yang mencatat semua kueri)

SET GLOBAL general_log = 1 # (or 0 to disable)
Jon
sumber
Dalam kasus saya, log kueri umum tidak dapat diaktifkan di server hosting bersama. Saya hanya dapat mengaktifkan log permintaan lambat, dan administrator sistem dapat memberikan entri yang terkait dengan akun saya berdasarkan permintaan.
Feng-Chun Ting
9

Saya juga ingin mengaktifkan file log MySQL untuk melihat kueri dan saya telah menyelesaikan ini dengan instruksi di bawah ini

  1. Pergi ke /etc/mysql/mysql.conf.d
  2. buka mysqld.cnf

dan mengaktifkan garis di bawah ini

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. restart MySQL dengan perintah ini /etc/init.d/mysql restart
  2. pergi ke /var/log/mysql/dan periksa log
nyentrik
sumber
Tidak apa-apa untuk menyimpan pengaturan itu dalam file conf untuk diterapkan setiap kali MySQL dimulai, tetapi Anda tidak perlu me-restart MySQL untuk menerapkan konfigurasi ini. Anda dapat mengaturnya menggunakan 'SET global' seperti yang dikatakan orang lain.
Malaikat
6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 
Sameer Kumar Choudhary
sumber
3

Di Windows Anda bisa langsung ke

C:\wamp\bin\mysql\mysql5.1.53\my.ini

Masukkan baris ini di my.ini

general_log_file = c:/wamp/logs/mysql_query_log.log

File my.ini akhirnya terlihat seperti ini

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...
HimalayanCoder
sumber
3

Ada bug di versi MySQL 5.6. Bahkan mysqld tampil sebagai:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

Pengaturan sebenarnya membaca dalam urutan berikut:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

Periksa file: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Semoga ini bisa membantu seseorang.

croonx
sumber
Apakah ada laporan bug di suatu tempat untuk bug ini?
mwfearnley
1

untuk mysql> = 5,5 hanya untuk permintaan lambat (1 detik dan lebih) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes
lptn
sumber
1
Ini tidak benar - yang mengaktifkan log kueri lambat, bukan log kueri.
Sam Dufel
Saya pikir Anda harus menggunakan tanda hubung.
AFA Med
1

Untuk mengaktifkan log kueri di Mesin MAC:

Buka file berikut:

vi /private/etc/my.cnf

Setel url log kueri di bawah bagian 'mysqld' sebagai berikut:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

Beberapa mesin tidak mencatat kueri dengan benar, sehingga Anda dapat mengaktifkannya dari konsol MySQL

mysql> SET global general_log = 1;
Kumanan
sumber
1

Bukan jawaban yang tepat untuk pertanyaan itu karena pertanyaan itu sudah memiliki jawaban yang bagus. Ini adalah info sampingan. Mengaktifkan general_log benar-benar mengurangi kinerja MySQL. Saya meninggalkan general_log =1server produksi secara tidak sengaja dan menghabiskan waktu berjam-jam mencari tahu mengapa kinerja tidak sebanding dengan pengaturan serupa di server lain. Kemudian saya menemukan ini yang menjelaskan dampak mengaktifkan log umum. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Intinya, jangan dimasukkan ke general_log=1dalam .cnffile. Alih-alih gunakan set global general_log =1untuk jangka waktu singkat hanya untuk mencatat cukup untuk mencari tahu apa yang Anda cari dan kemudian mematikannya.

Allen King
sumber
0

Di phpMyAdmin 4.0, Anda pergi ke Status> Monitor. Di sana Anda dapat mengaktifkan log kueri lambat dan log umum, melihat monitor langsung, pilih sebagian grafik, lihat kueri terkait dan menganalisisnya.

Marc Delisle
sumber
0

Saya harus menjatuhkan dan membuat ulang log umum pada satu titik. Selama rekreasi, rangkaian karakter menjadi kacau dan saya akhirnya mengalami kesalahan ini dalam log:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

Jadi, jika jawaban standar "centang untuk memastikan penebangan aktif" tidak berfungsi untuk Anda, periksa untuk memastikan bidang Anda memiliki rangkaian karakter yang tepat.

William Neely
sumber