จะดูล็อกไฟล์ใน MySQL ได้อย่างไร


176

ฉันได้อ่านแล้วว่าเซิร์ฟเวอร์ Mysql สร้างไฟล์บันทึกที่เก็บบันทึกกิจกรรมทั้งหมด - เช่นเวลาและสิ่งที่เรียกใช้แบบสอบถาม

ใครสามารถบอกฉันว่ามีอยู่ในระบบของฉันหรือไม่? ฉันจะอ่านมันได้อย่างไร

โดยทั่วไปฉันจำเป็นต้องสำรองฐานข้อมูลที่มีอินพุตที่แตกต่างกัน [สำรองข้อมูลระหว่างวันที่สองวัน] ดังนั้นฉันคิดว่าฉันต้องใช้ล็อกไฟล์ที่นี่นั่นเป็นสาเหตุที่ฉันต้องการทำมัน ...

ฉันคิดว่าบันทึกนี้จะต้องได้รับการรักษาความปลอดภัยอย่างใดเพราะข้อมูลที่ละเอียดอ่อนเช่นชื่อผู้ใช้และรหัสผ่านอาจถูกบันทึกไว้ [หากมีข้อสงสัยใด ๆ ที่จำเป็นต้องใช้] ดังนั้นจึงอาจปลอดภัยไม่สามารถมองเห็นได้ง่าย?

ฉันมีสิทธิ์เข้าถึงระบบในรูทฉันจะดูบันทึกได้อย่างไร

เมื่อฉันพยายามเปิด /var/log/mysql.log มันว่างเปล่า

นี่คือไฟล์ปรับแต่งของฉัน:

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
log = /var/log/mysql/mysql.log 
binlog-do-db=zero



user        = mysql
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
skip-external-locking

bind-address        = 127.0.0.1
#
# * Fine Tuning
#
key_buffer      = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

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

คำตอบ:


164

นี่เป็นวิธีง่ายๆในการเปิดใช้งาน ใน mysql เราจำเป็นต้องดูบันทึก 3 ครั้งซึ่งส่วนใหญ่ต้องการในระหว่างการพัฒนาโครงการ

  • The Error Log. มันมีข้อมูลเกี่ยวกับข้อผิดพลาดที่เกิดขึ้นในขณะที่เซิร์ฟเวอร์กำลังทำงาน (เช่นเซิร์ฟเวอร์เริ่มต้นและหยุด)

  • The General Query Log. นี่เป็นบันทึกทั่วไปของสิ่งที่ mysqld กำลังทำอยู่ (เชื่อมต่อตัดการเชื่อมต่อคำสั่ง)

  • The Slow Query Log. consistst ประกอบด้วยคำสั่ง SQL "ช้า" (ตามที่ระบุโดยชื่อ)

โดยค่าเริ่มต้นไม่มีการเปิดใช้งานไฟล์บันทึกใน MYSQL ข้อผิดพลาดทั้งหมดจะแสดงใน syslog ( /var/log/syslog)

หากต้องการเปิดใช้งานพวกเขาเพียงทำตามขั้นตอนด้านล่าง:

ขั้นที่ 1:ไปที่ไฟล์นี้ ( /etc/mysql/conf.d/mysqld_safe_syslog.cnf ) แล้วลบหรือคอมเม้นท์บรรทัดเหล่านั้น

ขั้นที่ 2:ไปที่ไฟล์ mysql conf ( /etc/mysql/my.cnf) และเพิ่มบรรทัดต่อไปนี้

หากต้องการเปิดใช้งานบันทึกข้อผิดพลาดให้เพิ่มการติดตาม

