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.
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.
Yanıtlar:
Mysql'yi --log seçeneği ile başlatın:
mysqld --log=log_file_name
veya my.cnf
dosyanıza aşağıdakileri yerleştirin :
log = log_file_name
Her ikisi de tüm sorguları log_dosya_adı'na kaydeder.
Bunun --log-slow-queries
yerine 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_time
sorgunun günlüğe kaydedilmeden önce yürütmesi gereken saniye sayısına ayarlayarak değiştirebilirsiniz .
( 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:
mysql
veritabanı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'
SET global general_log = 1;
SET global log_output = 'table';
select * from mysql.general_log
SET global general_log = 0;
CREATE TABLE
Komutların (tablolar zaten yoksa) mysql
kullanı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.
SELECT * FROM mysql.general_log order by (event_time) desc
daha iyi olacaktır. sadece söyleyerek. :-)
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;
GRANT SUPER ON *.* TO user1@localhost
Ü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.
phpMyAdmin
?
general_log_file=filename.log
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
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
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
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ç :))
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
AWS RDS MYSQL kullanılıyorsa, burada adım adım kılavuz.
'Dosya' çıkışı olarak ayarlandığında günlüğü doğrudan AWS RDS "Günlük" Konsolundan görüntüleyebilirsiniz.