Mysql sorgu günlüğünün devre dışı bırakılıp bırakılmayacağı. "Sunucu günlükleri" nedir, sunucu günlüklerinin nasıl görüntüleneceği. MySQL'deki yavaş sorgu günlüğü nedir?

MySQL sorgu profili oluşturma, veritabanına dayalı uygulamaların genel performansını analiz etmek için kullanışlı bir tekniktir. Orta ve büyük uygulamalar geliştirirken, kural olarak, yüzlerce istek geniş bir kod tabanına dağıtılır ve veritabanı saniyede birçok isteği işler. Sorgu profili oluşturma olmadan, hatanın yerini ve nedenlerini belirlemek çok zorlaşır. darboğazlar uygulamalar. Bu öğretici, MySQL'in yerleşik araçlarını kullanan bazı yararlı sorgu profil oluşturma tekniklerini açıklar.

MySQL yavaş sorgu günlüğü

MySQL yavaş sorgu günlüğü (veya yavaş sorgu günlüğü), MySQL'in yavaş ve potansiyel olarak sorunlu sorgular gönderdiği günlüktür.

Bu özellik MySQL ile birlikte gelir ancak varsayılan olarak devre dışıdır. MySQL, uygulamanın performans gereksinimlerine göre sorgunun profilinin çıkarılmasına izin veren özel değişkenleri kullanarak bu günlüğe hangi sorguların girileceğini belirler. Genellikle bu günlük, işlenmesi daha uzun süren sorguları ve hatalı dizinlere sahip sorguları içerir.

Profil oluşturma değişkenleri

MySQL yavaş sorgu günlüğünü yapılandırmak için temel sunucu değişkenleri şunlardır:

genel yavaş_query_log
genel yavaş_query_log_file
long_query_time global/oturum
log_queries_not_using_indexes genel
min_examined_row_limit genel/oturum

slow_query_log - Yavaş sorgu günlüğünü etkinleştirmek ve devre dışı bırakmak için Boolean değişkeni.

slow_query_log_file - sorgu günlük dosyasının mutlak yolu. Dosyanın dizini mysqld kullanıcısına ait olmalı ve uygun okuma ve yazma izinlerine sahip olmalıdır. MySQL arka plan programı büyük olasılıkla mysql olarak başlatılacaktır, ancak emin olmak için aşağıdaki komutu bir Linux terminalinde çalıştırın:

ps-ef | grep kutusu/mysqld | -d" " -f1'i kes

Çıktı, geçerli kullanıcıyı ve mysqld kullanıcısını gösterecektir.

cd /var/günlük
mkdir mysql
chmod 755 mysql
chown mysql:mysql mysql

  • long_query_time - sorgu uzunluğunu kontrol etmek için saniye cinsinden süre. 5 olarak ayarlanırsa işlenmesi 5 saniyeden uzun süren tüm istekler günlüğe kaydedilir.
  • log_queries_not_using_indexes - Dizin kullanmayan sorguların günlüğe kaydedilip kaydedilmeyeceğini belirleyen bir boole değeri. Analizde, bu tür sorgular önemlidir.
  • min_examined_row_limit - Ayrıştırılacak minimum satır sayısını belirtir. 1000 değeriyle, 1000'den az satırı ayrıştıran tüm sorgular dikkate alınmaz.

MySQL sunucu değişkenleri, MySQL yapılandırma dosyasında veya dinamik olarak ayarlanabilir. Kullanıcı arayüzü veya MySQL komut satırı. Değişkenler yapılandırma dosyasında ayarlanmışsa, bunlar sunucu yeniden başlatmaları boyunca devam eder, ancak bunları etkinleştirmek için sunucuyu yeniden başlatmanız gerekir. MySQL yapılandırma dosyası genellikle /etc/my.cnf veya /etc/mysql/my.cnf konumunda bulunur. Yapılandırma dosyasını bulmak için şunu yazın (aramanın diğer kök dizinlere genişletilmesi gerekebilir):

/etc -my.cnf adını bul
/usr -adı my.cnf'yi bul

Yapılandırma dosyasını bulduğunuzda, gerekli değişkenleri bölüme ekleyin:


….
yavaş sorgu günlüğü = 1
yavaş sorgu günlük dosyası = /var/log/mysql/localhost-slow.log
uzun_sorgu_süresi = 1
dizinleri kullanmayan günlük sorguları

Değişikliklerin etkili olması için sunucuyu yeniden başlatmanız gerekir. Değişikliklerin hemen etkinleştirilmesi gerekiyorsa, değişkenleri dinamik olarak ayarlayın:

mysql> GLOBAL AYARLA yavaş_query_log = "AÇIK";
mysql> GLOBAL AYARLA slow_query_log_file = "/var/log/mysql/localhost-slow.log";
mysql> KÜRESEL AYARLA log_queries_not_using_indexes = "AÇIK";
mysql> OTURUMU AYARLA long_query_time = 1;
mysql> OTURUMU AYARLA min_examined_row_limit = 100;

Değişkenlerin değerlerini kontrol etmek için:

mysql> "slow_query_log" GİBİ GLOBAL DEĞİŞKENLERİ GÖSTERİN;
mysql> "long_query_time" GİBİ OTURUM DEĞİŞKENLERİNİ GÖSTER;

MySQL değişkenlerini dinamik olarak değiştirmenin bir dezavantajı, sunucu yeniden başlatıldığında değişkenlerin kaybolacak olmasıdır. Bu nedenle, kaydedilmesi gereken tüm önemli değişkenler dosyaya eklenmelidir.

