Canlı MySQL sorgularını nasıl görüntüleyebilirim?


493

Linux sunucumdaki MySQL sorgularını oldukları gibi nasıl izleyebilirim?

Örneğin, bir tür dinleyici kurmak, sonra bir web sayfası istemek ve motorun yürüttüğü tüm sorguları görüntülemek ya da bir üretim sunucusunda çalıştırılan tüm sorguları görüntülemek isterim. Bunu nasıl yapabilirim?


Bir sorunun ne kadar kötü olduğuna bağlı olarak, MySql Proxy'yi denemenizi şiddetle tavsiye ederim. B / c uygulama sunucusuna yerleştirilebilir, a) ölçeklenebilir, b) db'ye giden tüm trafiği etkilemesi gerekmez. Bu 'alfa', ama uzun zamandır var. dev.mysql.com/downloads/mysql-proxy
Jeff Maass

15
Bu neden kapandı ?! Bir tavsiye için değil, X'in nasıl yapılacağını soruyor . Yaklaşık 200 kişi bu soruyu yararlı buldu. Modların sakinleşmesi gerekiyor.
Cerin

1
Bu soruyu, araçlarla ilgili herhangi bir referansı atlamak için yeniden yazdım. Bence bu soru burada mükemmel bir konudur, çünkü "olması gereken sorguları mı çalıştırıyoruz?" veritabanı ile ilgili bir sorunu ayıklamak için harika bir ilk adımdır.
Jeffrey Bosboom

1
@MaasSql mysql proxy sorgu ve değerler sadece sunucuda bağlı olsun PDO kullanırken php geliştiriciler için yararlı değildir.
Ananda

Yanıtlar:


299

MySQL komutunu çalıştırabilirsiniz SHOW FULL PROCESSLIST;Herhangi bir zamanda hangi sorguların işlendiğini görmek , ancak bu muhtemelen umduğunuz şeyi başaramaz.

Sunucuyu kullanarak her uygulamayı değiştirmek zorunda kalmadan bir geçmiş almanın en iyi yöntemi muhtemelen tetikleyicilerdir. Tetikleyicileri, sorgudaki her sorgu çalışmasının bir tür geçmiş tablosuna eklenmesini sağlayacak şekilde ayarlayabilir ve ardından bu bilgilere erişmek için ayrı bir sayfa oluşturabilirsiniz.

Bunun INSERT, her bir sorgunun üzerine bir fazladan ekleyerek, muhtemelen sunucudaki her şeyi önemli ölçüde yavaşlatacağını unutmayın .


Düzenleme: Başka bir alternatif Genel Sorgu Günlüğüdür , ancak düz bir dosyaya yazılması, özellikle gerçek zamanlı olarak görüntüleme esnekliği için birçok olasılığı kaldıracaktır. Ne olup bittiğini görmek için basit, uygulaması kolay bir yol istiyorsanız, GQL'i etkinleştirmek ve daha sonra tail -flogfile üzerinde çalışmayı kullanmak hile yapar.


5
Bu aptalca gelebilir, ancak GQL'i tam olarak nasıl etkinleştirebilirim? Log_output = dosya, general_log = 1 ve general_log_file = / pathtofile ekledim ve günlük dosyasını kuyruğa aldım, siteyi ziyaret ettim ve hiçbir şeyim yok. Neyi yanlış yapıyorum?
barfoon

Hiçbir şeyden emin olamıyorum, ancak sunucuyu yeniden başlattığınızdan ve seçtiğiniz dosyanın mysql'in yazma erişimine sahip olduğundan emin olun.
Chad Birch

7
Ben anladım - my.cnf tüm gerekli log = / yol / to / log Sonra sadece üzerine kuyruk yaptı ve tüm sorguları görüntüler.
barfoon

1
Anlayabildiğim kadarıyla , bir SELECT deyiminde bir şey tetiklemek için bir yolu yoktur . Tetikleyiciler yalnızca INSERT, UPDATE, DELETE ... için geçerlidir veya yanlış bilgilendirilmiş miyim?
gabe.

1
Daha önce aynı yerdeydim. Şu anda, tüm bunları çok daha az yük ile yapan Monyog kullanıyorum , dolayısıyla hiçbir şey yavaşlamıyor.

520