[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log

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

หากต้องการเปิดใช้งานบันทึกการสืบค้นทั่วไปให้เพิ่มการติดตาม

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

หากต้องการเปิดใช้งานการเพิ่มบันทึกการสืบค้นช้าให้ทำดังนี้

log_slow_queries       = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes

ขั้นที่ 3:บันทึกไฟล์และเริ่ม mysql ใหม่โดยใช้คำสั่งต่อไปนี้

service mysql restart

เพื่อเปิดใช้งานบันทึกที่รันไทม์, เข้าสู่ระบบเพื่อลูกค้า mysql ( mysql -u root -p) และให้

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';

ในที่สุดสิ่งหนึ่งที่ผมอยากจะพูดถึงที่นี่คือที่ผมอ่านจากบล็อก ขอบคุณ มันใช้งานได้สำหรับฉัน

คลิกที่นี่เพื่อเยี่ยมชมบล็อก


2
ฉันคิดว่าคุณลืม 'ที่จะเขียนบางสิ่ง ขั้นตอนที่ 1 ไม่สมบูรณ์และประโยคลิงก์ "บล็อก" หายไป
Athafoud

สวัสดี @Athafoud โปรดหาลิงก์ตอนนี้
loyola

3
บทความบล็อกที่เชื่อมโยงกล่าวถึงการปรับเปลี่ยน/etc/mysql/conf.d/mysqld_safe_syslog.cnfเฉพาะในกรณีที่จะเปิดใช้งานบันทึกข้อผิดพลาด อย่างไรก็ตามคำตอบนี้ตามที่เขียนไว้ในขณะนี้ดูเหมือนจะแนะนำสำหรับบันทึกใด ๆ
Melebius

2
เวอร์ชันเซิร์ฟเวอร์ของฉันคือ 5.6.35 คำตอบของ Ross Smith II ตรงนี้เหมาะกับฉัน ฉันมีชุดslow_query_log = 1;, slow_query_log_file = /var/log/mysql/mysql-slow-query.logและlong_query_time = 60ภายใต้ [mysqld] เมื่อฉันพยายามที่จะเริ่มต้นด้วยการกำหนดค่าของคุณเซิร์ฟเวอร์จะเริ่ม แต่ช้าซบเซาและมีข้อผิดพลาด ฉันเดาว่าเวอร์ชันแตกต่างกันและในรุ่นหลัง oracle ต้องการรวมชื่อตัวแปร IMHO 2 วินาทีนั้นไม่นาน
JackLeEmmerdeur

1
สิ่งที่เกี่ยวกับการอนุญาตในไฟล์เหล่านั้น? ฉันเคยเห็นในหลายกรณีไม่ได้สร้างไฟล์บันทึก
MagePsycho

42

คุณต้องเปิดใช้งานการบันทึกแบบสอบถามใน mysql

  1. แก้ไข /etc/my.cnf

    [mysqld]
    บันทึก = / tmp / mysql.log
    
  2. รีสตาร์ทคอมพิวเตอร์หรือบริการ mysqld

    บริการ mysqld รีสตาร์ท
    
  3. เปิด phpmyadmin / แอปพลิเคชันใด ๆ ที่ใช้คอนโซล mysql / mysql และเรียกใช้แบบสอบถาม

  4. cat /tmp/mysql.log (คุณควรเห็นข้อความค้นหา)


ไม่สำคัญแค่ตรวจสอบให้แน่ใจว่ามีการเรียกใช้
คิวรี

6
เส้นทางที่ไม่ถูกต้อง คุณมี /etc/my.cnf ควรเป็น /etc/mysql/my.cnf
mystic cola

39

บันทึก MySQL ถูกกำหนดโดยตัวแปรทั่วโลกเช่น:

  • log_error สำหรับบันทึกข้อความแสดงข้อผิดพลาด;
  • general_log_fileสำหรับไฟล์บันทึกการสืบค้นทั่วไป (ถ้าเปิดใช้งานโดยgeneral_log);
  • slow_query_log_fileสำหรับไฟล์บันทึกการสืบค้นที่ช้า (ถ้าเปิดใช้งานโดยslow_query_log);

หากต้องการดูการตั้งค่าและที่ตั้งให้เรียกใช้คำสั่งเชลล์นี้:

mysql -se "SHOW VARIABLES" | grep -e log_error -e general_log -e slow_query_log

หากต้องการพิมพ์ค่าบันทึกข้อผิดพลาดให้รันคำสั่งนี้ในเทอร์มินัล:

mysql -e "SELECT @@GLOBAL.log_error"

หากต้องการอ่านเนื้อหาของไฟล์บันทึกข้อผิดพลาดแบบเรียลไทม์ให้เรียกใช้:

sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")

หมายเหตุ: กดControl- Cเมื่อเสร็จสิ้น

เมื่อเปิดใช้งานบันทึกทั่วไปให้ลอง:

sudo tail -f $(mysql -Nse "SELECT CONCAT(@@datadir, @@general_log_file)")

หากต้องการใช้mysqlกับการเข้าถึงรหัสผ่านให้เพิ่ม-pหรือ-pMYPASSพารามิเตอร์ เพื่อให้จำได้คุณสามารถกำหนดค่าในของคุณ~/.my.cnfเช่น

[client]
user=root
password=root

ดังนั้นมันจะถูกจดจำในครั้งต่อไป


1
หรือหากคุณต้องการป้อนรหัสผ่านให้ลองทำดังนี้: mysql -p -se "SHOW VARIABLES" | grep -e log_error -e general_log -e slow_query_log
Paul Chernoch

9

ในไฟล์ (ฉันติดตั้ง LAMP) ของฉัน / etc / mysql /my.cnf ฉันพบสิ่งต่อไปนี้แสดงความคิดเห็นบรรทัดในส่วน [mysqld]:

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

ฉันต้องเปิดไฟล์นี้ในฐานะผู้ใช้ขั้นสูงด้วยเทอร์มินัล:

sudo geany /etc/mysql/my.cnf

(ฉันชอบใช้ Geany แทน gedit หรือ VI มันไม่สำคัญ)

ฉันเพิ่งทำเครื่องหมายคอมเม้นท์พวกเขาและบันทึกไฟล์จากนั้นทำการ mysql ใหม่อีกครั้ง

sudo service mysql restart

เรียกใช้หลายแบบสอบถามเปิดไฟล์ด้านบน (/var/log/mysql/mysql.log) และบันทึกอยู่ที่นั่น :)


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

