จะแสดงข้อความค้นหาสุดท้ายที่เรียกใช้งานบน MySQL ได้อย่างไร


471

มีคำถาม / วิธีแสดงแบบสอบถามล่าสุดที่ดำเนินการบนเซิร์ฟเวอร์ทั้งหมดหรือไม่

คำตอบ:


793

สำหรับผู้ที่มีความสุขกับ MySQL> = 5.1.12 คุณสามารถควบคุมตัวเลือกนี้ได้ทั่วโลกในขณะใช้งานจริง:

  1. ปฏิบัติ SET GLOBAL log_output = 'TABLE';
  2. ปฏิบัติ SET GLOBAL general_log = 'ON';
  3. ดูที่ตาราง mysql.general_log

หากคุณต้องการที่จะส่งออกไปยังไฟล์แทนตาราง:

  1. SET GLOBAL log_output = "FILE"; เริ่มต้น
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

ฉันชอบวิธีนี้ในการแก้ไขไฟล์. cnf เพราะ:

  1. คุณไม่ได้แก้ไข my.cnfไฟล์และอาจเปิดการบันทึกอย่างถาวร
  2. คุณไม่ได้ตกปลารอบ ๆ ระบบไฟล์เพื่อค้นหาบันทึกการสืบค้น - หรือแย่กว่านั้นคือฟุ้งซ่านโดยความต้องการปลายทางที่สมบูรณ์แบบ /var/log /var/data/log /opt /home/mysql_savior/var
  3. คุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์และขัดขวางการเชื่อมต่อใด ๆ ในปัจจุบัน
  4. รีสตาร์ทเซิร์ฟเวอร์ทำให้คุณอยู่ในตำแหน่งที่คุณเริ่มต้น (โดยค่าเริ่มต้นยังคงปิดอยู่)

สำหรับข้อมูลเพิ่มเติมโปรดดู คู่มือการอ้างอิง MySQL 5.1 - ตัวแปรระบบเซิร์ฟเวอร์ - general_log


4
การออกแบบ UI ที่ยอดเยี่ยม อย่างไรก็ตามตารางบันทึก MySQL ใช้เครื่องมือ CSV จริง ๆ ดังนั้นคุณสามารถทำทุกอย่างที่ FlipMcF กล่าวในคำตอบเกี่ยวกับการเปิดใช้งานการบันทึกลงในตาราง general_log และมีหาง -f ของ general_log ดังนี้: tail -f / var / lib / mysql / mysql / general_log.CSV

2
ประณาม mysql doc สำหรับสิ่งนี้ไม่ได้ยิงพารามิเตอร์ตาราง ขอบคุณมาก.
Abhishek Dujari


6
อย่าลืมล้างตารางบันทึกทั่วไปเมื่อดำเนินการเสร็จแล้ว: "truncate table mysql.general_log"
pdwalker

1
ฉันได้ผลลัพธ์ด้วยวิธีนี้ แต่มีพารามิเตอร์แสดงตามเครื่องหมายคำถามเช่นเลือก foo จากแถบที่ x =? ฉันจะรับข้อความค้นหาทั้งหมดได้อย่างไร
okwap

43

คุณสามารถเปิดใช้งานบันทึกแบบสอบถามทั่วไปสำหรับการวินิจฉัยประเภทนั้น โดยทั่วไปคุณจะไม่บันทึกคำสั่ง SELECT ทั้งหมดบนเซิร์ฟเวอร์ที่ใช้งานจริง

แก้ไขการกำหนดค่า MySQL ของคุณเช่น /etc/mysql/my.cnf - ค้นหาหรือเพิ่มบรรทัดเช่นนี้

[mysqld]
log = /var/log/mysql/mysql.log

เริ่ม mysql เพื่อรับการเปลี่ยนแปลงใหม่ตอนนี้คุณทำได้แล้ว

tail -f /var/log/mysql/mysql.log

สวัสดีคุณสามารถดูข้อความค้นหาที่มา


4
general_log_file และ general_log ใน my.cnf ของฉัน
Martin Thoma

มันใช้งานได้ถ้าคุณต้องการรู้รีสตาร์ท mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar

1
เวอร์ชั่นใหม่กว่าของ Mac OS X (อย่างน้อยใน Mac OS X) ต้องการตัวเลือก general_log_file และ general_log แทน "log =" มิฉะนั้นคุณจะได้รับข้อผิดพลาดเช่นนี้: ข้อผิดพลาด / usr / local / mysql / bin / mysqld: ตัวเลือกที่ไม่ชัดเจน '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth

@ JaySheth ฉันพบข้อผิดพลาดใน Mariadb 10.2 ดังนั้นฉันไม่แน่ใจว่าเป็น Mac OS ที่เกี่ยวข้องเท่านั้น
user10089632

16

คุณสามารถทำสิ่งที่ไหลสำหรับการตรวจสอบบันทึกแบบสอบถาม mysql

เปิดไฟล์การกำหนดค่า mysql my.cnf

sudo nano /etc/mysql/my.cnf

ค้นหาบรรทัดต่อไปนี้ภายใต้[mysqld]หัวเรื่องและยกเลิกหมายเหตุบรรทัดเหล่านี้เพื่อเปิดใช้งานบันทึก

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

