0Pricing
SQL Academy · บทเรียน

การกู้คืน ณ เวลาใดเวลาหนึ่ง

กู้คืนไปยังช่วงเวลาใดก็ได้ด้วย WAL

การกู้คืน ณ เวลาใดเวลาหนึ่ง เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

การกู้คืน ณ เวลาใดเวลาหนึ่งคืออะไร

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

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

บันทึกการเขียนล่วงหน้า (WAL)

คำสั่ง INSERT, UPDATE, DELETE และ DDL ทุกคำสั่งจะถูกเขียนลงใน WAL ก่อนที่จะเปลี่ยนแปลงไฟล์ข้อมูลจริง วิธีนี้รับประกันความคงทนของข้อมูลแม้เซิร์ฟเวอร์จะขัดข้องระหว่างการเขียน

สำหรับ PITR เซกเมนต์ WAL ที่จัดเก็บไว้เปรียบเสมือนเทปบันทึกเวลา การสำรองข้อมูลพื้นฐานคือจุดเริ่มต้น ส่วน WAL จะเติมทุกสิ่งที่เกิดขึ้นหลังจากนั้น

-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
       pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;

การเปิดใช้การจัดเก็บ WAL

ก่อนจะใช้ PITR ได้ ต้องเปิดการจัดเก็บ WAL ใน postgresql.conf พารามิเตอร์สำคัญคือ wal_level, archive_mode และ archive_command

คำสั่งจัดเก็บจะคัดลอกเซกเมนต์ WAL ที่เสร็จสมบูรณ์แต่ละรายการไปยังตำแหน่งที่ปลอดภัย เช่น ไดเรกทอรีภายในเครื่อง จุดเชื่อมต่อ NFS หรือบัคเก็ตพื้นที่จัดเก็บบนคลาวด์

-- View current WAL and archive settings
SELECT name, setting, unit
FROM   pg_settings
WHERE  name IN (
  'wal_level',
  'archive_mode',
  'archive_command',
  'archive_status'
)
ORDER  BY name;

การสำรองข้อมูลพื้นฐาน

การสำรองข้อมูลพื้นฐานคือสำเนาที่สอดคล้องกันของไดเรกทอรีข้อมูลทั้งหมด ซึ่งจัดทำขึ้นขณะที่เซิร์ฟเวอร์กำลังทำงาน PostgreSQL มีทั้งยูทิลิตี pg_basebackup และฟังก์ชันภาษาเอสคิวแอลระดับล่างสำหรับประสานงานกระบวนการนี้

ข้อมูลสำรองนี้เมื่อรวมกับเซกเมนต์ WAL ที่จัดเก็บตั้งแต่เวลาเริ่มสำรองข้อมูลเป็นต้นไป จะเป็นทุกสิ่งที่คุณต้องใช้สำหรับ PITR

-- Check the latest base backup information
SELECT backup_start,
       backup_end,
       pg_size_pretty(backup_total) AS total_size
FROM   pg_stat_basebackup;

การกำหนดเวลาปลายทางสำหรับการกู้คืน

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

ตารางบันทึกธุรกรรมหรือบันทึกของแอปพลิเคชันมักเก็บการประทับเวลานี้ไว้ WAL เองจะบันทึกการประทับเวลาการยืนยันธุรกรรมเมื่อเปิดใช้ track_commit_timestamp

-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
       pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM   pg_stat_activity
WHERE  state = 'idle'
LIMIT  10;

พารามิเตอร์ recovery.conf / การกู้คืน

