MySQL üzerinde son sorgular nasıl gösterilir?


471

TÜM sunucularda yürütülen son sorguları göstermenin herhangi bir sorgusu / yolu var mı ?

Yanıtlar:


793

MySQL> = 5.1.12 ile kutsanmış olanlar için, bu seçeneği global olarak çalışma zamanında kontrol edebilirsiniz:

  1. gerçekleştirmek SET GLOBAL log_output = 'TABLE';
  2. gerçekleştirmek SET GLOBAL general_log = 'ON';
  3. Masaya bir göz at mysql.general_log

Tablo yerine dosyaya çıktı almayı tercih ediyorsanız:

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

Bu yöntemi .cnf dosyalarını düzenlemeyi tercih ederim çünkü:

  1. my.cnfdosyayı düzenlemiyorsunuz ve günlük kaydını kalıcı olarak açıyorsunuz
  2. sorgu günlüğünü arayan dosya sistemi etrafında balık tutmuyorsunuz - ya da daha da kötüsü, mükemmel hedef gereksiniminden rahatsız oluyorsunuz. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Sunucuyu yeniden başlatmanız ve sunucuyla olan mevcut bağlantıları kesmeniz gerekmez.
  4. sunucuyu yeniden başlatmak sizi başladığınız yerden bırakır (günlük varsayılan olarak hala kapalıdır)

Daha fazla bilgi için, bkz. MySQL 5.1 Başvuru Kılavuzu - Sunucu Sistemi Değişkenleri - general_log


4
Harika UI tasarımı. Her neyse, MySQL günlük tabloları aslında CSV motorunu kullanıyor, böylece FlipMcF'in general_log tablosuna giriş yapma ile ilgili cevapta söylediği her şeyi yapabilirsiniz ve bunun gibi general_log kuyruğuna sahip olabilirsiniz: tail -f / var / lib / mysql / mysql / general_log.CSV

2
kahretsin, bunun için mysql doc tablo parametresini bile çekmiyor. çok teşekkürler.
Abhishek Dujari


6
işiniz bittiğinde genel günlük tablonuzu temizlemeyi unutmayın: "truncate table mysql.general_log"
pdwalker

1
Bu şekilde sonucu aldım, ancak parametreler soru işareti ile mevcut, örneğin, x =? Sorgunun tamamını nasıl alabilirim?
okwap

43

Bu tür bir teşhis için genel bir sorgu günlüğü etkinleştirebilirsiniz . Genellikle tüm SELECT sorgularını bir üretim sunucusuna kaydetmezsiniz, bu bir performans katilidir.

MySQL yapılandırmanızı düzenleyin, örneğin /etc/mysql/my.cnf - böyle bir çizgi arayın veya ekleyin

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

Bu değişikliği almak için mysql'i yeniden başlatın, şimdi yapabilirsiniz

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

Hey presto, sorguları geldiklerinde izleyebilirsiniz.


4
my.cnf dosyamda general_log_file ve general_log
Martin Thoma

Eğer mysql yeniden başlatma bilmek istiyorsanız bu çalışır askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar

1
Mac OS X'in daha yeni sürümleri (en azından Mac OS X'te) yalnızca "log =" yerine general_log_file ve general_log seçeneklerini gerektirir. Aksi takdirde, şöyle bir hata alırsınız: ERROR / usr / local / mysql / bin / mysqld: belirsiz seçenek '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth

@JaySheth, Mariadb 10.2'de bu hatayı aldım, bu yüzden sadece Mac OS ile ilişkili olduğundan emin değilim.
user10089632

16

Mysql sorgu günlüklerini izlemek için akan şey yapabilirsiniz.

Mysql yapılandırma dosyasını açın my.cnf

sudo nano /etc/mysql/my.cnf

Bir [mysqld]başlık altında aşağıdaki satırları arayın ve günlüğü etkinleştirmek için bu satırları kaldırın

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

Yansımaları değiştirmek için mysql sunucunuzu yeniden başlatın

sudo service mysql start

Terminalde aşağıdaki komutla mysql sunucu günlüğünü izleyin

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

15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;

9

1) Genel mysql günlüğü etkinleştirilmişse, yapılandırmada bahsettiklerimize dayanarak günlük dosyasındaki veya tablodaki sorguları kontrol edebiliriz. Aşağıdaki komutla nelerin etkin olduğunu kontrol edin

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

Tabloda sorgu geçmişine ihtiyacımız varsa

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

Tabloya bir göz atın mysql.general_log

Bir dosyaya çıktı almayı tercih ediyorsanız:

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) .mysql_history dosya cat ~ / .mysql_history dosyasındaki sorguları da kontrol edebiliriz.



4

Eğer MySQL binlog kontrol edebilirsiniz etkindir komutları binlog dizini MySQL 'e göz atarak linux konsolunda aşağıdaki komutu yürüterek kullanıcı tarafından koştu

mysqlbinlog binlog.000001 >  /tmp/statements.sql

etkinleştirme

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

veya genel günlük mysql performansı üzerinde bir etkisi olacaktır


mümkün, ama acı verici. geçmişte neler olduğunu görmek istiyorsanız daha yararlı olur.
pdwalker


2

Paul'un cevabını okuduktan sonra, https://dev.mysql.com/doc/refman/5.7/en/query-log.html hakkında daha fazla bilgi için kazmaya devam ettim.

Bir kişi tarafından gerçekten kullanışlı bir kod buldum. İşte bağlamın özeti.

(Not: Aşağıdaki kod benim değil)

Bu komut dosyası, tablo boyutunu temizlemenize yardımcı olacak tabloyu temiz tutmak için bir örnektir. Bir günden sonra olduğu gibi, yaklaşık 180 bin günlük sorgu olacaktır. (bir dosyada günde 30 MB olur)

Ek bir sütun (event_unix) eklemeniz gerekir ve daha sonra günlüğü temiz tutmak için bu komut dosyasını kullanabilirsiniz ... event_unix ... biraz kafa karıştırıcı, ama harika çalışıyor.

Yeni sütun için komutlar:

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

Temizleme betiği:

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

Kredi Sebastian Kaiser'e (Kodun orijinal yazarı) gider.

Umarım biri benim yaptığım gibi yararlı bulur.


İlginç. Tüm db ilk kilitli sürece temizleme sırasında sorgu özledim. Burada ortaya çıkabilecek başka sorunlar da var. Bu 'sürekli' günlüğe kaydetmenin bu noktasındaysak, dosya günlüğünü veya depo günlüğünü ve hazır bir günlük döndürücüyü kullanırdım.
FlipMcF

1

Linux'ta aşağıdakilere bakabilirsiniz

cd /root

ls -al

vi .mysql_history Yardımcı olabilir


6
Bu, yalnızca resmi komut satırı mysql istemcisi ve yalnızca kök kullanıcı tarafından yürütülen sorgular için çalışır gibi görünüyor
golimar

Soru bu cevabı yanlış yapan 'tüm sunucu' diyor. Bu, tek bir istemci tarafından yürütülen tüm sorguları gösterir.
FlipMcF

Mysql binlog etkinse, mysql binlog dizinine mysqlbinlog binlog.000001> /tmp/statements.sql etkinleştirme [mysqld] log = / var / log / mysql / komutuna giderek linux konsolunda aşağıdaki komutu yürüterek kullanıcı tarafından çalıştırılan komutları kontrol edebilirsiniz. mysql.log veya genral log mysql performansı üzerinde etkili olacaktır
Avinash Singh

Buradaki bazı girişler zaten varsayılan olarak bastırılır, örneğin "parola" içeren dizeler.
mckenzm
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.