Profil oluşturma için bir sorgu oluşturun

Artık yavaş sorgu günlükleri için ayarlara aşinasınız. Profil oluşturma için sorgu verileri oluşturmayı deneyin.

Not: Burada gösterilen örnek, yavaş sorgu günlükleri yapılandırılmadan çalışan bir MySQL örneğinde çalıştırılmıştır. Bu test sorguları aracılığıyla çalıştırılabilir GUI veya Komut satırı MySQL.

Yavaş istek günlüğünü izlerken, iki terminal penceresi açmak yararlıdır: göndermek için bir bağlantı MySQL operatörleri, ikincisi ise istek günlüğünü görüntülemek içindir.

SÜPER YÖNETİCİ ayrıcalıklarına sahip bir kullanıcı olarak konsolu kullanarak MySQL sunucusunda oturum açın. İlk olarak, bir test veritabanı ve tablosu oluşturun, buna sahte veriler ekleyin ve yavaş sorgu günlüğünü etkinleştirin.

Not: İdeal olarak, bu örnek, sorgu günlüğünü karıştırmamak için MySQL kullanan başka uygulamaların olmadığı bir ortamda en iyi şekilde çalıştırılır.

$> mysql -u -p
mysql> VERİTABANI OLUŞTUR profil_sampling;

mysql> profile_sampling KULLANIN;


mysql> CREATE TABLE kullanıcıları (id TINYINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255));


mysql> INSERT INTO users (isim) DEĞERLER ("Walter"),("Skyler"),("Jesse"),("Hank"),("Walter Jr."),("Marie"),("Saul "),("Gustavo"),("Hector"),("Mike");


mysql> GLOBAL AYARLA yavaş_query_log = 1;


mysql> GLOBAL AYARLA slow_query_log_file = "/var/log/mysql/localhost-slow.log";


mysql> GLOBAL AYARLA log_queries_not_using_indexes = 1;


mysql> SET long_query_time = 10;


mysql> SET min_examined_row_limit = 0;

Artık bir test veritabanınız ve bazı verileri içeren bir tablonuz var. Yavaş sorgu günlüğü etkinleştirildi. Kasıtlı olarak yüksek bir istek işleme süresi belirledik ve satır sayısı kontrolünü devre dışı bıraktık. Günlüğü görüntülemek için şunu yazın:

cd /var/log/mysql
ls-l

Şu ana kadar, klasör yavaş isteklerin günlüğünü içermemelidir, çünkü şu an hiçbir istek yoktu. Zaten böyle bir günlük varsa, yavaş sorgu günlük desteğini etkinleştirdiğiniz için veritabanı zaten yavaş sorgularla karşılaşmış demektir. Bu, bu örneğin sonuçlarını çarpıtabilir. MySQL sekmesine dönün ve şunu çalıştırın:

mysql> profile_sampling KULLANIN;
mysql> SEÇİN * KULLANICILARDAN NEREDE id = 1;

Yürütülen sorgu basitçe verileri alır ve tablodaki ilk anahtarın dizinini kullanır. Bu sorgu hızlıydı ve bir dizin kullandı, bu nedenle yavaş sorgu günlüğüne kaydedilmedi. Dizine geri dönün ve herhangi bir sorgu günlüğü oluşturulmadığını kontrol edin. Şimdi MySQL penceresine dönün ve şunu çalıştırın:

mysql>

Bu sorgu bir dizin kullanmaz. Şimdi, /var/log/mysql/localhost-slow.log günlüğünde buna benzer bir şey görünmelidir:

# Saat: 140322 13:54:58

profile_sampling'i kullanın;
Zaman damgasını AYARLA=1395521698;

Bir örnek daha. Bunun gibi bir isteği ayrıştırmak ve göndermek için minimum satır sayısını artırın:

mysql> SET min_examined_row_limit = 100;
mysql> SEÇİN * KULLANICILARDAN NEREDE isim = "Walter";

Sorgu 100'den az satır ayrıştırdığından veriler günlüğe eklenmeyecek.

Not: Veriler günlüğe eklenmemişse, kontrol edilmesi gereken birkaç faktör vardır. İlk önce, günlüğün oluşturulduğu dizinin izinlerini kontrol edin. Mysqld kullanıcısına/grubuna ait olmalı ve chmod 755 ayrıcalıklarına sahip olmalıdır.Daha sonra, sunucunun ayarlarınızı geçersiz kılan başka yavaş sorgu ayarları olup olmadığını kontrol etmelisiniz. Tüm yavaş sorgu değişkenlerini yapılandırma dosyasından kaldırmak için varsayılan değerleri sıfırlayın ve sunucuyu yeniden başlatın. Global değişkenleri dinamik olarak varsayılan değerlerine ayarlamak da mümkündür. Değişiklikleri dinamik olarak yapıyorsanız, oturumu kapatın ve ayarları güncellemek için MySQL'de oturum açın.

Sorgu profil oluşturma verilerinin analizi

Aşağıdaki verileri göz önünde bulundurun:

# Saat: 140322 13:54:58
# [e-posta korumalı]:root@localhost
# Sorgu_zamanı: 0.000303 Kilit_zamanı: 0.000090 Gönderilen Satır: 1 İncelenen Satır: 10
profile_sampling'i kullanın;
Zaman damgasını AYARLA=1395521698;
SEÇİN * KULLANICILARDAN NEREDE isim = "Jesse";

Bu giriş şunları görüntüler:

  • Yürütme zamanı iste
  • Kim gönderdi
  • Talebin ne kadar süre işlendiği
  • Uzunluk
  • Kaç satır döndürüldü?
  • Kaç satır ayrıştırıldı

