Log semua kueri di mysql

279

Apakah mungkin bagi saya untuk mengaktifkan audit logging pada database mysql saya?

Saya pada dasarnya ingin memantau semua pertanyaan selama satu jam, dan membuang log ke file.

statis publik
sumber
8
Gandakan pertanyaan stackoverflow.com/q/650238/684229
TMS
Bagi pembaca manfaat: Jangan lewatkan untuk membaca pertanyaan di komentar di atas.
cakar
Anda dapat merujuk jawaban saya yang sudah ada yang diposting di sini dba.stackexchange.com/a/62477/6037
Peter Venderberghe

Jawaban:

166

Mulai mysql dengan opsi --log:

mysqld --log=log_file_name

atau tempatkan yang berikut ini di my.cnffile Anda :

log = log_file_name

Salah satu akan mencatat semua permintaan ke log_file_name.

Anda juga dapat mencatat hanya permintaan yang lambat menggunakan --log-slow-queriesopsi --log. Secara default, kueri yang memakan waktu 10 detik atau lebih lama dianggap lambat, Anda dapat mengubahnya dengan mengatur long_query_timeke jumlah detik yang harus dijalankan oleh kueri sebelum dicatat.

Robert Gamble
sumber
61
Itu harus pergi tanpa berkata, tetapi meninggalkan ini dihidupkan dalam kotak produksi akhirnya menjadi tidak menghibur dengan sangat cepat. g
ceejayoz
6
Jika Anda mengalami kesulitan mengaktifkan pencatatan dengan cara ini, periksa dua kali lipat bahwa pengguna mysql dapat menulis ke lokasi file yang sesuai.
Jon Topper
3
Apakah mungkin untuk mencatat hanya 1 partikel db / tabel?
Temujin
2
@Temujin phpmyadmin kini memiliki opsi 'pelacakan' untuk tabel tempat Anda menentukan log ('versi') dan itu akan menyimpan catatan pertanyaan yang memengaruhinya dengan informasi tentang waktu dan seluruh permintaan.
gadget00
3
Jawaban yang diterima ini harus dihapus atau diedit untuk mencerminkan fakta bahwa itu tidak berfungsi dengan MySQL 5.6. +.
itoctopus
233

( Catatan : Untuk mysql-5.6 + ini tidak akan berfungsi. Ada solusi yang berlaku untuk mysql-5.6 + jika Anda gulir ke bawah atau klik di sini .)

Jika Anda tidak ingin atau tidak dapat memulai kembali server MySQL, Anda dapat melanjutkan seperti ini di server Anda yang sedang berjalan:

  • Buat tabel log Anda di mysqldatabase
  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'
  • Aktifkan Pencatatan kueri pada database
SET global general_log = 1;
SET global log_output = 'table';
  • Lihat log
select * from mysql.general_log
  • Nonaktifkan Log kueri pada database
SET global general_log = 0;
Alexandre Marcondes
sumber
14
Saya tidak yakin apakah ini benar untuk setiap versi MySQL (Saya menggunakan 5.5), tetapi saya tidak harus membuat tabel. Saya mengikuti saran yang sama dikurangi membuat tabel, yang disebutkan di sini: stackoverflow.com/a/678310/135101
Tyler Collier
Mungkin itu sudah dibuat karena satu atau lain alasan, @TylerCollier
Alexandre Marcondes
3
Perlu dicatat bahwa CREATE TABLEperintah harus (jika tabel belum ada) dieksekusi pada mysqldatabase, bukan pada database yang dibuat pengguna. Mungkin pernyataan SQL dapat diperbarui untuk mencerminkan hal itu.
Robert Rossmann
2
Untuk melihat log SELECT * FROM mysql.general_log order by (event_time) descakan lebih baik. hanya mengatakan. :-)
vinrav
Jangan setuju dengan catatan - dengan versi server 5.6.37 berfungsi sepenuhnya dengan benar. Terima kasih.
Dmitriy Olhovsky
215

Selain apa yang saya temui di sini, menjalankan berikut ini adalah cara paling sederhana untuk membuang kueri ke file log tanpa memulai ulang

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

dapat dimatikan dengan

