Categories
Database Backup

** Discover how DevOps engineers and DBAs can detect corrupted database backups before disaster strikes. Learn advanced techniques for PostgreSQL, SQL Server, and MySQL, including automated restore testing and checksum validation.

ในโลกที่มีความเสี่ยงสูงของการดูแลระบบฐานข้อมูลและวิศวกรรมความน่าเชื่อถือของไซต์งาน (Site Reliability Engineering) มีสัจพจน์ที่รู้จักกันดีคือ Schrödinger’s Backup (การสำรองข้อมูลของชเรอดิงเงอร์) สภาพของการสำรองข้อมูลใดๆ จะยังไม่ทราบแน่ชัดจนกว่าคุณจะพยายามกู้คืนมัน จนกว่าจะถึงเวลานั้น มันจะดำรงอยู่ในสถานะควอนตัมที่เป็นทั้งข้อมูลที่สมบูรณ์พร้อมใช้งานและข้อมูลที่เสียหายโดยสิ้นเชิง

สำหรับวิศวกร DevOps และ DBA การค้นพบว่าการสำรองข้อมูลฐานข้อมูลที่สำคัญเกิดความเสียหายระหว่างเหตุการณ์วิกฤตคือฝันร้ายที่สุด มันเปลี่ยนการดำเนินการกู้คืนตามปกติให้กลายเป็นเหตุการณ์ข้อมูลสูญหายระดับหายนะ “เพชฌฆาตเงียบ” ของความสมบูรณ์ของข้อมูลนี้มักไม่ถูกตรวจพบเนื่องจากงานสำรองข้อมูลมักจะรายงานว่าสำเร็จด้วย Exit Code 0 แม้ว่าข้อมูลจริงภายในจะถูกบุกรุกก็ตาม

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

กายวิภาคของความเสียหายในการสำรองข้อมูล

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

ความเสียหายทางกายภาพ

ความเสียหายทางกายภาพเกิดขึ้นเมื่อบิตจริงบนสื่อบันทึกข้อมูลถูกเปลี่ยนแปลง สิ่งนี้สามารถเกิดขึ้นได้ในระหว่างกระบวนการอ่านจากดิสก์ต้นทาง ระหว่างการส่งผ่านเครือข่าย หรือขณะจัดเก็บในที่จัดเก็บข้อมูลปลายทาง
* Bit Rot: การเสื่อมสภาพทีละน้อยของสื่อบันทึกข้อมูลสามารถทำให้บิตพลิกกลับได้โดยเงียบๆ
* Transit Errors: แม้ว่า TCP จะมี Checksum แต่ก็เป็นที่ทราบกันดีว่ามันอ่อนแอ (16-bit) สภาพแวดล้อมที่มีปริมาณงานสูงอาจประสบปัญหาข้อมูลเสียหายโดยไม่รู้ตัวผ่านสายส่งสัญญาณซึ่ง TCP ตรวจไม่พบ
* Storage Controller Faults: ข้อผิดพลาดของฮาร์ดแวร์ใน RAID Controller หรือ SAN Fabric สามารถเขียนข้อมูลขยะในขณะที่รายงานความสำเร็จไปยัง OS

ความเสียหายทางตรรกะ

ความเสียหายทางตรรกะอาจเป็นสิ่งที่อันตรายกว่าเพราะไฟล์สำรองข้อมูลนั้นสมบูรณ์ดี แต่ข้อมูลภายในกลับพัง
* Garbage In, Garbage Out (GIGO): หากฐานข้อมูลสดของคุณมีดัชนีที่เสียหายหรือหน้าข้อมูลที่ฉีกขาด เครื่องมือสำรองข้อมูลของคุณอาจคัดลอกหน้าข้อมูลที่เสียหายนั้นไปอย่างซื่อสัตย์ งานสำรองข้อมูลสำเร็จ แต่การกู้คืนจะล้มเหลวหรือได้ฐานข้อมูลที่พัง
* Incomplete Transactions: สแนปชอตระดับระบบไฟล์ที่ถ่ายโดยไม่ได้หยุดการทำงาน I/O ของฐานข้อมูลอย่างเหมาะสม (เช่น ไม่ใช้ FLUSH TABLES WITH READ LOCK ใน MySQL) จะส่งผลให้เกิดหน้าข้อมูลที่ฉีกขาดและสถานะที่ไม่สามารถกู้คืนได้

