แสดงบทความที่มีป้ายกำกับ MySQL แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ MySQL แสดงบทความทั้งหมด

วันเสาร์ที่ 30 ตุลาคม พ.ศ. 2564

ดึงข้อมูลออกจาก mysql_query.log

mysql จะมีออปชันสำหรับบันทึกเหตุการณ์หรือ log สำหรับการใช้คำสั่งของ sql โดยแบ่งออกเป็น 2 ส่วน คือ general และ slow queries สำหรับ general เป็นไฟล์เก็บข้อมูลคำสั่งทั้งหมดของ sql ที่รัน โดยไฟล์นี้จะใหญ่มาก ก็ต้องมีการจัดการให้ดี

ส่วน slow queries เป็นไฟล์เก็บคำสั่ง sql ที่สั่งรันแล้วใช้เวลานาน อาจจะตั้งไว้เช่น 1 วินาท 2 วินาที หรือตามที่เรากำหนด

ตัวอย่างไฟล์ mysql.log

 

ในกรณีนี้ผู้เขียนมีความต้องการดึงเอาเฉพาะคำสั่งที่เป็น SELECT ทั้งหมดออกจากไฟล์ เพื่อเอาไปรันในการจำลองการทำงาน และการดึงข้อมูลหนักๆ เพื่อวิเคราะห์ประสิทธิภาพของ mysql จากรูปแบบไฟล์แล้วจะต้องกำหนดขอบเขตดังนี้

  1. เลือกเฉพาะบรรทัดที่มีคำสั่ง SELECT
  2. ตัดเอาข้อความตั้งแต่ SELECT ไปจนหมดบรรทัด
  3. เพิ่มเครื่องหมาย ; ต่อท้ายในแต่ละบรรทัด
สุดท้ายให้เก็บไว้เป็นไฟล์ sql เพื่อให้โปรแกรมจำลองเปิดอ่านและสั่งรันคำสั่งเหล่านั้นภายหลัง หรือสั่งรันจากคำสั่งด้วย mysql client

1. เลือกเฉพาะบรรทัดที่มีคำสั่ง SELECT

คำสั่งที่ใช้
cat mysql.log | grep "SELECT " > mysql.txt

2. ตัดเฉพาะข้อความตั้งแต่ SELECT เป็นต้นไป

คำสั่งที่ใช้
grep -o "SELECT.*" mysql.txt > mysql_select.txt

3. เพิ่มเครื่องหมาย ; ต่อท้ายในแต่ละบรรทัด

คำสั่งที่ใช้
sed 's/$/ ;/' mysql_select.txt > mysql_select.sql

สุดท้ายก็จะได้ไฟล์ mysql_select.sql ที่เป็นคำสั่ง sql และมีเครื่องหมาย ; ปิดท้าย ทำให้เราสามารถใช้คำสั่ง mysql < mysql_select.sql ได้โดยไม่ต้องใช้โปรแกรมอื่นมาอ่านไฟล์แล้วส่งต่อไปยัง mysql


วันศุกร์ที่ 29 ตุลาคม พ.ศ. 2564

mysqldump และบีบอัดไฟล์

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

  • การสำรองฐานข้อมูลพร้อมทั้งบีบอัดไฟล์ที่ได้
$ mysqldump -u [uname] -p[pass] [dbname] | gzip -9 > [backupfile.sql.gz]

กรณี Restore ข้อมูล .gz

gunzip < [path-to-file-sql.gz] | mysql -u [uname] -p[pass] [db_name]


การบีบอัดไฟล์ทำให้ขนาดลดลงเป็นอย่างมาก จากข้อมูลประมาณ 8 ล้านรายการ หาก dump แบบไม่บีบอัดจะได้ขนาด 2.7 GB แต่ถ้าบีบอัดแล้วจะได้ประมาณ 300 MB เช่น

root@db1:/home/yothinin# ls -l
total 3062592
-rw-r--r-- 1 root root 2,794,506,060 Oct 29 11:55 db-20211027.sql
-rw-r--r-- 1 root root   341,575,683 Oct 30 01:57 db-20211030.sql.gz

root@db1:/home/yothinin# time gunzip < db-20211030.sql.gz | mysql sbt_db

real 26m43.499s
user 0m52.715s
sys 0m5.410s

จากข้อมูลข้างบนหลังจากที่นำเข้าข้อมูลจากไฟล์ที่บีบอัดใช้เวลา 26 นาที 43 วินาที ก็ถือว่าไม่นาน เพราะไฟล์ที่ไม่บีบอัดก็จะอยู่ที่ 24-28 นาทีสำหรับไฟล์ที่มีรายการประมาณ 8 ล้านรายการ

สรุปการสำรองข้อมูลจะใช้เวลาน้อยกว่าการคืนค่าข้อมูล เพราะการคืนค่าหรือการ restore นั้นระบบจะเพิ่มคำสั่งทีละคำสั่งเหมือนการทำงานของ mysql ตั้งแต่เริ่มตั้นนั่นแหละ ซึ่งจะช้าหรือเร็วก็ขึ้นอยู่กับความเร็วในการเขียนข้อมูลในเซิร์ฟเวอร์นั้นๆ