SET global general_log = 0;
Ram
sumber
6
Benar-benar menyukai ini, berfungsi untuk koneksi yang ada dan yang baru di DB
Carlton
1
Ada beberapa entri Statistik - tidak yakin apa itu tetapi, jika tidak, berfungsi dengan sangat baik.
Snowcrash
Agar ini berfungsi, pengguna Anda harus memiliki hak SUPER yang merupakan hak istimewa DB global dan karenanya tidak dapat terbatas pada skema atau tabel tertentu:GRANT SUPER ON *.* TO user1@localhost
RobM
Saya akan memperbaikinya lebih dari sekali jika saya bisa, saya punya bookmark yang menunjuk ke sini :) Terima kasih banyak!
resi
125

Jawaban teratas tidak berfungsi di mysql 5.6+. Gunakan ini sebagai gantinya:

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

di file my.cnf / my.ini Anda

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.

alexeydemin
sumber
1
Jika Anda telah menggunakannya, dapatkah Anda memberi tahu saya dampak kinerja di atas, dan apakah lebih bijak jika mengaktifkan cara ini?
Ramesh Pareek
1
Dampak kinerja Ramesh tampaknya sekitar 5-15% penurunan kinerja. Info lebih lanjut di sini percona.com/blog/2009/02/10/...
Firze
1
Saya tidak mengerti mengapa Mysql 5.6 tidak mengizinkan file log disetel dari kueri? Bagaimana cara mencatat semua permintaan di MySQL 5.6 dan yang lebih baru ketika Anda tidak memiliki akses ke pohon direktori server tetapi hanya phpMyAdmin?
Vicky Dev
restart layanan mysql dari panel kontrol xampp setelah perubahan ini.
Paramjeet
Ini bekerja untuk saya di lingkungan Apache Xampp lokal saya, tetapi saya masih harus mengaktifkan logging via phpMyAdmin. Juga, itu tidak dapat menemukan file di folder / usr / log, juga tidak akan membuatnya, tapi itu berfungsi dengan baikgeneral_log_file=filename.log
JoeP
36

Aktifkan log untuk tabel

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

Lihat log dengan kueri pemilihan

select * from mysql.general_log
Vipin Yadav
sumber
apakah ada wildcard untuk mencatat semua tabel? (ada cukup banyak: C)
RicardoE
Terima kasih, pengaturan ini sangat berguna bagi saya karena saya tidak dapat menghapus server mysql. Saya juga ingin log muncul di log-table
Gunnar Sigfusson
14

Cara cepat untuk mengaktifkan MySQL General Query Log tanpa memulai ulang.

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

Saya telah menginstal mysql melalui homebrew, versi mysql: mysql Ver 14.14 Distrib 5.7.15, untuk osx10.11 (x86_64) menggunakan EditLine wrapper

Nanhe Kumar
sumber
6

Sebagai catatan, general_log dan slow_log diperkenalkan pada 5.1.6:

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

5.2.1. Memilih Tujuan Umum dan Tujuan Output Log Kueri Lambat

Pada MySQL 5.1.6, MySQL Server menyediakan kontrol fleksibel atas tujuan output ke log kueri umum dan log kueri lambat, jika log tersebut diaktifkan. Tujuan yang mungkin untuk entri log adalah file log atau tabel general_log dan slow_log dalam database mysql

Marcello Romani
sumber
5

Anda harus menyadari bahwa login mysql benar-benar berdampak pada kinerja, tetapi itu bisa menjadi hal yang bijaksana untuk dilakukan.

Saya biasanya membiarkannya di server dev (kecuali ketika itu membuat kita gila :))

Lea de Groot
sumber
2

Versi OS / mysql:

$ 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

Menambahkan pencatatan (contoh, saya pikir /var/log/...ini bukan jalur terbaik di Mac OS tetapi berhasil:

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

Restart Mysql

Hasil:

$ 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
Raphvanns
sumber
1

Jika menggunakan AWS RDS MYSQL, panduan langkah demi langkah di sini.

Ketika ditetapkan sebagai output 'file' Anda dapat melihat log langsung dari AWS RDS "Log" Console.

AWS RDS MYSQL Logging

Gonzalo Gallotti
sumber