MySQL içindeki tüm sorguları günlüğe kaydet


279

MySQL veritabanımda denetim günlüğünü açmam mümkün mü?

Temelde bir saat boyunca tüm sorguları izlemek ve bir dosyaya günlük dökümü istiyorum.



Okuyucuların yararı için: Yukarıdaki yorumda soruyu okumayı kaçırmayın.
pençeler

Yanıtlar:


166

Mysql'yi --log seçeneği ile başlatın:

mysqld --log=log_file_name

veya my.cnfdosyanıza aşağıdakileri yerleştirin :

log = log_file_name

Her ikisi de tüm sorguları log_dosya_adı'na kaydeder.

Bunun --log-slow-queriesyerine seçeneği kullanarak yalnızca yavaş sorguları günlüğe kaydedebilirsiniz --log. Varsayılan olarak, 10 saniye veya daha uzun süren sorgular yavaş kabul edilir; bunu, long_query_timesorgunun günlüğe kaydedilmeden önce yürütmesi gereken saniye sayısına ayarlayarak değiştirebilirsiniz .


61
Söylemeden geçmeli, ancak bunu bir üretim kutusunda açık bırakmak çok hızlı bir şekilde eğlenceli olmamaya başlar. g
ceejayoz

6
Bu şekilde günlüğe kaydetmeyi etkinleştirmekte sorun yaşıyorsanız, mysql kullanıcısının uygun dosya konumuna yazıp yazamayacağını iki kez kontrol edin.
Jon Topper

3
Sadece 1 partikül db / tablo üzerinden sorgu kaydı yapılabilir mi?
Temujin

2
@Temujin phpmyadmin artık bir günlük ('sürüm') belirttiğiniz tablolar için bir 'izleme' seçeneğine sahiptir ve zaman ve tüm sorgu ile ilgili bilgileri etkileyen sorguların kaydını tutacaktır.
gadget00

3
Kabul edilen bu cevap, MySQL 5.6. + İle çalışmadığı gerçeğini yansıtacak şekilde silinmeli veya düzenlenmelidir.
itoctopus

233

( Not : mysql-5.6 + için bu işe yaramaz. Aşağı kaydırırsanız veya burayı tıklatırsanız mysql-5.6 + için geçerli bir çözüm vardır .)