Değişkenlerde belirtilen performans gereksinimlerini ihlal eden herhangi bir istek günlüğe kaydedildiği için bu yararlıdır. Bu, bir geliştiricinin veya yöneticinin çalışmayan istekleri hızlı bir şekilde izlemesini sağlar. Ek olarak, sorgu profili oluşturma verileri, hangi koşulların uygulama performansını düşürdüğünü belirlemenize yardımcı olabilir.

mysqldumpslow'u kullanma

Orta düzeyde veri trafiği sağlamak için veritabanı güdümlü uygulamalara profil oluşturma dahil edilebilir.

Günlük boyutu büyüdükçe, tüm verileri ayrıştırmak zorlaşır ve sorunlu sorgular içinde kolayca kaybolur. MySQL, yavaş sorgu günlüğünü bölerek bu sorunun önlenmesine yardımcı olan mysqldumpslow adlı bir araç sağlar. İkili, MySQL'e (Linux'ta) bağlıdır, böylece şu komutu çalıştırmanız yeterlidir:

/var/log/mysql/localhost-slow.log adresinde mysqldumpslow -t 5 -s

Komut, çıktıyı özelleştirmek için çeşitli parametreler alabilir. Yukarıdaki örnek, ortalama istek süresine göre sıralanmış ilk 5 isteği görüntüler. Bu tür satırlar daha okunabilir ve ayrıca istenildiği gibi gruplandırılmıştır.

Sayı: 2 Süre=68,34s (136s) Kilit=0,00s (0s) Satır=39892974,5 (79785949), [e-posta korumalı]
PL.pl_title, P.page_title'ı SEÇİN
P sayfasından
INNER JOIN sayfa bağlantıları PL
AÇIK PL.pl_namespace = P.page_namespace
NEREDE P.page_namespace = N

Çıktı aşağıdaki verileri gösterir:

  • Sayı: İsteğin kaç kez günlüğe kaydedildiği.
  • Süre: Ortalama ve toplam istek süresi (parantez içinde).
  • Kilitle: masa kilitleme süresi.
  • Satırlar: Döndürülen satır sayısı.

Komut, sayısal ve dize değerlerini hariç tutar, bu nedenle farklı WHERE koşullarına sahip aynı sorgular aynı olarak değerlendirilir. mysqldumpslow aracı, düzenli olarak izin vermek yerine sürekli olarak yavaş sorgu günlüğüne bakma ihtiyacını ortadan kaldırır. otomatik kontroller. mysqldumpslow komut seçenekleri, karmaşık ifadeleri yürütmenize izin verir.

Talep Dökümü

Akılda tutulması gereken başka bir profil oluşturma aracı, karmaşık sorgu dökümü aracıdır. Yavaş sorgu günlüğündeki sorunlu sorguları belirlemenize ve MySQL'de çalıştırmanıza olanak tanır. Öncelikle profil oluşturmayı etkinleştirmeniz ve ardından sorguyu çalıştırmanız gerekir:

mysql> OTURUMU AYARLA profil oluşturma = 1;
mysql> profile_sampling KULLANIN;
mysql> SEÇİN * KULLANICILARDAN NEREDE isim = "Jesse";
mysql> PROFİLLERİ GÖSTER;

Profil oluşturma etkinleştirildiğinde, SHOW PROFILES, Query_ID'yi SQL deyimiyle ilişkilendiren bir tablo gösterecektir. Çalışan sorguya karşılık gelen Query_ID'yi bulun ve aşağıdaki sorguyu çalıştırın (# yerine Query_ID'nizi yazın):

mysql> SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=#;

Komut bir tablo döndürür:

DİZİ DURUM SÜRE
1 Başlangıç 0.000046
2 izinleri kontrol etme 0.000005
3 açılış masaları 0.000036

DURUM, sorgu yürütme sürecindeki adımdır ve SÜRE, bu adımı saniye cinsinden tamamlamak için geçen süredir. çok değil kullanışlı araç, ancak sorgu yürütmenin hangi bölümünün en fazla gecikmeye neden olduğunu belirlemeye yardımcı olabilir.

Not A: Bu araç bir üretim ortamında kullanılmamalıdır.

Yavaş sorgu günlük performansı

Geriye yalnızca yavaş sorgu günlüğünün performansı nasıl etkilediğini anlamak kalır. Bir üretim ortamında yavaş sorgu günlüğü çalıştırmak genellikle güvenlidir; ne CPU ne de G/Ç etkilenmemelidir. Ancak, günlük boyutunu izlemek için bir stratejiniz olmalıdır, böylece günlük dosya sistemi için çok büyük olmaz. Ayrıca, bir üretim ortamında yavaş sorgu günlüğü çalıştırırken, long_query_time 1 veya daha yüksek olarak ayarlanmalıdır.

Çözüm

Yavaş sorgu günlüğü, sorunlu sorguları belirlemenize ve genel sorgu performansını değerlendirmenize yardımcı olabilir. Bu durumda geliştirici, uygulamanın nasıl performans gösterdiğine dair ayrıntılı bir anlayış elde edebilir. MySQL sorguları. mysqldumpslow aracı, yavaş sorgu günlüklerini yönetmenize ve bunları geliştirme sürecinize kolayca dahil etmenize olanak tanır. Sorunlu sorguları tanımlayarak, performansı artırmak için sorgu işlemeyi optimize edebilirsiniz.

Etiketler:

Olay günlükleri, sistem durumunu belirlemek ve hataları belirlemek için ilk ve en kolay araçtır. MySQL'de dört ana günlük vardır:

  • hata günlüğü- sunucu çalışması sırasında toplanan standart hata günlüğü (başlatma ve durdurma dahil);
  • İkili Günlük- replikasyon ve yedeklemeler için gerekli olan tüm veritabanı değişiklik komutlarının bir günlüğü;
  • Genel Sorgu Günlüğü— isteklerin ana günlüğü;
  • Yavaş Sorgu Günlüğü- yavaş sorguların günlüğü.

Hata günlüğü

Bu günlük, kritik hatalar, kapatmalar, sunucu başlatmaları ve uyarılar dahil olmak üzere sunucu çalışırken oluşan tüm hataları içerir. Sistem arızası durumunda başlamanız gereken yer burasıdır. Varsayılan olarak, tüm hatalar konsola (stderr) yazdırılır, ayrıca hataları syslog'a (Debian'da varsayılan) veya ayrı bir günlük dosyasına yazabilirsiniz:

Log_error=/var/log/mysql/mysql_error.log

# Hatalar mysql_error.log'a yazılacak

Hataları hızlı bir şekilde belirlemek için bu günlüğü etkin tutmanızı öneririz. Ve bunun veya bu hatanın ne anlama geldiğini anlamak için, MySQL'in pererror yardımcı programı vardır:

Kabuk> peror 13 64 OS hata kodu 13: İzin reddedildi OS hata kodu 64: Makine ağda değil

# Hata kodlarının anlamını açıklar

İkili (diğer adıyla ikili) günlük

Veritabanını değiştirmeye yönelik tüm komutlar, çoğaltma ve kurtarma için yararlı olan ikili günlüğe kaydedilir.

Bu şekilde açılır:

log_bin = /var/log/mysql/mysql-bin.log süre sonu_logs_days = 5 max_binlog_size = 500M

# Konumu, son kullanma tarihini ve en büyük boy dosya

Lütfen sistemi ölçeklendirmeyecek ve hataya dayanıklılık uygulamayacaksanız, ikili günlüğü etkinleştirmemenin daha iyi olacağını unutmayın. Kaynak yoğundur ve sistem performansını düşürür.

İstek Günlüğü

Bu günlük, alınan tüm SQL sorgularını ve istemci bağlantılarıyla ilgili bilgileri içerir. Dizin analizi ve optimizasyonunun yanı sıra hatalı sorguları belirlemek için yararlı olabilir:

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

# Günlüğü içerir ve dosya konumunu belirtir

MySQL sunucusu çalışırken de etkinleştirilebilir/devre dışı bırakılabilir:

GLOBAL'I AYARLA general_log = "AÇIK"; GLOBAL'I AYARLA general_log = "KAPALI";

# Başvurmak için sunucuyu yeniden başlatmanız gerekmez

Yavaş sorgu günlüğü

Günlük, yavaş, yani verimsiz sorguları belirlemek için kullanışlıdır. Bu makalede daha fazlasını okuyun.

Günlükleri görüntüle

Debian'daki (Ubuntu) günlükleri görüntülemek için şunları çalıştırmanız gerekir:

# Hata log tail -f /var/log/syslog #Query log tail -f /var/log/mysql/mysql.log # Yavaş sorguların günlüğü kuyruk -f /var/log/mysql/mysql-slow.log

# Günlükler ayrıca belirtilmemişse, /var/lib/mysql konumunda bulunurlar

Günlük döndürme

Günlük dosyalarını sunucuda daha az yer kaplamaları için sıkıştırmayı (arşivlemeyi, döndürmeyi) unutmayın. Bunu yapmak için yardımcı programı kullanın logrotate yapılandırma dosyasını düzenleyerek /etc/logrotate.d/mysql sunucusu:

# - Her şeyi bir bloğa koydum ve paylaşılan betikler ekledim, böylece mysql sadece bir kez # floş-logs"d alır. # Aksi takdirde, ikili günlükler otomatik olarak her gün n kez artardı. # - Hata günlüğü artık kullanılmıyor, mesajlar artık sistem günlüğüne gidiyor./var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log( günlük döndürme 7 eksikok 640 mysql adm oluştur paylaşılan betikleri sıkıştır postrotate test -x /usr/bin/mysqladmin || çıkış 0 # Bu başarısız olursa, debian.conf'u kontrol edin! MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf" if [ -z "`$MYADMIN ping 2>/dev/null`" ]; Daha sonra # Gerçekten mysqld yok mu yoksa eksik bir debian-sys-maint kullanıcısı mı var? # Bu gerçekleşirse ve bir hata değilse lütfen bir hata bildirin. #if ps cax | grep -q mysqld; Daha sonra eğer killall -q -s0 -umysql mysqld ise; sonra 1 fi else $MYADMIN flush-logs fi endscript'ten çıkın)

# Gerekli günlükleri sıkıştırır ve arşivler, dosyaları temizler

DDL Günlüğü

MySQL ayrıca bir veri tanımlama dili günlüğü tutar. DROP_TABLE ve ALTER_TABLE gibi işlemlerden veri toplar. Günlük, bu tür işlemler sırasında meydana gelen hatalardan kurtulmak için kullanılır. DDL Günlüğü, kullanıcı tarafından okunması amaçlanmayan bir ikili dosyadır, bu nedenle dosyayı değiştirmeyin veya silmeyin.

En önemli

