บันทึกการสืบค้นทั้งหมดใน mysql


279

เป็นไปได้ไหมที่ฉันจะเปิดใช้งานการบันทึกการตรวจสอบบัญชีในฐานข้อมูล mysql ของฉัน

โดยทั่วไปฉันต้องการตรวจสอบคำค้นหาทั้งหมดเป็นเวลาหนึ่งชั่วโมงและทิ้งบันทึกไปยังไฟล์



เพื่อประโยชน์ของผู้อ่าน: อย่าพลาดอ่านคำถามในความคิดเห็นด้านบน
กรงเล็บ

คุณสามารถดูคำตอบที่ฉันมีอยู่โพสต์ได้ที่นี่dba.stackexchange.com/a/62477/6037
Peter Venderberghe

คำตอบ:


166

เริ่ม mysql ด้วยตัวเลือก --log:

mysqld --log=log_file_name

หรือวางสิ่งต่อไปนี้ในmy.cnfไฟล์ของคุณ:

log = log_file_name

คนใดคนหนึ่งจะเข้าสู่ระบบแบบสอบถามทั้งหมดเพื่อ log_file_name

นอกจากนี้คุณยังสามารถเข้าสู่ระบบคำสั่งช้าเพียงแค่ใช้ตัวเลือกแทน--log-slow-queries --logตามค่าเริ่มต้นเคียวรีที่ใช้เวลา 10 วินาทีหรือนานกว่านั้นจะถือว่าช้าคุณสามารถเปลี่ยนแปลงสิ่งนี้ได้โดยการตั้งค่าlong_query_timeเป็นจำนวนวินาทีที่เคียวรีต้องดำเนินการก่อนที่จะถูกบันทึก


61
มันควรจะไปโดยไม่บอก แต่การทิ้งสิ่งนี้ไว้ในกล่องการผลิตก็จะกลายเป็นเรื่องที่ไม่สนุกสนานอย่างรวดเร็ว g
ceejayoz

6
หากคุณมีปัญหาในการเปิดใช้งานการบันทึกในลักษณะนี้ให้ตรวจสอบอีกครั้งว่าผู้ใช้ mysql สามารถเขียนไปยังตำแหน่งไฟล์ที่เหมาะสม
Jon Topper

3
เป็นไปได้หรือไม่ที่จะบันทึกการสืบค้นผ่าน 1 พาร์ทิชัน db / ตารางเท่านั้น
Temujin

2
@Temujin phpmyadmin ตอนนี้มีตัวเลือก 'การติดตาม' สำหรับตารางที่คุณระบุบันทึก ('รุ่น') และจะเก็บบันทึกการสืบค้นที่มีผลกับข้อมูลเกี่ยวกับเวลาและการสืบค้นทั้งหมด
gadget00

3
คำตอบที่ยอมรับนี้ควรถูกลบหรือแก้ไขเพื่อสะท้อนความจริงที่ว่ามันใช้ไม่ได้กับ MySQL 5.6. +
itoctopus

233

( หมายเหตุ : สำหรับ mysql-5.6 + สิ่งนี้จะไม่ทำงานมีวิธีแก้ไขสำหรับ mysql-5.6 + หากคุณเลื่อนลงหรือคลิกที่นี่ )

หากคุณไม่ต้องการหรือไม่สามารถรีสตาร์ทเซิร์ฟเวอร์ MySQL คุณสามารถดำเนินการเช่นนี้บนเซิร์ฟเวอร์ที่ใช้งานของคุณ:

  • สร้างตารางบันทึกของคุณบนmysqlฐานข้อมูล
  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;

14
ฉันไม่แน่ใจว่านี่เป็นจริงสำหรับ MySQL ทุกรุ่นหรือไม่ (ฉันใช้ 5.5) แต่ฉันไม่จำเป็นต้องสร้างตาราง ฉันทำตามคำแนะนำเดียวกันลบการสร้างตารางซึ่งถูกกล่าวถึงที่นี่: stackoverflow.com/a/678310/135101
Tyler Collier

อาจจะถูกสร้างขึ้นด้วยเหตุผลอย่างใดอย่างหนึ่ง @TylerCollier
Alexandre Marcondes

3
ควรสังเกตว่าCREATE TABLEคำสั่งควร (หากตารางที่ไม่มีอยู่) ถูกดำเนินการบนmysqlฐานข้อมูลไม่ใช่ในฐานข้อมูลที่ผู้ใช้สร้างขึ้น บางทีคำสั่ง SQL อาจได้รับการอัพเดตเพื่อสะท้อน
Robert Rossmann

2
สำหรับการดูบันทึกSELECT * FROM mysql.general_log order by (event_time) descจะทำได้ดีกว่า เพียงแค่พูดว่า :-)
vinrav

ไม่เห็นด้วยกับบันทึกย่อ - ด้วยเซิร์ฟเวอร์รุ่น 5.6.37 ทำงานได้อย่างถูกต้อง ขอบคุณ
Dmitriy Olhovsky

215

นอกจากสิ่งที่ฉันได้พบที่นี่การเรียกใช้สิ่งต่อไปนี้เป็นวิธีที่ง่ายที่สุดในการดัมพ์เคียวรีไปยังล็อกไฟล์โดยไม่ต้องรีสตาร์ท

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

สามารถปิดได้ด้วย

SET global general_log = 0;

6
รักนี้ใช้งานได้กับการเชื่อมต่อที่มีอยู่และใหม่ใน DB
Carlton