MySQL sunucusunu istemiyorsanız veya yeniden başlatamıyorsanız, çalışan sunucunuzda şu şekilde devam edebilirsiniz:

  • Günlük tablolarınızı mysqlveritabanında oluşturun
  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,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  CREATE TABLE `general_log` (
   `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `command_type` varchar(64) NOT NULL,
   `argument` mediumtext NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
  • Veritabanında sorgu günlüğünü etkinleştir
SET global general_log = 1;
SET global log_output = 'table';
  • Günlüğü görüntüle
select * from mysql.general_log
  • Veritabanında Sorgu günlüğünü devre dışı bırak
SET global general_log = 0;

14
Bu MySQL (5.5 üzerinde olduğum) her sürümü için doğru olup olmadığından emin değilim, ama tabloları oluşturmak zorunda değildi. Aynı tavsiyeyi ekleyerek burada belirtilen tabloları oluşturarak izledim: stackoverflow.com/a/678310/135101
Tyler Collier

Belki bir sebepten ötürü yaratılmıştır, @TylerCollier
Alexandre Marcondes

3
CREATE TABLEKomutların (tablolar zaten yoksa) mysqlkullanıcı tarafından oluşturulan veritabanlarında değil veritabanında yürütülmesi gerektiği unutulmamalıdır . SQL ifadeleri bunu yansıtacak şekilde güncellenebilir.
Robert Rossmann

2
Günlüğü görüntülemek için SELECT * FROM mysql.general_log order by (event_time) descdaha iyi olacaktır. sadece söyleyerek. :-)
vinrav

Not etmeyin - sunucu sürümü 5.6.37 ile tam olarak çalışır. Teşekkürler.
Dmitriy Olhovsky

215

Burada karşılaştığım şeyin yanı sıra, aşağıdakileri çalıştırmak, sorguları yeniden başlatmadan bir günlük dosyasına dökmenin en basit yoluydu

SET global log_output = 'FILE';
SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
SET global general_log = 1;

ile kapatılabilir

SET global general_log = 0;

6
Bunu kesinlikle seviyorum, DB'deki mevcut ve yeni bağlantılar için çalışıyor
Carlton

1
Bazı İstatistik girişleri vardı - bunların ne olduğundan emin değilim, ancak aksi takdirde gerçekten iyi çalışıyor.
Kar Yağışı

Bunun çalışması için kullanıcı, küresel bir DB ayrıcalığı olan ve bu nedenle belirli şemalar veya tablolarla sınırlandırılamayan SUPER ayrıcalığına sahip olmalıdır:GRANT SUPER ON *.* TO user1@localhost
RobM

Eğer yapabilseydim, burada işaret eden bir yer imi var :) Çok teşekkürler!
resi

125

Üst yanıt mysql 5.6 ve sonraki sürümlerinde çalışmaz. Bunun yerine şunu kullanın:

[mysqld]
general_log = on
general_log_file=/usr/log/general.log

my.cnf / my.ini dosyanızda

Ubuntu / Debian : /etc/mysql/my.cnf
Windows : c: \ ProgramData \ MySQL \ MySQL Server 5.x
wamp : c: \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp : c: \ xampp \ mysql \ bin \ my.ini.


1
Eğer kullandıysanız, yukarıdakilerin performans etkisini söyleyebilir misiniz ve bu şekilde günlüğe kaydetmeyi etkinleştirmek akıllıca olur mu?
Ramesh Pareek

1
Ramesh performansının etkisi performansta% 5-15'lik bir azalma gibi görünüyor. Daha fazla bilgi için burada percona.com/blog/2009/02/10/…
Firze

1
Neden Mysql 5.6 günlük dosyasının sorgulardan ayarlanmasına izin vermediğini anlamıyorum? Sunucu dizini ağacına erişiminiz olmadığında, yalnızca MySQL 5.6 ve sonraki sürümlerindeki tüm sorguları nasıl günlüğe kaydedebilirim phpMyAdmin?
Vicky Dev

bu değişikliklerden sonra mysql hizmetini xampp kontrol panelinden yeniden başlatın.
Paramjeet

Bu benim yerel Xampp Apache ortamında benim için çalıştı, ama yine de phpMyAdmin ile oturum açmak zorunda kaldı. Ayrıca, dosyayı / usr / log klasöründe bulamadı, ya da oluşturmaz, ancak şu şekilde iyi çalıştıgeneral_log_file=filename.log
JoeP

36

Tablo için günlüğü etkinleştir

mysql> SET GLOBAL general_log = 'ON';
mysql> SET global log_output = 'table';

Seçme sorgusuna göre günlüğü görüntüleme

select * from mysql.general_log

Tüm tabloları günlüğe kaydetmek için joker karakter var mı? (oldukça fazla var: C)
RicardoE

Teşekkürler, mysql sunucusunu indiremediğim için bu ayar benim için çok yararlı oldu. Ayrıca kütüğün kütük tablosunda görünmesini istiyorum
Gunnar Sigfusson

14

MySQL Genel Sorgu Günlüğünü yeniden başlatmadan etkinleştirmenin hızlı yolu.

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';

Mysql'i homebrew, mysql sürümü üzerinden yükledim: mysql Ver 14.14 Dağıtım 5.7.15, osx10.11 (x86_64) için EditLine sarıcı kullanarak


6

Kayıt için, general_log ve slow_log 5.1.6'da tanıtıldı:

http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html

5.2.1. Genel Sorgu ve Yavaş Sorgu Günlüğü Çıktı Hedeflerini Seçme

MySQL 5.1.6'dan itibaren, MySQL Server, bu günlükler etkinleştirilmişse, genel sorgu günlüğüne ve yavaş sorgu günlüğüne çıkış hedefi üzerinde esnek kontrol sağlar. Günlük girişleri için olası hedefler günlük dosyaları veya mysql veritabanındaki general_log ve slow_log tablolarıdır


5

MySQL oturum açmanın performansı gerçekten etkilediğinin farkında olmalısınız, ancak bunun yapılması akıllıca bir şey olabilir.

Genellikle dev sunucusunda bırakıyorum (bizi delirttiği durumlar hariç :))


2

OS / mysql sürümü:

$ uname -a
Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper

Günlük ekleme (örnek, /var/log/...Mac OS'de en iyi yol olduğunu düşünmüyorum ama işe yaradı:

sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf

[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log

Yeniden başlatılmış MySQL

Sonuç:

$ sudo tail -f /var/log/mysql/mysqld_general.log
181210  9:41:04    21 Connect   root@localhost on employees
           21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
           21 Query SET NAMES latin1
           21 Query SET character_set_results = NULL
           21 Query SET autocommit=1
           21 Query SELECT USER()
           21 Query SELECT USER()
181210  9:41:10    21 Query show tables
181210  9:41:25    21 Query select count(*) from current_dept_emp

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.