การตรวจจับเชิงรุก: Checksums และ Cryptographic Hashing

แนวป้องกันแรกต่อความเสียหายทางกายภาพคือการตรวจสอบความถูกต้องด้วยรหัสลับ การพึ่งพาขนาดไฟล์หรือวันที่แก้ไขนั้นไม่เพียงพอ

การเปิดใช้งาน Checksums ระดับฐานข้อมูล

ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS) สมัยใหม่รองรับ Checksum ระดับหน้าข้อมูล เมื่อเปิดใช้งาน ฐานข้อมูลจะคำนวณ Checksum สำหรับทุกหน้าก่อนเขียนลงดิสก์ เมื่อมีการอ่านหน้าข้อมูล (ไม่ว่าจะโดยคิวรีหรือกระบวนการสำรองข้อมูล) Checksum จะถูกตรวจสอบ

สำหรับ PostgreSQL คุณสามารถเปิดใช้งาน Checksum ข้อมูลระหว่างการเริ่มต้นคลัสเตอร์:

# เริ่มต้นคลัสเตอร์ PostgreSQL ใหม่โดยเปิดใช้งาน Checksum
initdb --data-checksums -D /var/lib/postgresql/data

หมายเหตุ: หากคุณมีคลัสเตอร์ PostgreSQL อยู่แล้ว คุณสามารถใช้ยูทิลิตี้ pg_checksums เพื่อเปิดใช้งานแบบออฟไลน์ได้

สำหรับ Microsoft SQL Server ตรวจสอบให้แน่ใจว่า PAGE_VERIFY ถูกตั้งค่าเป็น CHECKSUM (ค่าเริ่มต้นในเวอร์ชันสมัยใหม่ แต่ควรตรวจสอบในระบบรุ่นเก่า):

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

การตรวจสอบความถูกต้องของการสำรองข้อมูลที่จัดเก็บไว้

เมื่อการสำรองข้อมูลไปถึงที่จัดเก็บปลายทาง ความสมบูรณ์ของมันจะต้องได้รับการตรวจสอบด้วยรหัสลับ แพลตฟอร์มการสำรองข้อมูลระดับองค์กรอย่าง CloudSave จะคำนวณและตรวจสอบแฮช SHA-256 ของบล็อกข้อมูลสำรองโดยอัตโนมัติระหว่างการส่งผ่านและขณะจัดเก็บ หากคุณกำลังจัดการสคริปต์แบบกำหนดเอง คุณต้องดำเนินการนี้ด้วยตนเอง:

# สร้างแฮช SHA-256 หลังจากสร้างการสำรองข้อมูล
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# ตรวจสอบแฮชบนเซิร์ฟเวอร์จัดเก็บข้อมูล
sha256sum -c prod_db_backup.tar.gz.sha256

เทคนิคการตรวจสอบความถูกต้องเฉพาะสำหรับฐานข้อมูล

เอนจินฐานข้อมูลที่แตกต่างกันมีเครื่องมือดั้งเดิมเพื่อตรวจสอบความสมบูรณ์ของไฟล์สำรองข้อมูล

PostgreSQL: pg_verifybackup

เปิดตัวใน PostgreSQL 13, pg_verifybackup เป็นเครื่องมือเปลี่ยนเกมสำหรับการสำรองข้อมูลทางกายภาพที่ทำด้วย pg_basebackup มันจะอ่านไฟล์ backup_manifest ที่สร้างขึ้นระหว่างการสำรองข้อมูลและตรวจสอบว่าไฟล์ทั้งหมดอยู่ครบและ Checksum ตรงกัน