Hata günlüğünü her zaman etkinleştirin, uygulamanın veritabanıyla bağlantısını kontrol etmek, istekleri doğrulamak ve çalışmak için sorgu günlüğünü kullanın. Yavaş sorgu günlüğü, MySQL performansını optimize etmek için kullanışlıdır.

kavram

Sunucu günlükleri (günlük dosyaları, sunucu günlüğü)- sunucu sistem bilgilerini içeren sunucuda depolanan dosyalar ve ayrıca ziyaretçiyle ilgili tüm olası verileri web kaynağına kaydetme.

Günlükler, sistem yöneticileri tarafından ziyaretçileri analiz etmek için kullanılır., belirli kullanıcı gruplarının davranış kalıplarını incelemek ve bunlar hakkında kullanılan tarayıcı, IP adresi, müşterinin coğrafi konumu hakkındaki veriler ve çok daha fazlası gibi çeşitli bilgiler elde etmek. Analize ek olarak, bu şekilde siteye izinsiz giriş olup olmadığını öğrenebilir, kim tarafından yapıldığını daha kesin olarak öğrenebilir ve bu durumla ilgili verileri ilgili makamlara iletebilirsiniz.

Günlük dosyasındaki veriler, saf haliyle, tüm bunlarda anlaşılmaz bir sırada yalnızca bir dizi karakter görecek olan sıradan kullanıcılar tarafından anlaşılmayacaktır. Ama için sistem yöneticileri ve web geliştiricileri, bu oldukça okunabilir bir metin ve oldukça faydalı bilgiler.


olayların sırası

Bir müşteri bir web kaynağına her eriştiğinde, sırasını konuşacağımız birkaç olay aynı anda tetiklenir.

