Soru Sadece bir veritabanı için Yavaş Sorgu günlüğü


Özellikle bir veritabanı için yavaş sorgu günlüğünü etkinleştirebilir miyim?

Şu anda yaptığım şey tüm günlüğü excel'e almak ve daha sonra hangi veritabanının en yavaş olduğunu bulmak için bir pivot raporu çalıştırmak. Bu yüzden yavaş sorgu oluşumunu azaltma umuduyla o uygulamaya bazı değişiklikler yaptım ve yaptım. veriyi temizlemek için biraz zaman harcadığım pivot raporumu tekrar çalıştırmak yerine, sadece bir veritabanından yavaş sorguları almak istiyorum

mümkün?


7
2018-06-20 07:20


Menşei


Daha fazla öneri ekledim! - RolandoMySQLDBA


Cevaplar:


Belirli bir veritabanı için yavaş bir sorgu günlüğüne sahip olmak istiyorsanız biraz alışılmışın dışında bir şeyim var. MySQL 5.1.30 ve üstü için önerim yapmak üzere olduğum şeyi aklınızda bulundurun:

Adım 01) Bunları /etc/my.cnf dosyasına ekleyerek başlayın.

[mysqld]
log-output=TABLE
slow-query-log
slow-query-log-file=slow-queries.log

log-çıkış Genel kütüklerin çıkışını ve metin dosyaları yerine tablolar olmak için yavaş günlükleri belirtmenizi sağlar.

Adım 02) servis mysql restart

Slow_log adlı mysql şemasında bir tablo var

Bu mysql çalıştırmak

SHOW CREATE TABLE mysql.slow_log\G

Bir CSV tablosu olmalı.

Adım 03) MyISAM'a dönüştürün ve start_time sütunundaki Tabloyu İndeksleyin

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G

Böyle görünmeli

mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: CREATE TABLE `slow_log` (
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `query_time` time NOT NULL,
  `lock_time` time NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumtext NOT NULL,
  KEY `start_time` (`start_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

Sütunlardan birinin olduğuna dikkat edin db. Aşağıdaki gibi ek bir dizin eklemelisiniz:

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ADD INDEX db (db,start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G

Buradan üç (3) seçenekten birini gerçekleştirebilirsiniz.

Seçenek 1: İstediğiniz veritabanı ile sorgu mysql.slow_log

mysql> SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';

SEÇENEK 2: mysql.slow_log dosyasındaki tüm girdileri silin

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
DELETE FROM mysql.slow_log WHERE db <> 'whateverdbiwant';
SET GLOBAL slow_query_log = @old_log_state;

SEÇENEK 3: Sorgulama yapabilmeniz için tüm girişleri başka bir slow_log tablosuna kopyalayın.

DROP TABLE IF EXISTS mysql.my_slow_log;
CREATE TABLE mysql.my_slow_log LIKE mysql.slow_log;
ALTER TABLE mysql.my_slow_log DROP INDEX db;
ALTER TABLE mysql.my_slow_log DISABLE KEYS;
INSERT INTO mysql.my_slow_log SELECT * FROM mysql.slow_log db='whateverdbiwant';
ALTER TABLE mysql.my_slow_log ENABLE KEYS;

Bir şans ver !!!

UPDATE 2011-06-20 18:08 EDT

İstediğiniz ek bir alışılmışın dışında bir fikrim var.

MyISAM tablosunun .MYD ve .MYI'yi yavaş oturum için başka bir disk birimine taşımayı deneyin. Gerçek .MYD ve .MYI'nin yeni lokasyonuna symlink /var/lib/mysql/mysql/slow_log.MYD ve /var/lib/mysql/mysql/slow_log.MYI.

Bunun çılgın olduğunu düşünürdünüz, işte yine de hoşunuza gidecek başka bir fikir değil.

İkili günlüğe kaydetme zaten açıksa, yavaşı başka bir kutuya taşımak için çoğaltmayı ayarlayın. Dünyada bunu nasıl yapıyorsun?

Adım 01) Bu seçenek ile kurulum çoğaltma slave

[mysqld]
replicate-do-db=mysql

Adım 02) Köle üzerindeki yavaş günlüğü etkinleştirin

Adım 03) Master üzerinde bu komutu çalıştırın

SET SQL_LOG_BIN=0;
ALTER TABLE mysql.slow_log ENGINE=BLACKHOLE;

Kullanarak KARA DELİK depolama altyapısı Bu, disk G / Ç'sini ana bilgisayardaki yavaş günlüğe kaldırır. Slave, tek amacı mysql.slow_log için giriş toplamaktır.


7
2018-06-20 18:46



Çalışmalı, ancak tablolara giriş yapmak, performanslar için korkunç. - Kedare
yavaş sorgulama günlüğünü günlüğe kaydetme, performansı etkilememelidir. Muhtemelen, yavaş sorguların günlüğe kaydedilmesi sıklığı sunucunun yükü ve gücü ile ölçeklendirilir. - thinice
çok teşekkürler Bazı veriler toplandıktan sonra size geri bildirim vereceğim - Jason


MySQL'de bu tür seçeneklerin olduğunu düşünmüyorum, ancak alabileceğiniz yöntemler var. Google'da sizi aradım ve sorununuzu çözmenize yardımcı olabilecek bazı ilginç bağlantılar buldum.

Umarım bu yardımcı olur:

http://code.google.com/p/mysql-log-filter/

http://www.maatkit.org/doc/mk-query-digest.html


3
2018-06-20 07:52