# เรียกใช้การตรวจสอบกับไดเรกทอรีสำรองข้อมูลทางกายภาพ
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

หากมีเพียงบิตเดียวที่พลิกกลับในไฟล์ข้อมูลใดๆ pg_verifybackup จะแสดงข้อผิดพลาดร้ายแรง ทำให้ระบบตรวจสอบของคุณสามารถแจ้งเตือนทีม DBA ได้ทันที

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server มีคำสั่งดั้งเดิมเพื่อตรวจสอบความสมบูรณ์ทางกายภาพของไฟล์สำรองข้อมูลโดยไม่ต้องกู้คืนจริง มันจะตรวจสอบส่วนหัวของการสำรองข้อมูลและตรวจสอบ Checksum ของหน้าข้อมูล (หากเปิดใช้งานระหว่างการสำรองข้อมูล)

RESTORE VERIFYONLY 
FROM DISK = 'Z:BackupsProdDB_Full.bak' 
WITH CHECKSUM;

คำเตือน: RESTORE VERIFYONLY ยืนยันได้เพียงว่าไฟล์สำรองข้อมูลสามารถอ่านได้และ Checksum ทางกายภาพตรงกันเท่านั้น ไม่ได้รับประกัน ความสมบูรณ์ทางตรรกะ เพื่อให้มั่นใจถึงความสมบูรณ์ทางตรรกะ คุณต้องทำการกู้คืนเต็มรูปแบบและเรียกใช้ DBCC CHECKDB

MySQL / InnoDB: Percona XtraBackup

สำหรับสภาพแวดล้อม MySQL การสำรองข้อมูลทางกายภาพมักจัดการโดย Percona XtraBackup กระบวนการสำรองข้อมูลประกอบด้วยการคัดลอกไฟล์ แต่การสำรองข้อมูลจะไม่สอดคล้องกันจนกว่าจะมีการนำ Transaction Logs (redo logs) มาใช้ ระยะ --prepare ทำหน้าที่เป็นการตรวจสอบความสมบูรณ์ในตัว

# การเตรียมการสำรองข้อมูลจะนำ redo logs มาใช้
# หากการสำรองข้อมูลเสียหาย ขั้นตอนนี้จะล้มเหลว
xtrabackup --prepare --target-dir=/data/backups/mysql/

มาตรฐานทองคำ: การทดสอบการกู้คืนอัตโนมัติ

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

ด้วยการปฏิบัติต่อการสำรองข้อมูลเสมือนโค้ด คุณสามารถสร้างไปป์ไลน์ CI/CD สำหรับการกู้คืนฐานข้อมูลของคุณ ไปป์ไลน์นี้ควรจัดเตรียมโครงสร้างพื้นฐานชั่วคราว ดำเนินการกู้คืน เรียกใช้คิวรีตรวจสอบความถูกต้อง และลบสภาพแวดล้อมทิ้งเมื่อเสร็จสิ้น

การสร้างไปป์ไลน์การกู้คืนอัตโนมัติ

ด้านล่างนี้คือตัวอย่างของสคริปต์ Bash ที่สามารถเรียกใช้ทุกวันโดย cron job หรือ CI runner (เช่น GitLab CI หรือ GitHub Actions) เพื่อตรวจสอบ Logical Dump ของ PostgreSQL

#!/bin/bash
set -e

BACKUP_FILE="/mnt/storage/prod_db_latest.dump"
DB_NAME="prod_db"
CONTAINER_NAME="pg_restore_test"

echo "[INFO] กำลังเริ่มการทดสอบการกู้คืนอัตโนมัติ..."

