จะเปิดใช้งาน MySQL Query Log ได้อย่างไร?


252

ฉันจะเปิดใช้งานฟังก์ชั่น MySQL ที่บันทึกคำสั่งการสืบค้น SQL แต่ละคำสั่งที่ได้รับจากลูกค้าและเวลาที่คำสั่งการสอบถามส่งมาได้อย่างไร ฉันสามารถทำสิ่งนั้นใน phpmyadmin หรือ NaviCat ได้หรือไม่ ฉันจะวิเคราะห์บันทึกได้อย่างไร

คำตอบ:


301

อันดับแรกโปรดจำไว้ว่าไฟล์บันทึกการทำงานนี้สามารถเติบโตได้มากบนเซิร์ฟเวอร์ไม่ว่าง

สำหรับ mysql <5.1.29:

หากต้องการเปิดใช้งานบันทึกแบบสอบถามให้ใส่สิ่งนี้ลง/etc/my.cnfใน[mysqld]ส่วน

log   = /path/to/query.log  #works for mysql < 5.1.29

นอกจากนี้เพื่อเปิดใช้งานจากคอนโซล MySQL

SET general_log = 1;

ดูhttp://dev.mysql.com/doc/refman/5.1/en/query-log.html

สำหรับ mysql 5.1.29+

ด้วย mysql 5.1.29+ logตัวเลือกจะถูกคัดค้าน ในการระบุ logfile และเปิดใช้งานการบันทึกให้ใช้สิ่งนี้ใน my.cnf ใน[mysqld]ส่วน:

general_log_file = /path/to/query.log
general_log      = 1

อีกวิธีหนึ่งในการเปิดการบันทึกจากคอนโซล MySQL (ต้องระบุตำแหน่งไฟล์บันทึกอย่างใดหรือหาตำแหน่งเริ่มต้น):

SET global general_log = 1;

นอกจากนี้โปรดทราบว่ามีตัวเลือกเพิ่มเติมในการเข้าสู่ระบบเฉพาะแบบสอบถามที่ช้าหรือผู้ที่ไม่ได้ใช้ดัชนี


1
สิ่งนี้ไม่ทำงานใน MySQL 5.6.19 พวกเขาเปลี่ยนมันอีกครั้งหรือไม่?
Alex R

5
general_log = บน general_log_file = / path / to / query.log ทำงานให้ฉัน
Kiren Siva