Her sorguyu bir günlük dosyasına gerçekten kolayca kaydedebilirsiniz:

mysql> SHOW VARIABLES LIKE "general_log%";

+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| general_log      | OFF                        |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+

mysql> SET GLOBAL general_log = 'ON';

Sorgularınızı yapın (herhangi bir db'de). Grep veya başka türlü inceleyin/var/run/mysqld/mysqld.log

Sonra unutma

mysql> SET GLOBAL general_log = 'OFF';

veya performans düşecek ve diskiniz doldurulacak!


37
İyi cevap! tail -f -n300 /var/run/mysqld/mysqld.logGünlük dosyanızın canlı kaydını tutmak için kullanabilirsiniz
Claudio Bredfeldt

4
Bu değişkenler için MySQL 5.1.12 veya üstü sürümün gerekli olduğunu unutmayın. Bundan önce, bu ayarları değiştirmek için MySQL'i yeniden başlatmanız gerekir.
jlh

Parametreli değişkenlerin günlüğe yazılmasını sağlamanın bir yolu var mı? Görüyorum SELECT name FROM person where id=?ama ne idolduğunu bilmiyorum .
Jeff

SHOW VARIABLESbenim için çalışmadı. Ancak iyi SELECT @@GLOBAL.general_log_file;çalışıyor. (MariaDB 10.1.9)
phil pirozhkov

1
important - Günlük çıktısını ile kontrol etmeniz gerekir SHOW VARIABLES LIKE "log_output%". Eğer olarak ayarlanırsa table, günlükler veritabanına kaydedilir, tablo mysql.general_logdosya sisteminde değil. Sen olarak değiştirebilirsiniz file ileSET GLOBAL log_output = 'file';
Arnis Juraga

199

Bir cevap zaten kabul edilmiş olsa da, en basit seçenek bile olabilecekleri sunmak istiyorum:

$ mysqladmin -u bob -p -i 1 processlist

Bu işlem, geçerli sorguları her saniye ekranınıza yazdırır.

  • -u Komutu şu şekilde çalıştırmak istediğiniz mysql kullanıcısı
  • -p Parolanızı sor (böylece bir dosyaya kaydetmeniz veya komutun komut geçmişinizde görünmesini sağlamanız gerekmez)
  • i Saniye cinsinden aralık.
  • --verboseHer işlem için tüm sorguyu görüntüleyen tam işlem listesini göstermek için bayrağı kullanın . (Teşekkürler, nmat )

Olası bir dezavantaj var: ayarladığınız aralık arasında çalışırsa hızlı sorgular görünmeyebilir. IE: Aralıkım bir saniyeye ayarlandı ve .02çalıştırılması saniye süren ve aralıklar arasında çalıştırılan bir sorgu varsa, bunu göremezsiniz.

Dinleyici veya başka bir şey ayarlamak zorunda kalmadan çalışan sorguları hızlı bir şekilde kontrol etmek istediğinizde bu seçeneği kullanın.


11
BU en iyi çözümdür!
user1398287

3
Bence bu daha iyi bir çözüm, çünkü komutu her seferinde göndermek için yeni bir mysql bağlantısı kullanmayın, bunun yerine bir mysql bağlantısı açın ve bunu gösteri işlem listesini göndermek için kullanın;
Jose Nobile

@JoseNobile Adaptörünüzde mysql bağlantısını açık tutarsanız, gerçekten önemli değil. Çözümüm bir adaptörde kullanıma hazır olmadığından çözümüm OP için tam olarak doğru değil. Ancak, hızlı ve kolaydır.
halfpastfour.am

7
--verboseTüm sorguları görmek için ekleyebilirsiniz
nmat

2
Aradığım cevap bu. Cevap olarak kabul edilmelidir. Ayrıca uygulanması en kolay cevap.
Çad

51

MySQL sorgularını çalıştırmayı görmek için bu uygun SQL sorgusunu çalıştırın. Herhangi bir kod değişikliği veya ek yük olmadan istediğiniz herhangi bir ortamdan, istediğiniz zaman çalıştırılabilir. Bazı MySQL izinleri yapılandırması gerektirebilir, ancak benim için herhangi bir özel kurulum olmadan çalışır.

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep';

Tek yakalama, çok hızlı bir şekilde yürütülen sorguları kaçırmanızdır, bu nedenle daha uzun süren sorgular için veya MySQL sunucusunun yedeklediği sorgular olduğunda en kullanışlıdır - deneyimime göre, tam olarak görüntülemek istediğim zamandır " canlı sorguları.

Herhangi bir SQL sorgusunu daha spesifik hale getirmek için koşullar da ekleyebilirsiniz.

5 saniye veya daha uzun süre çalışan tüm sorguları gösterir:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 5;

Örneğin Çalışan tüm UPDATE'leri göster:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND INFO LIKE '%UPDATE %';

Tüm ayrıntılar için bkz. Http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html


17

Ben oturum açma açmak için izinlere sahip değilim ve açık olsaydı günlükleri görmek için izinleri olmaz belirli bir durumdayım. Bir tetikleyici ekleyemedim, ancak show processlist'i çağırmak için izinlerim vardı. Bu yüzden, en iyi çabayı gösterdim ve bununla geldim:

"Showsqlprocesslist" adlı bir bash betiği oluşturun:

#!/bin/bash

while [ 1 -le 1 ]
do
         mysql --port=**** --protocol=tcp --password=**** --user=**** --host=**** -e "show processlist\G" | grep Info | grep -v processlist | grep -v "Info: NULL";
done

Komut dosyasını yürütün:

./showsqlprocesslist > showsqlprocesslist.out &

Çıktı kuyruğu:

tail -f showsqlprocesslist.out

Bingo bango. Kısaltılmasa da, çalıştırdığım kutularda sadece% 2-4 CPU aldı. Umarım belki bu birine yardımcı olur.


Ha! Lezzetli. Sevdim.
Darth Egregious

Çok fazla ayrıntılı çıktıdan kaçınmak için biraz gecikmeye ihtiyaç duyar. Edit'ime bakın lütfen.
Slyx

@Slyx, döngüye uyku koyma önerisi için teşekkürler. Ancak, uykudan daha kısa bir süre yaşayan kısa ömürlü sorgular arıyorsanız, aradığınız şeyi kaçırırsınız. Gerçekten zaman içinde bir anlık görüntü arıyorsanız, bu bir döngüde çalıştırılmamalıdır. Ayrıca, bunun potansiyel olarak çok kısa ömürlü sorguları kaçırabileceğine dikkat edilmelidir.
Michael Krauklis

17

strace

Canlı MySQL / MariaDB sorgularını görmenin en hızlı yolu hata ayıklayıcı kullanmaktır. Linux'ta şunları kullanabilirsiniz strace:

sudo strace -e trace=read,write -s 2000 -fp $(pgrep -nf mysql) 2>&1

Kaçan karakterlerin çok olduğundan, sen olabilir strace çıkış biçimlendirmek tarafından borulama (sadece eklemek |aşağıdaki komutu yukarıdaki bu iki tek gömlekleri arasında):

grep --line-buffered -o '".\+[^"]"' | grep --line-buffered -o '[^"]*[^"]' | while read -r line; do printf "%b" $line; done | tr "\r\n" "\275\276" | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"

Bu nedenle, yapılandırma dosyalarına dokunmadan, SQL sorgularını zaman kaybetmeden oldukça temiz görmelisiniz.

Açıkçası bu, aşağıda açıklanan (SQL sunucusunun yeniden yüklenmesini içeren) günlükleri etkinleştirmenin standart yolunun yerini almayacaktır.

dtrace

Sunucuya dokunmadan canlı MySQL sorgularını görüntülemek için MySQL problarını kullanın. Örnek komut dosyası:

#!/usr/sbin/dtrace -q
pid$target::*mysql_parse*:entry /* This probe is fired when the execution enters mysql_parse */
{
     printf("Query: %s\n", copyinstr(arg1));
}

Yukarıdaki komut dosyasını bir dosyaya (gibi watch.d) kaydedin ve çalıştırın:

pfexec dtrace -s watch.d -p $(pgrep -x mysqld)

Daha fazla bilgi edinin: DTracing MySQL ile çalışmaya başlama

Gibbs MySQL Spyglass

Bu cevaba bakınız .

Kütükler

İşte geliştirme önerileri için yararlı adımlar.

Bu satırları kendinize ~/.my.cnfveya genelinize ekleyin my.cnf:

[mysqld]
general_log=1
general_log_file=/tmp/mysqld.log

Yollar: /var/log/mysqld.logveya /usr/local/var/log/mysqld.logdosya izinlerinize bağlı olarak da çalışabilir.

ardından MySQL / MariaDB'nizi yeniden başlatın ( sudogerekirse ön ek ile ):

killall -HUP mysqld

Ardından günlüklerinizi kontrol edin:

tail -f /tmp/mysqld.log

Bitirmek sonra, değişiklik general_logiçin 0(ileride kullanabilirsiniz böylece), ardından dosyayı yeniden ve yeniden başlatma SQL sunucusu kaldırın: killall -HUP mysqld.


1
general_logMySQL sorgusunu ayarlarsanız sunucuyu öldürmenize gerek yoktur . general_log_fileİşaret eden dosyaya yazmaya başlayacaktır .
Robert Brisita

15

Bu, karşılaştığım bir Linux Ubuntu makinesinde en kolay kurulum. Tüm sorguları canlı görmek çılgın.

MySQL yapılandırma dosyanızı bulun ve açın, genellikle /untc/mysql/my.cnf Ubuntu'da. “Günlüğe Kaydetme ve Çoğaltma” yazan bölümü arayın

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.

log = /var/log/mysql/mysql.log

Günlük kaydını açmak için “log” değişkenini açmanız yeterlidir. MySQL'i şu komutla yeniden başlatın:

sudo /etc/init.d/mysql restart

Şimdi sorguları geldiklerinde izlemeye başlamaya hazırız. Yeni bir terminal açın ve günlük dosyasını kaydırmak için bu komutu çalıştırın, gerekirse yolu ayarlayın.

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

Şimdi uygulamanızı çalıştırın. Veritabanı sorgularının uçbirim pencerenizde uçmaya başladığını göreceksiniz. (terminalde kaydırma ve geçmişin etkin olduğundan emin olun)

DAN http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/


13

Bir komut satırından şunları çalıştırabilirsiniz:

watch --interval=[your-interval-in-seconds] "mysqladmin -u root -p[your-root-pw] processlist | grep [your-db-name]"

[X] değerlerini değerlerinizle değiştirin.

Ya da daha iyisi:

 mysqladmin -u root -p -i 1 processlist;

1
Bu aslında kullanışlı olabilecek çok iyi bir snippettir .. Teşekkürler!
MGP

tam olarak ne aradığını !! saatin ayrı olarak kurulması gerekir.
Tilo

12

Mtop'u kontrol et .


1
Evet, ama Debian veya Ubuntu'ya yüklerken iyi şanslar: bugs.launchpad.net/ubuntu/+source/mtop/+bug/77980
mlissner

Debian üzerinde çalışan almak için yönetti, ama bir sürü sorgu özlüyor çünkü onun kindof değersiz. Sorgu sayacı sürekli gidiyor görebilirsiniz ama nadiren herhangi bir sorgu görüntüler. Görünüşe göre yalnızca yaklaşık 1 saniyeden daha uzun süren sorguları görüntüler.
Cobra_Fast

@Cobra_Fast mtop Sourceforge sayfasında açıkça belirtilmiştir: mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete. mtop.sourceforge.net Bazen oldukça faydalıdır.
Ian Lewis

7

Ben de aynısını yapmak için aradım ve çeşitli mesajlardan bir çözüm birlikte topladım, artı günlük dosyasına yazılırken canlı sorgu metni çıktısı için küçük bir konsol uygulaması oluşturdum. MySQL ile Entity Framework kullanıyorum ve oluşturulan SQL incelemek gerekir bu benim durumumda önemliydi.

Günlük dosyasını oluşturma adımları (basitlik için burada bulunan diğer yayınların bazı kopyaları):

  1. Şu konumda bulunan dosyayı düzenleyin:

    C:\Program Files (x86)\MySQL\MySQL Server 5.5\my.ini

    Dosyanın altına "log = development.log" ekleyin. (Bu dosyayı kaydetmemde metin düzenleyicimi yönetici olarak çalıştırmam gerekiyordu).

  2. Bir komut satırı açmak için MySql çalışma tezgahını kullanın, parolayı girin.

    Çalıştırılan tüm sorguları kaydedecek genel günlük kaydını açmak için aşağıdakileri çalıştırın:

    SET GLOBAL general_log = 'ON';
    
    To turn off:
    
    SET GLOBAL general_log = 'OFF';

    Bu, çalışan sorguların aşağıdaki konumdaki bir metin dosyasına yazılmasına neden olur.

    C:\ProgramData\MySQL\MySQL Server 5.5\data\development.log
  3. Günlük bilgilerini gerçek zamanlı olarak çıktılayacak bir konsol uygulaması oluşturun / çalıştırın:

    İndirilebilir kaynak

    Kaynak:

    using System;
    using System.Configuration;
    using System.IO;
    using System.Threading;
    
    namespace LiveLogs.ConsoleApp
    {
      class Program
      {
        static void Main(string[] args)
        {
            // Console sizing can cause exceptions if you are using a 
            // small monitor. Change as required.
    
            Console.SetWindowSize(152, 58);
            Console.BufferHeight = 1500;
    
            string filePath = ConfigurationManager.AppSettings["MonitoredTextFilePath"];
    
            Console.Title = string.Format("Live Logs {0}", filePath);
    
            var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    
            // Move to the end of the stream so we do not read in existing
            // log text, only watch for new text.
    
            fileStream.Position = fileStream.Length;
    
            StreamReader streamReader;
    
            // Commented lines are for duplicating the log output as it's written to 
            // allow verification via a diff that the contents are the same and all 
            // is being output.
    
            // var fsWrite = new FileStream(@"C:\DuplicateFile.txt", FileMode.Create);
            // var sw = new StreamWriter(fsWrite);
    
            int rowNum = 0;
    
            while (true)
            {
                streamReader = new StreamReader(fileStream);
    
                string line;
                string rowStr;
    
                while (streamReader.Peek() != -1)
                {
                    rowNum++;
    
                    line = streamReader.ReadLine();
                    rowStr = rowNum.ToString();
    
                    string output = String.Format("{0} {1}:\t{2}", rowStr.PadLeft(6, '0'), DateTime.Now.ToLongTimeString(), line);
    
                    Console.WriteLine(output);
    
                    // sw.WriteLine(output);
                }
    
                // sw.Flush();
    
                Thread.Sleep(500);
            }
        }
      }
    }

1
Bu gerçekten harika görünüyor ve kesinlikle ona bir göz atacağım, bunu bir OSS projesi olarak almak ve bir profil oluşturma aracı oluşturmak için harika olacağım!
Rippo

Bence bu iyi bir fikir. Google koduna bir SVN repo koydum. Muhtemelen en küçük işletim sistemi projesi, ancak bu şimdiye kadar çok faydalı oldu. Muhtemelen uzatacağım, başka birinin daha ileri götürüp götürmediğini görmek isterim. code.google.com/p/livelogs
gb2d

OP'nin Linux makinesinde çalışması için ona ihtiyacı var. Yanıtınız bir Windows makinesi içindir. Bu cevap yaratıcılığı yansıtsa da, başkalarına yardımcı olmayabilir.
halfpastfour.am

1

Genel günlük kaydını nasıl etkinleştireceğinizi açıklayan önceki yanıtlara ek olarak, günlüğüne herhangi bir SQL yazılmadan önce vanilya MySql 5.6 kurulumumda bir ek değişkeni değiştirmek zorunda kaldım:

SET GLOBAL log_output = 'FILE';

Varsayılan ayar 'NONE' idi.


0

Gibbs MySQL Spyglass

AgilData kısa süre önce Gibbs MySQL Ölçeklenebilirlik Danışmanı'nı (ücretsiz self servis aracı) başlattı. Spyglass (Açık Kaynak) MySQL Sunucularınız ve istemci uygulamalarınız arasındaki etkileşimleri izler. MySQL veritabanı sunucusunun yeniden yapılandırılması veya yeniden başlatılması gerekmez (istemci veya uygulama).

GitHub: AgilData / gibbs-mysql-spyglass

Daha fazla bilgi edinin: MySQL'i Rust ile Yakalama Paketi

Kurulum komutu:

curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash

2
Spyglass, bir sunucudan kapalı olan bir API anahtarı gerektiriyor gibi görünüyor ve son taahhüt 3 yıl önceydi. Bu ürünün hala desteklendiğinden / çalıştığından emin değilim.
Dan Tenenbaum
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.