# 1. เริ่มต้นคอนเทนเนอร์ PostgreSQL ชั่วคราว
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# รอให้ PostgreSQL พร้อมใช้งาน
echo "[INFO] กำลังรอให้ฐานข้อมูลเริ่มต้น..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. สร้างฐานข้อมูลเป้าหมาย
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. ดำเนินการกู้คืน
echo "[INFO] กำลังกู้คืนข้อมูลสำรอง..."
docker cp $BACKUP_FILE $CONTAINER_NAME:/tmp/backup.dump
docker exec $CONTAINER_NAME pg_restore -U postgres -d $DB_NAME -1 /tmp/backup.dump

# 4. เรียกใช้คิวรีตรวจสอบความถูกต้องทางตรรกะ
echo "[INFO] กำลังเรียกใช้คิวรีตรวจสอบความถูกต้อง..."
# ตรวจสอบว่าตาราง users มีข้อมูลมากกว่า 10,000 รายการหรือไม่
USER_COUNT=$(docker exec $CONTAINER_NAME psql -U postgres -d $DB_NAME -t -c "SELECT COUNT(*) FROM users;")

if [ "$USER_COUNT" -lt 10000 ]; then
    echo "[ERROR] การตรวจสอบทางตรรกะล้มเหลว คาดหวัง >10000 ผู้ใช้ แต่พบ $USER_COUNT"
    # เรียกใช้การแจ้งเตือน PagerDuty / Slack ที่นี่
    exit 1
else
    echo "[SUCCESS] การตรวจสอบทางตรรกะผ่าน จำนวนผู้ใช้: $USER_COUNT"
fi

# 5. ลบสภาพแวดล้อมชั่วคราว
echo "[INFO] กำลังทำความสะอาด..."
docker rm -f $CONTAINER_NAME

echo "[INFO] การทดสอบการกู้คืนอัตโนมัติเสร็จสมบูรณ์"

คุณควรตรวจสอบอะไรบ้าง?

เมื่อทำการทดสอบการกู้คืนอัตโนมัติ อย่าเพียงแค่ตรวจสอบว่าฐานข้อมูลเริ่มทำงานได้หรือไม่ ให้เรียกใช้คิวรีตรวจสอบความถูกต้องเฉพาะของแอปพลิเคชัน:
1. จำนวนแถว (Row Counts): ตรวจสอบให้แน่ใจว่าตารางหลักมีจำนวนแถวตามที่คาดไว้ (เช่น ตาราง users ไม่ควรว่างเปล่า)
2. ข้อมูลล่าสุด: คิวรีหาบันทึกที่สร้างขึ้นใน 24 ชั่วโมงที่ผ่านมาเพื่อให้แน่ใจว่าการสำรองข้อมูลไม่เก่าเกินไป
3. ความสมบูรณ์ของการอ้างอิง (Referential Integrity): เรียกใช้สคริปต์เพื่อตรวจสอบ Foreign Key ที่ไม่มีเจ้าของ ซึ่งบ่งชี้ถึงความเสียหายทางตรรกะ

การตรวจสอบและการแจ้งเตือนสำหรับความผิดปกติในการสำรองข้อมูล

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

การตรวจสอบเชิงวิเคราะห์ (Heuristic Monitoring)

รวมข้อมูลเมตาการสำรองข้อมูลของคุณเข้ากับ Prometheus และแสดงภาพด้วย Grafana ตั้งค่าการแจ้งเตือนสำหรับเกณฑ์ต่อไปนี้:
* ขนาดลดลงอย่างกะทันหัน: หากการสำรองข้อมูลรายวันของคุณมีขนาด 500GB สม่ำเสมอ และวันนี้เหลือ 50MB งานอาจเสร็จสมบูรณ์ (Exit Code 0) แต่มีความเป็นไปได้สูงว่ามันสำรองข้อมูลเพียง Schema ว่างเปล่า
* ความผิดปกติของระยะเวลา: หากการสำรองข้อมูลที่ปกติใช้เวลา 2 ชั่วโมงเสร็จสิ้นใน 5 นาที แสดงว่ามีบางอย่างถูกข้ามไป ในทางกลับกัน หากใช้เวลา 10 ชั่วโมง คุณอาจมีการเสื่อมสภาพของ I/O ดิสก์ที่อาจนำไปสู่ความเสียหาย
* การสะสมของ WAL/Archive Log: หากฐานข้อมูลของคุณสร้าง Write-Ahead Logs (WAL) แต่ระบบสำรองข้อมูลไม่เก็บถาวรเร็วพอ คุณเสี่ยงที่จะเกิดช่องว่างในห่วงโซ่การกู้คืน ณ เวลาใดเวลาหนึ่ง (PITR)

