MySQL Sorgu Günlüğü nasıl etkinleştirilir?


252

İstemcilerden alınan her SQL sorgu deyimini ve bu sorgu deyiminin gönderildiği zamanı günlüğe kaydeden MySQL işlevini nasıl etkinleştiririm? Bunu phpmyadmin veya NaviCat ile yapabilir miyim? Günlüğü nasıl analiz ederim?

Yanıtlar:


302

İlk olarak, bu günlük dosyasının meşgul bir sunucuda çok büyüyebileceğini unutmayın.

MySQL <5.1.29 için:

Sorgu günlüğünü etkinleştirmek için bu koymak /etc/my.cnfüzere [mysqld]bölümde

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

Ayrıca, MySQL konsolundan etkinleştirmek için

SET general_log = 1;

Bkz. Http://dev.mysql.com/doc/refman/5.1/en/query-log.html

MySQL 5.1.29+ için

MySQL 5.1.29+ ile logseçenek kullanımdan kaldırılmıştır. Günlük dosyasını belirtmek ve günlüğe kaydetmeyi etkinleştirmek için, bunu [mysqld]bölümdeki my.cnf dosyasında kullanın :

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

Alternatif olarak, MySQL konsolundan günlük kaydını açmak için (ayrıca günlük dosyasının konumunu bir şekilde belirtmeli veya varsayılan konumu bulmalıdır):

SET global general_log = 1;

Ayrıca yalnızca yavaş sorguları veya dizin kullanmayanları günlüğe kaydetmek için ek seçeneklerin bulunduğunu unutmayın.


1
Bu MySQL 5.6.19'da çalışmıyor. Tekrar değiştirdiler mi?
Alex R

5
general_log = on general_log_file = / path / to / query.log benim için çalıştı
Kiren Siva

27
Bu (Windows üzerinde MySQL 5.6.12) benim için çalıştı:SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
Youen

Günlük dosyası için mysql kullanıcı erişim izinlerinin olduğundan emin olun, yoksa MySQL konsolunda general_log parametresini ayarlarken bir 'bulunamadı' hatası döndürür
Will R.

5.6.22 @youen için tam olarak doğru. Teşekkürler! Emin olmak için tek şey yazılan dizin ve dosya var ve mysql tarafından yazılabilir olmasıdır.
NightOwlPrgmr

190

İlgili başka bir sorunun bu cevabına bir göz atın. Yeniden başlatmadan canlı sunuculardaki günlüklerin nasıl etkinleştirileceğini, devre dışı bırakılacağını ve görüntüleneceğini gösterir.

MySQL'de tüm sorguları günlüğe kaydet


İşte bir özet:

