My Geeky Weekends #4

เก็บตกของ My Geeky Weekends มีเรื่องราวน่าเขียนบันทึกไว้หลายประเด็นครับ เริ่มจากด้วยความที่เป็นการแก้ไข live site ก็เลยต้องมีการ download ข้อมูลทั้งหมดลงมาแก้ไขและทดลองจนกว่าจะมั่นใจว่าทำได้ถูกต้อง ถึงขึ้นไปทำที่บน server ระหว่างทางก็มีเรื่องสนุก (แบบ geek geek) อยู่พอสมควร

ดูด (dump) ข้อมูลจากฐานข้อมูล

อันนี้ไม่มีอะไรมากมาย คำสั่งพื้นฐาน

[shell] mysqldump —opt —skip-extended-insert -u <user> -p <database_name> [/shell]

ค้นหาข้อมูลแบบเร็ว ๆ จาก database dump

ด้วยความที่ WordPress บันทึกข้อมูลของเวบไซต์ โดยเฉพาะอย่างยิ่ง URL ไว้ในฐานข้อมูล เวลาจะเอาลงมาแก้ไขที่เครื่องนอก server ก็ต้องไปไล่แก้ในฐานข้อมูลด้วย จะแก้ด้วยการเปิดโปรแกรม command-line ก็ได้ หรือจะใช้ GUI ก็ได้ ด้วยความขี้เกียจ คุณคนเขียนก็หาใช้วิธีเขียน query รวม ๆ แล้วก็ส่งเข้าไปแก้ผ่าน command-line

แต่ทีนี้จะรู้ได้ยังไงว่าต้องแก้ที่ไหน ก็ต้องหา เช่น เวบไซต์ชื่อว่า livesite.dev เราก็ต้องไปมองหา string อันนี้จากฐานข้อมูล วิธีหาที่ง่ายที่สุดคือ หาจากข้อมูลที่ dump ออกมา แต่ถ้าระหว่างที่แก้ ๆ อยู่ต้องค้นหาอะไรเพิ่มเติมอีก จะ dump ใส่ไฟล์ตลอดเวลาก็จะปวดหัว เดี๋ยวทำไปทำมาทับต้นฉบับอีก ยุ่งยากกันใหญ่

คุณคนเขียนก็เลยใช้วิธี dump database ออกมา แล้วก็ pipe (|) เข้าโปรแกรม grep ไปเลย

สมมติจากคำสั่ง dump ข้างบน …

[shell] mysqldump —opt —skip-extended-insert -u <user> \ -p <database_name> | grep ‘<string>’ [/shell]

แต่ในกรณีที่ต้องการหา string แต่ไม่ต้องการให้แสดงคำบางคำ เราก็สามารถใช้ regular expression ในการตัดคำที่ไม่ต้องการออกได้

[shell] mysqldump —opt —skip-extended-insert -u <user> \ -p <database_name> | grep -nvE \ ‘(wp_?\d?_(posts|comments)|_transient|@livesite.dev) \ | grep ‘<string>’ [/shell]

สำหรับโปรแกรม grep option -n คือให้แสดงเลขบรรทัด -E คือให้ใช้ regex ตาม pattern ในวงเล็บ และ -v คือ ไม่เอาพวกที่หาเจอ (invert-match)

ลองซ้ำแล้วซ้ำอีก จนกว่าจะมั่นใจ

หลังจากที่ได้ทดสอบ แก้ไข และทำพังไปหลายรอบ พอได้ขั้นตอนที่ค่อนข้างมั่นใจมาแล้วคุณคนเขียนก็ต้องทดลองซ้ำเพื่อให้แน่ใจว่า จะไม่ไปทำ live site พัง วิธีทดสอบที่เร็วที่สุดคือ ลบฐานข้อมูลทิ้ง สร้างใหม่ import ใหม่ และเริ่มแก้ใหม่

[shell] mysqladmin -u root -p drop samplesite_db mysqladmin -u root -p create samplesite_db mysql -u root -p samplesite_db < livesite_db_dump.sql [/shell]

ทำซ้ำอยู่ 2-3 ครั้งจนมั่นใจว่า ได้ชัวร์

ทำงานดึก มันก็มึน

พอมั่นใจแล้ว คุณคนเขียนก็ขึ้นไปแก้ไข live site ที่บน server ทำตามขั้นตอนทุกอย่าง และดูเหมือนกับว่าทุกอย่างจะราบรื่น จนกระทั่งถึงขึ้นสุดท้าย ทดสอบ /store/ … หงะ

Live Site ErrorLive Site Error

ร้อนรนมาก ทำไมทำกับฉันอย่างนี้ พยายามย้อนคิดไปว่า พลาดไปขั้นตอนไหน แก้ htaccess ผิดหรือ ลืมแก้ database ตรงไหนรึเปล่า คิดวนไปวนมาเกือบครึ่งชั่วโมง เหลือบไปเห็น terminal window แล้วเหมือนกับโดนไม้เบสบอลตีศีรษะ

Duh!Duh!

มันไม่ควรจะมี store directory แล้วไม่ใช่เหรอ? —- ลบ - ใช้ได้เลย

(เพราะย้าย files ออกจาก store directory หมดแล้ว มันก็เลยกลายเป็น blank directory ก็เลยไม่แสดงอะไรให้เห็นเลย)

สวัสดีครับ

แถม import SQL ที่ dump ออกมาแบบ .gz โดยไม่ต้อง gunzip ก่อน

[shell] gunzip < $devdir/pause_stock/app/database/data_dump.sql.gz \ | mysql -u root -p database_name [/shell]