27
สิ่งนี้ใช้ได้กับฉัน (MySQL 5.6.12 บน Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
คุณ

ตรวจสอบให้แน่ใจว่าสิทธิ์การเข้าถึงของผู้ใช้ mysql สำหรับล็อกไฟล์หรือจะส่งคืนข้อผิดพลาด 'ไม่พบ' เมื่อตั้งค่าพารามิเตอร์ general_log ในคอนโซล MySQL
Will R.

สำหรับ 5.6.22 @ คุณได้รับมันถูกต้อง ขอบคุณ! สิ่งเดียวที่จะทำให้แน่ใจว่ามีไดเรกทอรีและไฟล์ที่ถูกเขียนไปยังมีอยู่และสามารถเขียนได้โดย mysql
NightOwlPrgmr

189

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

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


นี่คือบทสรุป:

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

  • สร้างตารางบันทึกของคุณ (ดูคำตอบ )

  • เปิดใช้งานการบันทึกการสืบค้นในฐานข้อมูล (โปรดทราบว่าสตริง 'ตาราง' ควรใส่อย่างแท้จริงและไม่ถูกแทนที่ด้วยชื่อตารางใด ๆ ขอบคุณNicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • ดูบันทึก
select * from mysql.general_log;
  • ปิดใช้งานการบันทึกคิวรีบนฐานข้อมูล
SET global general_log = 0;

18
ควรสังเกตว่า 'table' หมายถึงการป้อนอย่างแท้จริงและไม่ได้แทนที่ด้วยชื่อตารางในฐานข้อมูลของคุณ
Nicholas Pickering

1
บน Mac OS X ตัวติดตั้งซอฟต์แวร์ MySQL ดูเหมือนจะสร้างตาราง general_log โดยอัตโนมัติด้วยประเภท CSV ซึ่งหมายความว่าฉันสามารถปรับแต่งไฟล์ CSV ที่สอดคล้องกัน: sudo tail -f -n 250 / usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

หลังจากการตั้งค่า global log_output = 'table'; การสืบค้นที่ช้าจะถูกเขียนไปยังไฟล์หรือไม่ ฉันคิดว่าหลังจาก SET ทั่วโลก general_log = 0; คุณควรตั้งค่า 'log_output' ก่อนหน้านี้อาจเป็น 'ไฟล์'
user2602807

59

ฉันใช้วิธีนี้ในการบันทึกเมื่อฉันต้องการเพิ่มประสิทธิภาพการโหลดหน้าเว็บที่แตกต่างกันอย่างรวดเร็ว มันเป็นเคล็ดลับเล็กน้อย ...

เข้าสู่ตาราง

SET global general_log = 1;
SET global log_output = 'table';

จากนั้นคุณสามารถเลือกจากของฉัน mysql.general_logตารางเพื่อเรียกค้นคิวรีล่าสุด

ฉันสามารถทำสิ่งที่คล้ายกับtail -fใน mysql.log แต่มีการปรับแต่งเพิ่มเติม ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

สิ่งนี้ทำให้ง่ายต่อการดูข้อความค้นหาของฉันที่ฉันสามารถลองและตัดทอน ฉันใช้ช่วงเวลา 8 วินาทีเพื่อดึงข้อมูลคำค้นหาที่ดำเนินการภายใน 8 วินาทีที่ผ่านมาเท่านั้น


57

นี่เป็นความเห็นอยู่แล้ว แต่สมควรได้รับคำตอบของตัวเอง: โดยไม่ต้องแก้ไขไฟล์ config: ใน mysql, เป็น root, ให้ทำ

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

อย่าลืมปิดหลังจากนั้น:

SET global general_log = off;

1
ฉันพบว่าภายใต้ Linux systemd หากคุณพยายามที่จะเข้าสู่ระบบไฟล์/tmp/มันอาจจะอยู่ที่ไหนสักแห่งเช่น/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley

14

คุณสามารถปิดการใช้งานหรือเปิดใช้งานบันทึกการสืบค้นทั่วไป (ซึ่งบันทึกการสืบค้นทั้งหมด) ด้วย

SET GLOBAL general_log = 1 # (or 0 to disable)

ในกรณีของฉันบันทึกแบบสอบถามทั่วไปไม่สามารถเปิดใช้งานบนเซิร์ฟเวอร์โฮสต์ที่ใช้ร่วมกัน ฉันสามารถเปิดใช้งานบันทึกการสืบค้นที่ช้าเท่านั้นและผู้ดูแลระบบสามารถจัดเตรียมรายการที่เกี่ยวข้องกับบัญชีของฉันตามคำขอ
Feng-Chun Ting

9

ฉันต้องการเปิดใช้งานล็อกไฟล์ MySQL เพื่อดูข้อความค้นหาและฉันได้แก้ไขปัญหานี้ด้วยคำแนะนำด้านล่าง

  1. ไปที่ /etc/mysql/mysql.conf.d
  2. เปิด mysqld.cnf

และเปิดใช้งานบรรทัดด้านล่าง

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. รีสตาร์ท MySQL ด้วยคำสั่งนี้ /etc/init.d/mysql restart
  2. ไปที่/var/log/mysql/และตรวจสอบบันทึก

มันก็โอเคที่จะบันทึกการตั้งค่าเหล่านั้นในไฟล์ conf เพื่อที่จะนำไปใช้ทุกครั้งที่ MySQL เริ่มต้น แต่คุณไม่จำเป็นต้องรีสตาร์ท MySQL เพื่อใช้การกำหนดค่านี้ คุณสามารถตั้งค่าโดยใช้ 'SET global' เหมือนที่คนอื่นพูด
แองเจิล


3

บน Windows คุณสามารถไปที่

C:\wamp\bin\mysql\mysql5.1.53\my.ini

แทรกบรรทัดนี้ในmy.ini

general_log_file = c:/wamp/logs/mysql_query_log.log

my.iniไฟล์ในที่สุดก็มีลักษณะเช่นนี้

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...

3

มีข้อผิดพลาดในรุ่น MySQL 5.6 แม้ mysqld แสดงเป็น:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

การตั้งค่าจริงๆกำลังอ่านตามลำดับต่อไปนี้:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

ตรวจสอบไฟล์: "เซิร์ฟเวอร์ C: \ ProgramData \ MySQL \ MySQL 5.6 \ my.ini"

หวังว่าจะช่วยใครซักคน


มีรายงานข้อผิดพลาดบางแห่งสำหรับข้อผิดพลาดนี้หรือไม่?
mwfearnley

1

สำหรับmysql> = 5.5เฉพาะสำหรับการสืบค้นที่ช้า (1 วินาทีขึ้นไป) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes

1
สิ่งนี้ไม่ถูกต้อง - ที่เปิดใช้งานบันทึกแบบสอบถามช้าไม่ใช่บันทึกแบบสอบถาม
Sam Dufel

ฉันคิดว่าคุณต้องใช้เครื่องหมายขีดกลาง
AFA Med

1

วิธีเปิดใช้งานบันทึกคิวรีในเครื่อง MAC:

เปิดไฟล์ต่อไปนี้:

vi /private/etc/my.cnf

ตั้งค่า url บันทึกการสืบค้นภายใต้ส่วน 'mysqld' ดังต่อไปนี้:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

มีเครื่องไม่กี่เครื่องที่ไม่ได้บันทึกการสืบค้นอย่างเหมาะสมดังนั้นในกรณีนี้คุณสามารถเปิดใช้งานได้จากคอนโซลของ MySQL

mysql> SET global general_log = 1;

1

ไม่ใช่คำตอบที่แน่นอนสำหรับคำถามเพราะคำถามมีคำตอบที่ดีอยู่แล้ว นี่คือข้อมูลด้านข้าง การเปิดใช้งาน general_log ทำให้ประสิทธิภาพของ MySQL ลดลง ฉันออกไปgeneral_log =1โดยไม่ตั้งใจบนเซิร์ฟเวอร์ที่ใช้งานจริงและใช้เวลาเป็นชั่วโมงในการหาสาเหตุที่ทำให้ประสิทธิภาพไม่เทียบเท่ากับการตั้งค่าที่คล้ายกันในเซิร์ฟเวอร์อื่น ๆ จากนั้นฉันพบสิ่งนี้ซึ่งอธิบายถึงผลกระทบของการเปิดใช้งานบันทึกทั่วไป http://www.fromdual.com/general_query_log_vs_mysql_performancehttp://www.fromdual.com/general_query_log_vs_mysql_performance

สรุปเรื่องราวไม่ต้องใส่general_log=1ใน.cnfไฟล์ แทนที่จะใช้set global general_log =1เวลาสั้น ๆ เพียงเพื่อเข้าสู่ระบบมากพอที่จะหาสิ่งที่คุณพยายามที่จะหาแล้วปิด


0

ใน phpMyAdmin 4.0 คุณไปที่สถานะ> การตรวจสอบ ในนั้นคุณสามารถเปิดใช้งานบันทึกแบบสอบถามช้าและบันทึกทั่วไปดูการตรวจสอบสดเลือกส่วนของกราฟดูแบบสอบถามที่เกี่ยวข้องและวิเคราะห์พวกเขา


0

ฉันต้องดรอปและสร้างบันทึกทั่วไปใหม่ ณ จุดหนึ่ง ในช่วงนันทนาการชุดตัวละครสับสนและฉันลงเอยด้วยข้อผิดพลาดนี้ในบันทึก:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

ดังนั้นหากคำตอบมาตรฐานของ "ตรวจสอบเพื่อให้แน่ใจว่าการบันทึกเปิดอยู่" ไม่ได้ผลสำหรับคุณตรวจสอบเพื่อให้แน่ใจว่าเขตข้อมูลของคุณมีชุดอักขระที่ถูกต้อง

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