8

จากคู่มืออ้างอิง MySQL:

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

ตรวจสอบ/var/lib/mysqlโฟลเดอร์


1
แต่ฉันไม่สามารถเปิดโฟลเดอร์ mysql ได้ ฉันคิดว่าเส้นทางของไฟล์บันทึกคือ /var/log/mysql/mysql.log แต่ฉันไม่สามารถเปิดได้ฉันควรทำอย่างไร
Arjun

2
ฉันจะทำให้ตัวเองรูตฉันคิดว่าฉันเป็นเจ้าของฉันติดตั้งเซิร์ฟเวอร์ฉันตั้งรหัสผ่านดังนั้นฉันควรจะเป็นเจ้าของยังคงถูกล็อคสำหรับฉันฉันจะเปิดมันได้อย่างไร
Arjun

1
ฉันบังคับซีดีในไดเรกทอรีนี้ (ฉันต้องสร้างผู้ใช้รูทซึ่งฉันลบในภายหลัง) แต่เมื่อฉันเห็นไฟล์นี้ฉันคิดว่าพวกเขาเข้ารหัส :) ดังนั้นฉันคิดว่านั่นไม่ใช่วิธีที่ดี
บรรทัด

ใช้sudo -sแล้วลองไปที่โฟลเดอร์ mysql
Rashedul Islam

คู่มือ MySQL เต็มไปด้วยความไม่สอดคล้องกันจำนวนมากทั้งสองวิธีไม่มีไดเรกทอรีดังกล่าวบน windows
user3338098

3

เพื่อเติมเต็มคำตอบของLoyolaเป็นมูลค่าการกล่าวขวัญว่าเป็นของ MySQL 5.1 log_slow_queriesจะเลิกใช้และถูกแทนที่ด้วยslow-query-log

การใช้log_slow_queriesจะทำให้คุณservice mysql restartหรือservice mysql startล้มเหลว


1
shell> mysqladmin flush-logs


shell> mv host_name.err-old backup-directory

7
ยินดีต้อนรับสู่ stackoverflow โปรดพิจารณาให้คำอธิบายเพิ่มเติมว่ารหัสในคำตอบของคุณเกี่ยวข้องกับคำถามของ OP อย่างไร นอกจากนี้โค้ดควรมีการเว้นวรรค 4 ช่องเพื่อให้การจัดรูปแบบเหมาะสม
Politank-Z

1

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

mysqld --general-log --general-log-file=/var/log/mysql.general.log

การยืนยันคำตอบอื่น ๆ ข้างต้นmysqld --help --verboseให้ค่าจากไฟล์ conf (ดังนั้นการรันด้วยตัวเลือกบรรทัดคำสั่งทั่วไปบันทึกเป็นเท็จ); ในขณะที่mysql -se "SHOW VARIABLES" | grep -e log_error -e general_logให้:

general_log     ON
general_log_file        /var/log/mysql.general.log

ใช้ไวยากรณ์ที่กระชับมากขึ้นเล็กน้อยสำหรับบันทึกข้อผิดพลาด:

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