1
มีบางรายการสถิติ - ไม่แน่ใจว่าสิ่งเหล่านั้น แต่มิฉะนั้นทำงานได้ดีจริงๆ
Snowcrash

สำหรับการทำงานผู้ใช้ของคุณจะต้องมีสิทธิ์ SUPER ซึ่งเป็นสิทธิ์ DB ทั่วโลกและไม่สามารถ จำกัด เฉพาะ schema หรือตารางที่ต้องการ:GRANT SUPER ON *.* TO user1@localhost
RobM

ฉันอยากโหวตมากกว่าหนึ่งครั้งถ้าทำได้ฉันมีบุ๊คมาร์คชี้ไปที่นี่ :) ขอบคุณมาก!
resi

125

คำตอบยอดนิยมไม่ทำงานใน mysql 5.6+ ใช้สิ่งนี้แทน:

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

ในไฟล์ my.cnf / my.ini ของคุณ

Ubuntu / Debian : /etc/mysql/my.cnf
Windows : c: \ ProgramData \ MySQL \ MySQL เซิร์ฟเวอร์ 5.x
wamp : c: \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp : c: \ xampp \ MySQL \ bin \ my.ini


1
หากคุณใช้มันคุณสามารถบอกฉันถึงผลกระทบของประสิทธิภาพการทำงานข้างต้นได้หรือไม่และจะเป็นการดีถ้าเปิดใช้งานการบันทึกด้วยวิธีนี้
Ramesh Pareek

1
ผลกระทบด้านประสิทธิภาพของ Ramesh ดูเหมือนว่าจะลดลงประมาณ 5-15% ในด้านประสิทธิภาพ ข้อมูลเพิ่มเติมที่นี่percona.com/blog/2009/02/10/…
Firze

1
ฉันไม่เข้าใจว่าทำไม Mysql 5.6 ไม่อนุญาตให้ตั้งค่าไฟล์บันทึกจากการสืบค้น วิธีบันทึกการสืบค้นทั้งหมดใน MySQL 5.6 และใหม่กว่าเมื่อคุณไม่มีสิทธิ์เข้าถึงทรีไดเรกทอรีเซิร์ฟเวอร์ แต่จะทำphpMyAdminอย่างไร
Vicky Dev

เริ่มบริการ mysql จากแผงควบคุม xampp หลังจากการเปลี่ยนแปลงเหล่านี้
Paramjeet

สิ่งนี้ใช้ได้สำหรับฉันในสภาพแวดล้อม Xampp Apache ในพื้นที่ของฉัน แต่ฉันยังต้องเปิดการบันทึกผ่าน phpMyAdmin นอกจากนี้มันไม่สามารถค้นหาไฟล์ในโฟลเดอร์ / usr / log และจะไม่สร้างมันขึ้นมา แต่มันใช้ได้ดีเหมือนกันgeneral_log_file=filename.log
JoeP

36

เปิดใช้งานบันทึกสำหรับตาราง

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

ดูบันทึกโดยเลือกแบบสอบถาม

select * from mysql.general_log

มีไวด์การ์ดเพื่อบันทึกตารางทั้งหมดหรือไม่ (มีค่อนข้างมาก: C)
RicardoE

ขอบคุณการตั้งค่านี้มีประโยชน์มากสำหรับฉันเพราะฉันไม่สามารถลบเซิร์ฟเวอร์ mysql ได้ ฉันต้องการให้บันทึกปรากฏในตารางบันทึกด้วย
Gunnar Sigfusson

14

วิธีเปิดใช้งาน MySQL Query Log อย่างรวดเร็วโดยไม่ต้องเริ่มต้นใหม่

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

ฉันได้ติดตั้ง mysql ผ่าน homebrew, mysql เวอร์ชั่น: mysql Ver 14.14 Distrib 5.7.15, สำหรับ osx10.11 (x86_64) โดยใช้ EditLine wrapper


6

สำหรับเรกคอร์ด General_log และ slow_log ถูกนำเสนอใน 5.1.6:

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

5.2.1 การเลือกปลายทางทั่วไปของคิวรีแบบสอบถามและคิวรีเอาต์พุตของแบบสอบถาม

ในฐานะของ MySQL 5.1.6, เซิร์ฟเวอร์ MySQL ให้ความยืดหยุ่นในการควบคุมปลายทางของผลลัพธ์ไปยังบันทึกแบบสอบถามทั่วไปและบันทึกแบบสอบถามช้าถ้าเปิดใช้งานบันทึกเหล่านั้น ปลายทางที่เป็นไปได้สำหรับรายการบันทึกคือไฟล์บันทึกหรือตาราง general_log และ slow_log ในฐานข้อมูล mysql


5

คุณควรทราบว่าการเข้าสู่ระบบ mysql มีผลกระทบต่อประสิทธิภาพการทำงานจริง ๆ แต่อาจเป็นเรื่องที่ควรทำ

ฉันมักจะวางไว้บนเซิร์ฟเวอร์ dev (ยกเว้นเมื่อมันทำให้เราเสียสติ :))


2

เวอร์ชั่น 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

การเพิ่มการบันทึก (ตัวอย่างฉันไม่คิดว่า/var/log/...เป็นเส้นทางที่ดีที่สุดใน Mac OS แต่วิธีนี้ใช้ได้ผล:

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

เริ่ม Mysql ใหม่

ผลลัพธ์:

$ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.