การกู้คืน ณ เวลาใดเวลาหนึ่ง
กู้คืนไปยังช่วงเวลาใดก็ได้ด้วย 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— หมายเลขลำดับบันทึก WALrecovery_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;การดำเนินการกู้คืน
การกู้คืนประกอบด้วยสามขั้นตอน:
- หยุดอินสแตนซ์ PostgreSQL ที่กำลังทำงานอยู่
- กู้คืนข้อมูลสำรองฐานไปยังไดเรกทอรีข้อมูล
- กำหนดค่าพารามิเตอร์การกู้คืนและเริ่ม 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสำรองข้อมูลเชิงตรรกะเทียบกับเชิงกายภาพ
- การกู้คืน ณ เวลาใดเวลาหนึ่ง
- การทดสอบการกู้คืนข้อมูลของคุณ
- การวางแผนกู้คืนจากภัยพิบัติ