1. Bir sayfa isteği yapmak. Tarayıcı satırına bir adres girdiğinizde veya örneğin bir arama sonuçları sayfasından aktif bir web bağlantısını takip ettiğinizde, tarayıcı arama yapar ve sayfanın bulunduğu sunucuya bağlanır ve onu ister. Aynı zamanda sunucuya aşağıdaki bilgileri gönderir:
- Sayfayı isteyen istemci bilgisayarın IP adresi (bir proxy sunucusu kullanılıyorsa, proxy sunucunuzun IP adresi);
- kullanıcı tarafından talep edilen İnternet sayfasının adresi (IP adresi);
- talebin yapıldığı tarih ve saat;
- istemcinin gerçek konumuna ilişkin veriler (bir proxy sunucusu kullanılıyorsa, proxy'nin gerçek adresi);
- müşteri tarafından kullanılan tarayıcı hakkında bilgi (ad, sürüm, vb.);
- müşterinin aktarıldığı web sayfası hakkındaki veriler.

2. İstenen verilerin aktarımı.İstenen veriler (web sayfası, dosyalar, çerezler vb.) sunucudan kullanıcının bilgisayarına aktarılır.

3. Sunucu günlüğüne yazma. Sonuçta, son iki olayda görünen tüm verileri gösteren bir günlük girişi gerçekleşir. Bu, ilk paragrafta gönderilen bilgilerin yanı sıra iletilen verilerle ilgili bilgilerdir.

Sunucu günlükleri nasıl görüntülenir?

Günlük dosyaları bir dosyada saklanır erişim günlüğü Ne tür bir web sunucusu kullanırsanız kullanın (Apache, Nginx, squid proxy, vb.) Bu dosya dır-dir Metin belgesi, her hatta bir arama kaydedilir. Kayıt formatları erişim günlüğü oldukça fazla, ancak en popüler olanı, kaydın aşağıdaki biçime ve diziye sahip olduğu birleştirilir:

Kod: %h %l %u %t \"%r\" %>s %b \"%(Referer)i\" \"%(User-Agent)i\"
Nerede:

%H- isteğin yapıldığı ana bilgisayar/IP adresi;
%T- sunucuya yapılan talebin zamanı ve sunucunun saat dilimi;
%R- sürüm, içerik ve istek türü;
%S- HTTP durum kodu;
%B- sunucu tarafından gönderilen bayt sayısı;
%(Yönlendiren)- isteğin URL kaynağı;
%(Kullanıcı Aracısı)- İstek hakkında bilgi içeren HTTP başlığı (istemci uygulaması, dil vb.);
%(Ev sahibi)- erişilen Sanal Konağın adı.

Bittiğinde, bu satır şuna benzer:

127.0.0.1 - - "GET /index.php HTTP/1..0 (uyumlu; MSIE 7.0; Windows NT 5.1)"

Günlükleri manuel olarak okumak oldukça fazla zaman ve çaba gerektirecektir. Bu nedenle, deneyimli web yöneticileri "Günlük dosyası analizörleri" adı verilen özel yazılımlar kullanır. İnsan okuması için oldukça zor olan tüm verileri analiz eder ve yapılandırılmış veri üretirler. Bunlar aşağıdaki gibi programlardır: Analog, WebAnalizer, Webalizer, Awstats, Webtrends, vb.özel çeşitler yazılım oldukça fazla, aralarında var ücretli programlar, hem de ücretsiz. Bu nedenle, herkesin beğenisine göre bir şeyler bulacağından eminim.

Site günlüklerini nerede bulabilirim?

Düzenli barındırma hizmetiniz varsa, büyük olasılıkla barındırma sağlayıcınıza yazmanız ve ondan günlükleri istemeniz gerekecektir. Ayrıca, sıklıkla bunları ana bilgisayar paneli aracılığıyla talep edebilirsiniz. Farklı ana bilgisayarlar bunu farklı şekilde yapar. Örneğin, barındırma sağlayıcımdan talepte bulunmak için, sadece bir tıklama yapın. ana sayfa paneller:


Sunucunun sistem klasörlerine erişiminiz varsa, günlükleri şu adreste bulabilirsiniz: /etc/httpd/logs/access_log 100 vakanın 99'unda.

Hata günlüğü error.log

Hata.log- günlüklerin de tutulduğu bir dosya. Ancak ziyaretçiler değil, sunucuda meydana gelen hatalar. durumda olduğu gibi erişim günlüğü, dosyanın her satırı meydana gelen bir hatadan sorumludur. Kayıt, hatanın oluştuğu kesin tarih ve saat, hatanın verildiği IP adresi, hatanın türü ve oluşma nedeni gibi bilgiler dikkate alınarak yapılır.

Çözüm

Günlükler, çalışmak için oldukça güçlü ve bilgilendirici bir araçtır. Ancak günümüzde bunların yerini Yandex.Metrica, Google Analytics vb. Araçlar alıyor ve bu sayede hayatımızı kolaylaştırıyor. Ancak gelişmeyi, büyümeyi ve yeni bir şeyler öğrenmeyi planlıyorsanız kesinlikle bu konuyu daha iyi tanımanızı tavsiye ederim.

MySQL'de sorgu profili oluşturma uygulamanızın performansını değerlendirmek için kullanılır. Orta ve büyük ölçekli uygulamalar geliştirirken, kodunuz boyunca dağıtılan ve her saniye yürütülen yüzlerce istekle uğraşmanız gerekir. Bir sorgu profili oluşturma tekniği olmadan, uygulamanızın performansının düşmesine neden olan şeyi bulmak çok zor olabilir.

MySQL'deki yavaş sorgu günlüğü nedir?

MySQL yavaş sorgu günlüğü, yavaş ve potansiyel olarak sorunlu sorguları işaretleyen bir günlüktür. MySQL bu işlevi varsayılan olarak destekler, ancak devre dışıdır. Belirli sunucu değişkenlerini ayarlayarak hangi isteklerle ilgilendiğimizi belirtebiliriz. Çoğu zaman, tamamlanması belirli bir süre alan sorgulara veya dizinleri doğru şekilde işlemeyen sorgulara ihtiyaç duyarız.

Profil oluşturma değişkenlerini ayarlama

İstek günlüğünü yapılandırmak için ana değişkenler:

yavaş_query_log G slow_query_log_file G long_query_time G / S log_queries_not_using_indexes G min_examined_row_limit G / S

Yorum: G - genel değişkenler, S - sistem değişkenleri

  • slow_query_log - günlük dahil boole değeri
  • slow_query_log_file - günlük dosyasına giden mutlak yol. Dizin sahibi kullanıcı olmalıdır mysqld ve dizinin doğru okuma ve yazma izinlerine sahip olması gerekir. Çoğu zaman, mysql arka plan programı bir kullanıcı olarak çalışır. mysql.

Kontrol etmek için aşağıdaki komutları çalıştırın:

Ps-ef | grep kutusu/mysqld | -d" " -f1'i kes

Komutun çıktısı size geçerli kullanıcı adını ve mysqld kullanıcı adını verecektir. /var/log/mysql dizinini kurmaya bir örnek:

cd /var/log sudo mkdir mysql sudo chmod 755 mysql sudo chown mysql:mysql mysql

  • long_query_time - sorgunun süresini kontrol etmek için saniye cinsinden süre. Örneğin, 5 değeri ile 5 saniyeden uzun her istek günlüğe kaydedilir.
  • log_queries_not_using_indexes - boole değeri, indeks kullanmayan sorguların kaydedilmesini sağlar. Bu tür sorgular analizde çok önemlidir.
  • min_examined_row_limit - analiz edilecek veri satırı sayısı için minimum değeri belirtir. 1000 değeri, 1000 satırdan az değer döndüren sorguları yoksayar.

Bu değişkenleri MySQL yapılandırma dosyasında MySQL GUI veya MySQL komut satırı aracılığıyla dinamik olarak ayarlayabilirsiniz. Değişkenler yapılandırma dosyasında belirtilmişse, sunucu bir sonraki başlatılışında bunları ayarlayacaktır. Bu dosya genellikle /etc, /usr, /etc/my.cnf veya /etc/mysql/my.cnf konumunda bulunur. Yapılandırma dosyasını aramak için komutlar şunlardır (bazen aramayı diğer kök dizinlere genişletmeniz gerekir):

/etc -my.cnf adını bul /usr -my.cnf adını bul

Dosyayı bulduğunuzda, bölüme gerekli değişkenleri ekleyin:

; ... slow-query-log = 1 yavaş-query-log-file = /var/log/mysql/localhost-slow.log long_query_time = 1 log-queries-not-use-index ; burada değere gerek yok

Değişiklikler yalnızca MySQL'i bir sonraki başlatışınızda etkili olacaktır, eğer parametreleri dinamik olarak değiştirmeniz gerekiyorsa, değişkenleri ayarlamak için diğer yöntemleri kullanın:

mysql> GLOBAL AYARLA yavaş_query_log = "AÇIK"; mysql> GLOBAL AYARLA slow_query_log_file = "/var/log/mysql/localhost-slow.log"; mysql> KÜRESEL AYARLA log_queries_not_using_indexes = "AÇIK"; mysql> OTURUMU AYARLA long_query_time = 1; mysql> OTURUMU AYARLA min_examined_row_limit = 100;

Değişkenlerin değerlerini aşağıdaki şekilde kontrol edebilirsiniz:

Mysql> "slow_query_log" GİBİ GLOBAL DEĞİŞKENLERİ GÖSTERİN; mysql> "long_query_time" GİBİ OTURUM DEĞİŞKENLERİNİ GÖSTER;

Dinamik kurulumun ana dezavantajı, sistem başlangıcında değerlerin kaybolacak olmasıdır. MySQL yapılandırmasında önemli parametreleri belirtmeniz önerilir.

Not Not: SET komutu aracılığıyla seçenekleri dinamik olarak ayarlamak ve bir yapılandırma dosyası kullanmak için sözdizimi biraz farklıdır, örn. slow_query_log / slow-query-log . Resmi DBMS belgelerinde sözdiziminin tam bir açıklamasını bulacaksınız. Option-Dosya biçimi, değerleri dinamik olarak ayarlarken yapılandırma dosyası, Sistem Değişken Adı - değişken adları için kullanılır.

Sorgu profil oluşturma için veri oluşturma

Profil oluşturma ayarlarının ana noktalarını ele aldık, şimdi bizi ilgilendiren sorguları oluşturacağız. Bu örnek bir koşuda kullanıldı MySQL sunucusu herhangi bir ön günlük ayarı olmadan. Örnek sorgular, hem MySQL GUI hem de DBMS komut araçları aracılığıyla çalıştırılabilir. Yavaş sorguların günlüğünü izlerken, genellikle bir bağlantıyla iki pencere açılır: biri sorguları çalıştırmak için, diğeri günlüğü görüntülemek için.

$> mysql -u -p mysql> VERİTABANI OLUŞTUR profile_sampling; mysql> profile_sampling KULLANIN; mysql> CREATE TABLE kullanıcıları (id TINYINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255)); mysql> INSERT INTO users (isim) DEĞERLER ("Walter"),("Skyler"),("Jesse"),("Hank"),("Walter Jr."),("Marie"),("Saul "),("Gustavo"),("Hector"),("Mike"); mysql> GLOBAL AYARLA yavaş_query_log = 1; mysql> GLOBAL AYARLA slow_query_log_file = "/var/log/mysql/localhost-slow.log"; mysql> GLOBAL AYARLA log_queries_not_using_indexes = 1; mysql> SET long_query_time = 10; mysql> SET min_examined_row_limit = 0;