รีสตาร์ทเซิร์ฟเวอร์ mysql ของคุณเพื่อสะท้อนการเปลี่ยนแปลง

sudo service mysql start

ตรวจสอบบันทึกเซิร์ฟเวอร์ mysql ด้วยคำสั่งดังต่อไปนี้ใน terminal

tail -f /var/log/mysql/mysql.log


9

1) หากเปิดใช้งานการบันทึก mysql ทั่วไปเราสามารถตรวจสอบคำสั่งในไฟล์บันทึกหรือตารางตามสิ่งที่เราได้กล่าวถึงในการกำหนดค่า ตรวจสอบสิ่งที่เปิดใช้งานด้วยคำสั่งต่อไปนี้

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

ถ้าเราต้องการประวัติแบบสอบถามในตารางแล้ว

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

ลองดูตาราง mysql.general_log

หากคุณต้องการส่งออกไปยังไฟล์:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) นอกจากนี้เรายังสามารถตรวจสอบแบบสอบถามในไฟล์. mysql_history cat ~ / .mysql_history



4

หากเปิดใช้งานmysql binlogคุณสามารถตรวจสอบคำสั่งที่รันโดยผู้ใช้โดยดำเนินการคำสั่งต่อไปนี้ในคอนโซล linux โดยเรียกดูไดเรกทอรี mysql binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

การเปิดใช้งาน

[mysqld]
log = /var/log/mysql/mysql.log

หรือบันทึกทั่วไปจะมีผลต่อประสิทธิภาพของ mysql


เป็นไปได้ แต่เจ็บปวด มีประโยชน์มากขึ้นถ้าคุณต้องการดูว่าเกิดอะไรขึ้นในอดีต
pdwalker

2

หากคุณไม่ได้รู้สึกเหมือนเปลี่ยนการตั้งค่า MySQL คุณสามารถใช้ SQL Profiler เช่น "Neor โปรไฟล์ SQL" http://www.profilesql.com


2

หลังจากอ่านคำตอบของพอลฉันก็ไปขุดหาข้อมูลเพิ่มเติมเกี่ยวกับhttps://dev.mysql.com/doc/refman/5.7/en/query-log.html

ฉันพบรหัสที่มีประโยชน์จริง ๆ โดยบุคคล นี่คือบทสรุปของบริบท

(หมายเหตุ: รหัสต่อไปนี้ไม่ใช่ของฉัน)

สคริปต์นี้เป็นตัวอย่างในการรักษาความสะอาดของตารางซึ่งจะช่วยให้คุณลดขนาดตารางของคุณ หลังจากผ่านไปหนึ่งวันจะมีข้อความค้นหาบันทึกประมาณ 180k (ในไฟล์มันจะเป็น 30MB ต่อวัน)

คุณต้องเพิ่มคอลัมน์เพิ่มเติม (event_unix) จากนั้นคุณสามารถใช้สคริปต์นี้เพื่อรักษาความสะอาดของบันทึก ... มันจะอัปเดตการประทับเวลาเป็น Unix-timestamp ลบบันทึกที่เก่ากว่า 1 วันจากนั้นอัปเดต event_time ลงใน Timestamp จาก event_unix ... ฟังดูสับสนเล็กน้อย แต่มันใช้งานได้ดี

คำสั่งสำหรับคอลัมน์ใหม่:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

สคริปต์การล้างข้อมูล:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

เครดิตไปที่ Sebastian Kaiser (ผู้เขียนต้นฉบับของรหัส)

หวังว่าบางคนจะพบว่ามีประโยชน์อย่างที่ฉันทำ


น่าสนใจ คุณจะพลาดการค้นหาในระหว่างการล้างข้อมูลเว้นแต่ว่าคุณจะล็อก db ทั้งหมดก่อน มีปัญหาอื่น ๆ ที่อาจเกิดขึ้นที่นี่ หากเราอยู่ที่จุดนี้ของการบันทึก 'ต่อเนื่อง' ฉันจะใช้การบันทึกไฟล์หรือบันทึก bin และ rotator บันทึกนอกชั้นวาง
FlipMcF

1

คุณสามารถดูต่อไปนี้ใน linux

cd /root

ls -al

vi .mysql_history อาจช่วยได้


6
ดูเหมือนว่าจะใช้งานได้เฉพาะกับไคลเอนต์บรรทัดคำสั่ง mysql อย่างเป็นทางการเท่านั้นและสำหรับการสืบค้นที่ดำเนินการโดยผู้ใช้รูทเท่านั้น
golimar

คำถามบอกว่า 'เซิร์ฟเวอร์ทั้งหมด' ซึ่งทำให้คำตอบนี้ไม่ถูกต้อง สิ่งนี้จะแสดงข้อความค้นหาทั้งหมดที่ดำเนินการโดยไคลเอนต์เดียว
FlipMcF

หากเปิดใช้งาน mysql binlog คุณสามารถตรวจสอบคำสั่งที่รันโดยผู้ใช้โดยดำเนินการคำสั่งต่อไปนี้ในคอนโซล linux โดยเรียกดูไดเรกทอรี mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql เปิดใช้งาน [mysqld] log = / var / log / mysql / mysql.log หรือบันทึกประเภทจะมีผลต่อประสิทธิภาพของ mysql
Avinash Singh

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