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

mariadb can't lock aria control file.

หลังจากติดตั้ง mariadb แล้วก็เจอ error ว่า Can't lock aria control file '/srv/dbs/mariadb/aria_log_control' for exclusive use, error: 11. Will retry for 30 seconds พยายามค้นหาก็เจอวิธีการให้ลบไฟล์ aria_log.00000001 aria_log_control เมื่อลบแล้วก็เข้า mariadb ไม่ได้ ค้นหาในอินเตอร์เน็ตให้ลบไฟล์ ib_logfile0 เมื่อลบแล้วก็ลองสตาร์ mariadb ด้วยคำสั่ง service mariadb start ก็ผ่านไปด้วยดี

ดึงข้อมูลออกจาก 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 ตั้งแต่เริ่มตั้นนั่นแหละ ซึ่งจะช้าหรือเร็วก็ขึ้นอยู่กับความเร็วในการเขียนข้อมูลในเซิร์ฟเวอร์นั้นๆ

Debian: mariadb server

จู่ๆ ก็ไม่สามารถสตาร์ท mariadb ได้ และเมื่อใช้ journalctl -xe ก็เห็น error ดังนี้ 

Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=1517212349,1517212349
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] InnoDB: Missing FILE_CHECKPOINT at 1517212349 between the checkpoint 1517212349 and the end 1517212361.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [Note] InnoDB: Starting shutdown...
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Plugin 'InnoDB' init function returned error.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [Note] Plugin 'FEEDBACK' is disabled.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Unknown/unsupported storage engine: InnoDB
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Aborting
Oct 29 23:21:16 db1 systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE

ค้นหาในเน็ตก็ไม่รู้สาเหตุแต่มีวิธีแก้ไข คือ ลบไฟล์ /var/lib/mysql/ib_logfile* ออกก็ใช้ได้เลย เดี๋ยวจะหาสาเหตุอีกที

วันพุธที่ 27 ตุลาคม พ.ศ. 2564

ปัญหาเมื่อเพิ่ม /dev/sdb ใน Debian 11

หลังจากที่เพิ่ม Storage ให้กับ Debian 11 แล้วก็เจอปัญหาหลายอย่างก็แก้ไขไปทีละเปาะ จนถึงปัญหาพบข้อความตอนบูทว่า  

#dmesg | grep sdb

[    2.956200] sd 3:0:0:0: [sdb] 16777216 512-byte logical blocks: (8.59 GB/8.00 GiB)
[    2.956305] sd 3:0:0:0: [sdb] Write Protect is off
[    2.956310] sd 3:0:0:0: [sdb] Mode Sense: 04 00 10 00
[    2.956537] sd 3:0:0:0: [sdb] Incomplete mode parameter data
[    2.956594] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[    2.989959]  sdb: sdb1
[    3.012033] sd 3:0:0:0: [sdb] Attached SCSI disk
[   11.313582] EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)


ปัญหาคงอยู่ที่การเม้าท์ /dev/sdb นี่แหละ คงต้องตรวจสอบและแก้ไขกันต่อไป

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

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