Artık test verilerini içeren bir veri tabanımız var. Profil oluşturmaya başladık, ancak yanıt süresini ve satır sayısını kasıtlı olarak küçük tuttuk. Günlüğü görüntülemek için şu komutu kullanın:

Cd /var/log/mysql ls -l

Teorik olarak, veritabanında sorgulama yapmadığımız için günlük dosyası henüz mevcut olmamalıdır. Varsa, profil oluşturmanın daha önce yapılandırıldığı anlamına gelir ve bu, örneğin sonuçlarını bozabilir. Konsolda çalıştırın:

MySQL > profile_sampling KULLANIN; mysql> SEÇİN * KULLANICILARDAN NEREDE id = 1;

Sorgumuz tablodaki Birincil Anahtar dizinini kullanır. İstek, dizini kullanarak çok hızlı çalıştı, bu nedenle günlüğe yansıtılmaması gerekir. Günlük dosyasının oluşturulmamış olması gerektiğini unutmayın.

Şimdi aşağıdakileri yapın:

Mysql> SEÇİN * KULLANICILARDAN NEREDE isim = "Jesse";

Burada indeks kullanmadık. Şimdi bu isteği günlükte görmeliyiz:

Sudo cat /var/log/mysql/localhost-slow.log # Zaman: 140322 13:54:58 # [e-posta korumalı]: root @ localhost # Query_time: 0.000303 Lock_time: 0.000090 Rows_sent: 1 Rows_examined: 10 use profile_sampling; Zaman damgasını AYARLA=1395521698; SEÇİN * KULLANICILARDAN NEREDE isim = "Jesse";

Bir örnek daha ele alalım. Yanıtınızdaki satır sayısı için çıtayı yükseltin ve aşağıdaki sorguyu çalıştırın:

mysql> SET min_examined_row_limit = 100; mysql> SEÇİN * KULLANICILARDAN NEREDE isim = "Walter";

Talebe yanıtta 100 satırı geçmediğimiz için talep günlüğe yansıtılmayacaktır.

Not: Veriler günlükte görüntülenmiyorsa, öncelikle aşağıdaki faktörler dikkate alınmalıdır. İlki, günlük dosyasının saklandığı dizinin haklarıdır. Grup ve kullanıcı, mysqld kullanıcısıyla eşleşmelidir, haklar chmod 755 olmalıdır. İkincisi, profil oluşturma daha önce yapılandırılmış olabilir. Mevcut profil oluşturma değişkeni değerlerini yapılandırma dosyasından kaldırın ve sunucuyu yeniden başlatın veya değişkenleri dinamik olarak ayarlayın. Dinamik yöntemi kullandıysanız, oturumu kapatın ve MySQL konsolunda tekrar oturum açın.

Sorgu profil oluşturma verilerinin analizi

Yukarıdaki örneği göz önünde bulundurun:

# Saat: 140322 13:54:58 # [e-posta korumalı]: root @ localhost # Query_time: 0.000303 Lock_time: 0.000090 Rows_sent: 1 Rows_examined: 10 use profile_sampling; Zaman damgasını AYARLA=1395521698; SEÇİN * KULLANICILARDAN NEREDE isim = "Jesse";