วันเสาร์ที่ 2 พฤษภาคม พ.ศ. 2563

ทำไมถึงเขียน ภาษา C และ Gtk+ 2.0

หลังจากที่เริ่มเขียนโปรแกรมภาษา C และ Gtk+ 2.0 มาได้ประมาณ 2 สัปดาห์ ก็มีหยุดบ้างทำบ้าง มีหายไปประมาณ 3-4 วัน และบางทีก็ทำสลับกับงานอื่นๆ ไป แต่บางครั้งก็นั่งหน้าจอมากกว่า 12 ชั่วโมง เพื่อค้นหาข้อมูล คิดหาวิธีการเขียนโปรแกรม บางทีเมื่อคิดไม่ออกก็เปลี่ยนไปนั่งทำอย่างอื่นบ้าง ไปหาข้อมูลเกี่ยวกับ Micro-controller หรือไม่ก็ไปไสไม้ทำกล่อง ทำชั้นเรื่อยเปื่อย

เดิมทีจะเขียนระบบ Digital Designage

ถึงตอนนี้การเขียนภาษา C โดยใช้ Gtk+ ก็ถือว่าก้าวหน้าไประดับหนึ่ง สามารถเขียนได้เป็นเรื่องเป็นราว แต่ก็ยังติดขัดปัญหาอยู่บ้าง บางทีก็ติดเรื่องหาตัวอย่างและข้อมูลไม่ได้ทันที กว่าจะเจอก็ใช้เวลานานพอควร

การเรียนรู้ก็เทียบเคียงกับการเขียนโปรแกรมอื่นๆ ในเรื่องหลักการโดยรวม เช่น สร้างหน้าจอรับข้อมูล หลักการก็ต้องมีช่องรับ เมื่อพิมพ์ก็สามารถตรวจสอบการกดปุ่มคีย์บอร์ดได้ด้วย ว่าพิมพ์ถูกหรือผิด มีการดักอีเวนท์ต่างๆ ของคีย์บอร์ด เมื่อกดปุ่ม enter ก็ให้เลื่อนไปอีกช่องหนึ่งหรือคอนโทรลอื่น เป็นต้น

ใน Gtk+ ก็มีสิ่งเหล่านี้รองรับหมดแล้ว และเหนือกว่าบางโปรแกรมด้วยซ้ำไป แต่ปัญหา คือ ตัวอย่างและเอกสารต่างๆ บางทีก็ยากที่จะเรียนรู้ หากเมื่อเทียบกับการเรียนรู้ FoxPro ในอดีต สิ่งหนึ่งที่ผู้เขียนชอบมาก คือ กดปุ่ม F1 เพื่ออ่าน Help ของโปรแกรม และแต่ละส่วนก็จะมีตัวอย่างให้เราพิมพ์ตาม จนแทบไม่ต้องหาจากหนังสือเลย (สมัยนั้นไม่มีแหล่งเรียนรู้ใน www ต้องหาจากหนังสือหรือ Help นี่แหละ และสมัยนั้นลงทุนซื้อหนังสือต่างประเทศราคา 2-3 พันบาทก็มี)

วันเสาร์ที่ 4 กุมภาพันธ์ พ.ศ. 2560

Qt: โหลด mysql แล้ว Error

กำลังพัฒนาระบบโดยใช้ MySQL เป็นฐานข้อมูล และใช้ Qt C++ เป็นตัวพัฒนาระบบ การทำงานแบบ GUI อื่นๆ ก็ใช้ได้ผลดี ง่ายต่อการใช้งานและเรียนรู้ แต่ประเด็นปัญหากับเกิดขึ้นเมื่อใช้ MySQL หรือ MariaDB โดยมีข้อความขณะรันโปรแกรมว่า

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

ดูจากข้อความที่ได้แล้วจะเห็นว่า Plugin เกี่ยวกับ SQL Database มีทั้งหมด 7 รายการรวมถึง MySQL ด้วย แต่ทำไมถึงบอกว่าไดร์เวอร์ไม่ได้โหลดใช้งาน

เข้าไปค้นใน google แล้วก็พบว่าปัญหาเกี่ยวกับ libmysql.dll ซึ่งเป็นตัวเชื่อมต่อไปยังฐานข้อมูล ให้คัดลอกไปไว้ในโฟลเดอร์ที่โปรแกรมทำงานด้วย ก็เข้าไปใน MariaDB คัดลอกไฟล์ไปแล้วก็ใช้ไม่ได้ เข้าไปโหลดทั้ง MaridDB Connector และ MySQL Connector ก็ยังใช้ไม่ได้

สุดท้ายเห็นเว็บบอร์ดแห่งหนึ่งบอกว่าให้โหลด MySQL Server แล้วขยายไฟล์และคัดลอกไฟล์ libmysql.dll ไปใช้งาน 

เอ้า ลองดูสิ 

ว้าว! มันใช้งานได้ ก็อดแปลกใจนิดๆ ว่าทำไม MySQL Connector ทำไมใช้ไม่ได้ ก็งงๆ ไปก่อนเดี๋ยวค่อยหาข้อมูลต่อว่าทำไมถึงเป็นเช่นนั้น


Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...