พฤติกรรมการกู้คืนควบคุมด้วยพารามิเตอร์ที่กำหนดไว้ใน postgresql.conf (PostgreSQL รุ่น 12 ขึ้นไป) หรือไฟล์ recovery.conf รุ่นเก่า พารามิเตอร์ที่สำคัญที่สุดมีดังนี้:

  • restore_command — วิธีดึงเซกเมนต์ WAL ที่จัดเก็บไว้
  • recovery_target_time — การประทับเวลาที่แน่นอนที่จะหยุด
  • recovery_target_action — การดำเนินการเมื่อถึงเป้าหมาย (promote, pause, shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM   pg_settings
WHERE  name IN (
  'restore_command',
  'recovery_target_time',
  'recovery_target_action',
  'recovery_target_inclusive'
)
ORDER  BY name;

ประเภทอื่นของเป้าหมายการกู้คืน

เวลาไม่ใช่วิธีเดียวในการกำหนดเป้าหมายการกู้คืน PostgreSQL รองรับเป้าหมายสี่ประเภท:

  • recovery_target_time — สตริงการประทับเวลา
  • recovery_target_xid — รหัสธุรกรรม ID ที่ระบุไว้
  • recovery_target_lsn — หมายเลขลำดับบันทึก WAL
  • recovery_target_name — จุดกู้คืนที่มีชื่อ ซึ่งสร้างด้วย pg_create_restore_point()
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;

การจำลองภัยพิบัติ

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

-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;

-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';

-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;

การดำเนินการกู้คืน

การกู้คืนประกอบด้วยสามขั้นตอน:

  1. หยุดอินสแตนซ์ PostgreSQL ที่กำลังทำงานอยู่
  2. กู้คืนข้อมูลสำรองฐานไปยังไดเรกทอรีข้อมูล
  3. กำหนดค่าพารามิเตอร์การกู้คืนและเริ่ม PostgreSQL ในโหมดการกู้คืน — ระบบจะเล่น WAL ซ้ำจนถึงเวลาที่เป็นเป้าหมาย จากนั้นเปลี่ยนสถานะเป็นเซิร์ฟเวอร์อ่านเขียนปกติ

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

-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
       pg_last_xact_replay_timestamp() AS last_replayed_txn;

การตรวจสอบการกู้คืน

เมื่อเซิร์ฟเวอร์เปลี่ยนสถานะแล้ว ให้ตรวจสอบว่าข้อมูลอยู่ในสถานะที่คาดไว้ ตรวจสอบจำนวนแถว เวลาในการประทับเวลาของแถวล่าสุด และค่าที่สำคัญต่อธุรกิจ

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

-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders'       AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items'  AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers'    AS tbl, COUNT(*) AS rows FROM customers
ORDER  BY tbl;

แนวทางปฏิบัติที่ดีสำหรับ PITR

การตั้งค่า PITR ที่เชื่อถือได้ต้องมีมากกว่าการเปิดใช้การจัดเก็บถาวร แนวทางปฏิบัติสำคัญมีดังนี้:

  • ทดสอบการกู้คืนเป็นประจำ — ข้อมูลสำรองที่ไม่เคยทดสอบก็ไม่ใช่ข้อมูลสำรอง
  • ตรวจสอบความล่าช้าของคลัง WAL — ช่องว่างใน WAL ที่จัดเก็บไว้ทำให้ไม่สามารถกู้คืนได้อย่างสมบูรณ์
  • เก็บประวัติ WAL ไว้ให้เพียงพอ — เก็บเซกเมนต์ไว้อย่างน้อยย้อนหลังไปถึงข้อมูลสำรองฐานที่เก่าที่สุดซึ่งยังใช้ได้
  • ใช้ตำแหน่งจัดเก็บแยกต่างหาก — หากดิสก์หลักขัดข้อง WAL ที่จัดเก็บไว้บนดิสก์เดียวกันก็จะสูญหายไปด้วย
-- Check for any WAL archiving failures
SELECT archived_count,
       failed_count,
       last_archived_wal,
       last_archived_time,
       last_failed_wal,
       last_failed_time
FROM   pg_stat_archiver;

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับการกู้คืน ณ จุดเวลา

สรุป: การกู้คืน ณ จุดเวลา

ในบทเรียนนี้ คุณได้เรียนรู้ว่าบันทึกแบบเขียนล่วงหน้าของ PostgreSQL หรือ WAL ช่วยให้กู้คืนไปยังช่วงเวลาใด ๆ ในอดีตได้อย่างไร:

  • การจัดเก็บ WAL จะบันทึกการเปลี่ยนแปลงทุกอย่างหลังจากสร้างข้อมูลสำรองฐาน
  • เป้าหมายการกู้คืน อาจเป็นการประทับเวลา รหัสธุรกรรม ID, LSN หรือจุดกู้คืนที่มีชื่อ
  • กระบวนการกู้คืน จะกู้คืนข้อมูลสำรองฐาน เล่น WAL ที่จัดเก็บไว้ซ้ำ และเปลี่ยนสถานะเมื่อถึงเป้าหมาย
  • การตรวจสอบ ยืนยันความถูกต้องของข้อมูลก่อนเปิดให้รับการรับส่งข้อมูลอีกครั้ง
  • แนวทางปฏิบัติที่ดี รวมถึงการทดสอบการกู้คืนเป็นประจำ การตรวจสอบคลัง และการจัดเก็บ WAL นอกสถานที่

PITR คือเครือข่ายความปลอดภัยของคุณเมื่อต้องรับมือกับความผิดพลาดของมนุษย์และข้อมูลเสียหาย — เชี่ยวชาญเรื่องนี้แล้ว คุณก็จะเชี่ยวชาญการกู้คืนจากภัยพิบัติ

คำถามที่พบบ่อย

บทเรียน “การกู้คืน ณ เวลาใดเวลาหนึ่ง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกู้คืน ณ เวลาใดเวลาหนึ่ง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกู้คืน ณ เวลาใดเวลาหนึ่ง”

กู้คืนไปยังช่วงเวลาใดก็ได้ด้วย WAL คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

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

บทเรียน “การกู้คืน ณ เวลาใดเวลาหนึ่ง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสำรองข้อมูลเชิงตรรกะเทียบกับเชิงกายภาพ
  2. การกู้คืน ณ เวลาใดเวลาหนึ่ง
  3. การทดสอบการกู้คืนข้อมูลของคุณ
  4. การวางแผนกู้คืนจากภัยพิบัติ
← กลับไปที่ SQL Academy