MySQL sunucusunu istemiyorsanız veya yeniden başlatamıyorsanız, çalışan sunucunuzda şu şekilde devam edebilirsiniz:

  • Günlük tablolarınızı oluşturun ( cevaba bakın )

  • Veritabanında Sorgu günlüğünü etkinleştir ('table' dizesinin tam anlamıyla yerleştirilmesi ve herhangi bir tablo adıyla değiştirilmemesi gerektiğini unutmayın. Teşekkürler Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Günlüğü görüntüle
select * from mysql.general_log;
  • Veritabanında sorgu günlüğünü devre dışı bırak
SET global general_log = 0;

19
'Tablonun' kelimenin tam anlamıyla girilmesi gerektiği ve veritabanınızdaki bir tablo adıyla değiştirilmediğine dikkat edilmelidir.
Nicholas Pickering

1
Mac OS X'te, MySQL yazılım yükleyicisi CSV türüyle general_log tablosunu otomatik olarak oluşturmuş gibi görünüyor. Bu, karşılık gelen CSV dosyasını da kuyruklayabileceğim anlamına gelir: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

Ayarladıktan sonra global log_output = 'table'; sorgu bir dosyaya yazılacak mı? SET global general_log = 0 sonra düşünüyorum; önceki 'log_output' değerini ayarlamanız gerekir, bu 'FILE' olabilir
user2602807 27:16

59

Farklı sayfa yüklemelerini hızlı bir şekilde optimize etmek istediğimde bu yöntemi günlük kaydı için kullanıyorum. Küçük bir ipucu ...

TABLO'ya giriş

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

Daha sonra mysql.general_logson sorguları almak için tablomdan seçim yapabilirsiniz .

Sonra tail -fmysql.log benzer bir şey yapabilirsiniz , ancak daha fazla ayrıntı ile ...

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"

Bu, deneyip kesebileceğim sorgularımı görmeyi kolaylaştırıyor. Yalnızca son 8 saniye içinde yürütülen sorguları almak için 8 saniye aralık kullanıyorum.


57

Bu zaten bir yorumdaydı, ancak kendi cevabını hak ediyor: Yapılandırma dosyalarını düzenlemeden: mysql'de, root olarak

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

Daha sonra kapatmayı unutmayın:

SET global general_log = off;

1
Linux systemd altında, bir dosyaya giriş yapmaya çalışırsanız /tmp/, bunun gibi bir yerde bitmiş olabileceğini /tmp/systemd-private-...-mariadb.service-.../tmp/
buldum

15

Genel sorgu günlüğünü (tüm sorguları kaydeden) devre dışı bırakabilir veya etkinleştirebilirsiniz.

SET GLOBAL general_log = 1 # (or 0 to disable)

Benim durumumda, genel sorgu günlüğü paylaşılan barındırma sunucularında etkinleştirilemez. Yalnızca yavaş sorgu günlüğünü etkinleştirebilirim ve sistem yöneticileri hesabımla ilgili girdileri istek üzerine sağlayabilir.
Feng-Chun Ting

9

Ayrıca sorguları görmek için MySQL günlük dosyasını etkinleştirmek istedim ve bunu aşağıdaki talimatlarla çözdüm

  1. Adresine git /etc/mysql/mysql.conf.d
  2. mysqld.cnf dosyasını açın

ve aşağıdaki satırları etkinleştirin

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. MySQL'i bu komutla yeniden başlat /etc/init.d/mysql restart
  2. /var/log/mysql/günlüklere git ve kontrol et

MySQL her başlatıldığında uygulanabilmesi için bu ayarları conf dosyasına kaydetmeniz uygundur, ancak bu yapılandırmayı uygulamak için MySQL'i yeniden başlatmanız gerekmez. Diğerlerinin söylediği gibi 'SET global' kullanarak ayarlayabilirsiniz.
Angel

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; 

3

Windows'da şu adrese gidebilirsiniz:

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

Bu satırı my.ini dosyasına ekle

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

My.ini dosya nihayet şuna benzer

...
...
...    
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
...
...
...
...

3

MySQL 5.6 sürümünde hata var. MySQL bile şöyle gösterir:

    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 

Gerçek ayarlar aşağıdaki sırayla okunuyor:

    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

Dosyayı kontrol edin: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Umarım birine yardım eder.


Bu hata için bir yerde bir hata raporu var mı?
mwfearnley

1

için > = 5,5 MySQL sadece yavaş sorguları için (1 saniye ve daha fazla) 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

1
Bu yanlış - sorgu günlüğünü değil, yavaş sorgu günlüğünü etkinleştirir.
Sam Dufel

Bence tire kullanmalısın.
AFA Med

1

MAC Machine'de sorgu günlüğünü etkinleştirmek için:

Aşağıdaki dosyayı açın:

vi /private/etc/my.cnf

'Mysqld' bölümü altında sorgu günlüğü URL'sini aşağıdaki gibi ayarlayın:

[mysqld]

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

Birkaç makine sorguyu düzgün bir şekilde günlüğe kaydetmiyor, bu durumda MySQL konsolundan etkinleştirebilirsiniz

mysql> SET global general_log = 1;

1

Sorunun cevabı tam olarak değil, çünkü sorunun zaten büyük cevapları var. Bu bir yan bilgi. General_log'un etkinleştirilmesi gerçekten MySQL performansına büyük önem verir. general_log =1Yanlışlıkla bir üretim sunucusundan ayrıldım ve performansın neden diğer sunuculardaki benzer bir kurulumla karşılaştırılamayacağını öğrenmek için saatler harcadım. Daha sonra bunu, genel günlük kaydını etkinleştirmenin etkisini açıklayan buldum. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Hikayenin özü general_log=1, .cnfdosyayı koyma . Bunun yerine set global general_log =1, kısa bir süre boyunca, ne bulmaya çalıştığınızı öğrenmek için yeterli giriş yapmak ve sonra kapatmak için kullanın.


0

PhpMyAdmin 4.0'da Durum> Monitör'e gidin. Burada yavaş sorgu günlüğünü ve genel günlüğü etkinleştirebilir, canlı bir monitör görebilir, grafiğin bir bölümünü seçebilir, ilgili sorguları görebilir ve analiz edebilirsiniz.


0

Genel günlüğü bir noktada bırakıp yeniden oluşturmak zorunda kaldım. Rekreasyon sırasında karakter setleri dağıldı ve günlüklerde bu hatayı aldım:

[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'

Dolayısıyla, "günlüğe kaydetmenin açık olduğundan emin olun" standart yanıtı sizin için işe yaramıyorsa, alanlarınızın doğru karakter kümesine sahip olduğundan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.