Burada görüyoruz:

  • İsteğin başlatıldığı saat
  • İsteği yapan kullanıcı
  • Çalışma saatleri talepleri
  • Blok süresi
  • Seçilen satır sayısı
  • Ayrıştırılan satır sayısı

Bu veriler çok kullanışlıdır, çünkü onun yardımıyla sistem yavaşlamasının nedenini bulup ortadan kaldırabiliriz. Ayrıca, bir MySQL geliştiricisi veya yöneticisi sorunlu sorguları her zaman görebilecek ve bunları burada bulmanın uygulama kodunu incelemekten çok daha hızlı olduğunu belirtmek isterim. Uzun profil oluşturma ile düşük hızda çalışma koşullarını takip edebilirsiniz.

mysqldumpslow'u kullanma

Günlük sürekli olarak veri yazar, kural olarak ondan okunduğundan çok daha fazlasını yazar. -de büyük beden log, okumak sorunlu hale gelir. MySQL, günlük bütünlüğünü korumaya yardımcı olan mysqldumpslow aracını içerir. Programın kendisi MySQL ile birleştirilmiştir (Linux sistemlerinde). Çalıştırmak için kullanmak gerekli komut ve günlük dosyasının yolunu iletin:

/var/log/mysql/localhost-slow.log adresinde sudo mysqldumpslow -t 5 -s

Komutun çıktısını özelleştirmeye yardımcı olacak bir dizi seçenek vardır. Aşağıdaki örnekte, ortalama süreye göre sıralanmış son beş isteği göreceğiz. Sonuç olarak, günlüğü okumak çok daha uygun hale gelir. (günlükte gerçek değerleri göstermek için çıktı değiştirildi):

Sayı: 2 Süre=68,34s (136s) Kilit=0,00s (0s) Satır=39892974,5 (79785949), [e-posta korumalı] P INNER JOIN sayfa bağlantılarından PL.pl_title, P.page_title SEÇİN PL ON PL.pl_namespace = P.page_namespace WHERE P.page_namespace = N ...

Ne görüyoruz:

  • Sayı - günlükteki isteğin oluşum sayısı
  • Süre - ortalama ve toplam istek süresi
  • Kilit - masa kilit süresi
  • Satırlar - Seçilen satırların sayısı

Komut, sayısal ve dize sorgu verilerini hariç tutar, yani aynı WHERE yan tümcesine sahip sorgular aynı kabul edilir. Bu araç sayesinde sürekli günlüğe bakmak zorunda değilsiniz. Çok sayıda komut parametresi nedeniyle çıktıyı istediğiniz gibi sıralayabilirsiniz. pt-query-digest gibi benzer işlevselliğe sahip üçüncü taraf geliştirmeleri de vardır.

Talep Dökümü

Karmaşık sorguları parçalamanıza izin veren, dikkat etmeniz gereken bir araç daha var. Çoğu zaman, günlükten bir sorgu alıp doğrudan MySQL konsolunda çalıştırmanız gerekir. Öncelikle profil oluşturmayı etkinleştirmeniz ve ardından sorguyu çalıştırmanız gerekir:

Mysql > OTURUMU AYARLA profil oluşturma = 1; mysql> profile_sampling KULLANIN; mysql> SEÇİN * KULLANICILARDAN NEREDE isim = "Jesse"; mysql> PROFİLLERİ GÖSTER;

Profil oluşturma etkinleştirildikten sonra, SHOW PROFILES, Query_ID ile SQL deyimini birbirine bağlayan bir tablo gösterecektir. Eşleşen Query_ID'yi bulun ve aşağıdaki sorguyu çalıştırın (# yerine Query_ID'nizi yazın):

Mysql> SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=#;

Örnek çıktı:

SEQ STATE SÜRE 1 başlangıç ​​0.000046 2 kontrol izinleri 0.000005 3 açılış tablosu 0.000036

DURUM- istek yürütme sürecindeki bir adım, SÜRE- saniye cinsinden adım süresi. Bu araç çok sık kullanılmaz, ancak bazen yavaş bir isteğin nedenini belirlemede son derece yararlı olabilir.

Sütunların ayrıntılı açıklaması:

Ayrıntılı adım açıklaması:

Not: Bu araç, belirli sorguların ayrıştırılması dışında sunucu üretim modunda kullanılmamalıdır.

Yavaş sorgu günlüğünün performansı

Son soru, profil oluşturmanın bir bütün olarak sunucunun performansını nasıl etkilediğidir. Sunucunun üretim modunda, bu tür günlükleri oldukça güvenli bir şekilde kullanabilirsiniz, bunun ne CPU'yu ne de G/Ç'yi etkilememesi gerekir. Ancak log dosyasının boyutuna dikkat etmelisiniz, engelleyici bir hal almamalıdır. Ayrıca, deneyimlerime dayanarak, long_query_time değişkeninin değerinin 1 saniye veya daha fazlasına eşit olduğunu belirtmek isterim.

Önemli: tüm sorguları kaydetmek için profil oluşturma aracını - SET profil oluşturma = 1 - kullanmayın, örn. üretim modunda ve ağır yükler altında general_log değişkeni önerilmez.

Çözüm

Sorgu profili oluşturma, sorunlu bir sorguyu ayırmada ve genel performansı değerlendirmede çok yardımcı olabilir. Ayrıca bir geliştirici, MySQL sorgularının uygulamaları için nasıl çalıştığını öğrenebilir. mysqldumpslow aracı, sorgu günlüğünü görüntülemenize ve işlemenize yardımcı olur. Sorunlu sorguları belirledikten sonra, onları maksimum performans için ayarlamak kalır.




Tepe