İ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?
İ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:
İ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 log
seç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.
SET global general_log_file='c:/Temp/mysql.log';
SET global general_log = on;
SET global log_output = 'file';
İ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';
select * from mysql.general_log;
SET global general_log = 0;
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_log
son sorguları almak için tablomdan seçim yapabilirsiniz .
Sonra tail -f
mysql.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.
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;
/tmp/
, bunun gibi bir yerde bitmiş olabileceğini /tmp/systemd-private-...-mariadb.service-.../tmp/
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)
Ayrıca sorguları görmek için MySQL günlük dosyasını etkinleştirmek istedim ve bunu aşağıdaki talimatlarla çözdüm
/etc/mysql/mysql.conf.d
ve aşağıdaki satırları etkinleştirin
general_log_file = /var/log/mysql/mysql.log
general_log = 1
/etc/init.d/mysql restart
/var/log/mysql/
günlüklere git ve kontrol et// 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;
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
...
...
...
...
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.
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
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;
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 =1
Yanlış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
, .cnf
dosyayı 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.
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.
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.