การใช้กฎ 3-2-1 พร้อมการตรวจสอบความสมบูรณ์

กฎการสำรองข้อมูล 3-2-1 มาตรฐานอุตสาหกรรม (ข้อมูล 3 ชุด, สื่อ 2 ประเภท, 1 ชุดอยู่นอกสถานที่) จะมีประสิทธิภาพก็ต่อเมื่อสำเนาทั้งหมดได้รับการตรวจสอบแล้วเท่านั้น

นี่คือจุดที่การใช้โซลูชันระดับองค์กรอย่าง CloudSave ช่วยลดภาระการดำเนินงานได้อย่างมาก แทนที่จะเขียนและดูแลสคริปต์ bash ที่ซับซ้อนสำหรับฐานข้อมูลแต่ละโหนด CloudSave จะรวมเข้ากับโครงสร้างพื้นฐานของคุณโดยตรงเพื่อทำให้วงจรชีวิต 3-2-1 เป็นอัตโนมัติ โดยมีที่จัดเก็บข้อมูลแบบแก้ไขไม่ได้ (Immutable Storage) ซึ่งป้องกันแรนซัมแวร์ และมีตารางเวลาการตรวจสอบการกู้คืนอัตโนมัติในตัว CloudSave สามารถหมุนสภาพแวดล้อม Sandbox ที่แยกออกมาโดยอัตโนมัติ ติดตั้งการสำรองข้อมูล เรียกใช้สคริปต์ตรวจสอบ SQL ของคุณ และรายงานสถานะสุขภาพกลับไปยังแดชบอร์ดกลางของคุณ

บทสรุป

การสำรองข้อมูลฐานข้อมูลที่เสียหายเป็นเพชฌฆาตเงียบที่สามารถทำลายธุรกิจได้ การพึ่งพาเพียง Exit Code 0 ของสคริปต์สำรองข้อมูลเป็นการเดิมพันที่อันตราย

เพื่อปกป้องสภาพแวดล้อมการผลิตของคุณอย่างแท้จริง คุณต้องใช้กลยุทธ์การป้องกันเชิงลึก:
1. เปิดใช้งาน Checksum ระดับหน้าข้อมูลภายในเอนจินฐานข้อมูลของคุณ
2. ใช้เครื่องมือตรวจสอบดั้งเดิม (pg_verifybackup, RESTORE VERIFYONLY) ทันทีหลังจากสร้างการสำรองข้อมูล
3. ตรวจสอบข้อมูลเมตาของการสำรองข้อมูล (ขนาด, ระยะเวลา) เพื่อหาความผิดปกติ
4. ดำเนินการทดสอบการกู้คืนอัตโนมัติแบบชั่วคราวเป็นส่วนหนึ่งของไปป์ไลน์การดำเนินงานรายวันของคุณ

ด้วยการเปลี่ยนจากความคิดแบบ “สำรองแล้วลืม” มาเป็นรูปแบบ “การตรวจสอบการกู้คืนอย่างต่อเนื่อง” คุณจะมั่นใจได้ว่าเมื่อภัยพิบัติมาถึง ข้อมูลของคุณจะพร้อม เชื่อถือได้ และกู้คืนได้อย่างสมบูรณ์

หมวดหมู่