Categories
Database Backup

> Discover why standard VM snapshots cause data corruption in transactional databases like PostgreSQL and SQL Server. Learn DBA best practices for application-consistent backups, avoiding VM stun, and ensuring data integrity with CloudSave.

بالنسبة لمهندسي DevOps ومسؤولي الأنظمة، تُعد لقطات (Snapshots) الأجهزة الافتراضية (VM) أداة أساسية. فهي توفر طريقة سريعة ومريحة لالتقاط حالة الخادم قبل إجراء تصحيح برمجي محفوف بالمخاطر، أو تغيير كبير في الإعدادات، أو نشر تطبيق. وإذا حدث خطأ ما، فإن عملية الاستعادة تستغرق ثوانٍ فقط.

ومع ذلك، عندما يتم تطبيق هذه المنهجية نفسها على قواعد البيانات المعاملاتية (Transactional Databases) – مثل PostgreSQL أو MySQL أو Oracle أو Microsoft SQL Server – تتحول لقطات الأجهزة الافتراضية من شبكة أمان إلى قنبلة موقوتة.

إن الاعتماد على لقطات “المراقب الافتراضي” (Hypervisor) القياسية لنسخ قواعد البيانات احتياطيًا هو أحد أكثر الأسباب شيوعًا لتلف البيانات، وتمزق الصفحات (Torn Pages)، وانقطاع الخدمة في بيئات الإنتاج بشكل لا يمكن استرداده. في هذا المقال، سنستكشف التعارض المعماري بين المراقب الافتراضي ومحركات قواعد البيانات، وآليات تلف البيانات أثناء أخذ اللقطات، وأفضل الممارسات الهندسية المطلوبة لنسخ قواعد البيانات الافتراضية احتياطيًا بأمان.

التعارض المعماري: المراقب الافتراضي (Hypervisor) مقابل محركات قواعد البيانات

لفهم سبب تعريض لقطات الأجهزة الافتراضية لقواعد البيانات للخطر، يجب أولاً فحص كيفية إدارة كلا النظامين للحالة وعمليات الإدخال والإخراج (I/O).

كيف ينفذ المراقب الافتراضي اللقطات

عندما يأخذ المراقب الافتراضي (مثل VMware ESXi أو Microsoft Hyper-V أو KVM) لقطة، فإنه لا يقوم بنسخ القرص. بدلاً من ذلك، يقوم بتجميد ملف القرص الافتراضي الحالي (مثل .vmdk أو .vhdx) في حالة “للقراءة فقط” وينشئ قرصًا دلتا (Delta disk) جديدًا (قرص تبايني). يتم توجيه جميع عمليات الكتابة اللاحقة إلى هذا القرص الدلتا.

عند حذف اللقطة، يجب على المراقب الافتراضي دمج (Consolidate) البيانات من قرص الدلتا مرة أخرى في القرص الأساسي. اللقطات القياسية لا تدرك تمامًا التطبيقات التي تعمل داخل نظام التشغيل الضيف. فهي تلتقط حالة القرص تمامًا كما هي موجودة في تلك اللحظة الزمنية.

كيف تدير قواعد البيانات المعاملاتية الحالة

تم تصميم قواعد البيانات المعاملاتية حول خصائص ACID (الذرية، الاتساق، العزل، والمتانة). لتحقيق أداء عالٍ مع الحفاظ على الامتثال لـ ACID، لا تقوم قواعد البيانات بكتابة كل معاملة مباشرة إلى ملفات البيانات الأساسية على القرص فورًا. بدلاً من ذلك، فهي تستخدم بنية معقدة ومتعددة المستويات:

  1. مجمع التخزين المؤقت (Buffer Pool / Shared Buffers): تُقرأ البيانات وتُعدل داخل ذاكرة النظام.
  2. سجل الكتابة المسبقة (WAL) / سجلات الإعادة (Redo Logs): تُكتب التغييرات بالتسلسل في ملف سجل مُحسّن للغاية على القرص لضمان المتانة.
  3. نقاط التحقق (Checkpoints) / الكتابة الكسولة (Lazy Writers): بشكل دوري، تقوم قاعدة البيانات بتفريغ الصفحات المعدلة (المتسخة) من الذاكرة إلى ملفات البيانات الفعلية على القرص.

بسبب هذه البنية، تكون ملفات البيانات المادية على القرص دائمًا غير متزامنة مع الحالة الفعلية لقاعدة البيانات. الحالة الحقيقية لقاعدة البيانات توجد فقط كمزيج من ملفات البيانات على القرص، وسجلات WAL/Redo، والبيانات الموجودة حاليًا في الذاكرة.

منطقة الخطر: ماذا يحدث أثناء لقطة الجهاز الافتراضي

عندما تأخذ لقطة قياسية لجهاز افتراضي لخادم قاعدة بيانات، فأنت تلتقط حالة متسقة مع الانهيار (Crash-consistent).

الاتساق عند الانهيار مقابل الاتساق مع التطبيق

اللقطة المتسقة مع الانهيار تعادل سحب قابس الطاقة من الخادم المادي. يتم التقاط حالة القرص، ولكن أي شيء كان في الذاكرة يُفقد، وأي شيء كان في طريقه إلى وحدة تحكم التخزين يتم قطعه فجأة.

على الرغم من أن قواعد البيانات الحديثة مصممة للتعافي من فقدان الطاقة غير المتوقع عن طريق إعادة تشغيل سجل الكتابة المسبقة، فإن الاعتماد على التعافي من الانهيار كاستراتيجية نسخ احتياطي أساسية أمر خطير للغاية. إذا كانت قاعدة بياناتك تمتد عبر أقراص افتراضية متعددة (مثل ملفات البيانات على Drive D: وسجلات WAL على Drive E:)، فقد لا يقوم المراقب الافتراضي بأخذ لقطة لكلا القرصين في نفس اللحظة الزمنية الدقيقة. إذا تم التقاط لقطة قرص سجل WAL بعد جزء من الثانية من لقطة قرص البيانات، فلن تتمكن قاعدة البيانات من التوفيق بين أرقام التسلسل عند الاستعادة، مما يؤدي إلى تلف قاتل.

تأثير “تجميد الجهاز الافتراضي” (VM Stun) على الأنظمة عالية المعاملات

تتسبب عملية إنشاء اللقطة – والأهم من ذلك، عملية دمج اللقطة – في ظاهرة تُعرف باسم “تجميد الجهاز الافتراضي” (VM Stun).

لتحويل عمليات الإدخال والإخراج بأمان من القرص الأساسي إلى قرص الدلتا، يجب على المراقب الافتراضي إيقاف (تجميد) الجهاز الافتراضي لفترة وجيزة. بالنسبة لخادم ويب ذي حمل خفيف، قد يستمر هذا التجميد من 10 إلى 50 مللي ثانية ولا يُلاحظ. ومع ذلك، بالنسبة لقاعدة بيانات عالية الإنتاجية ذات عمليات إدخال وإخراج ضخمة، يمكن أن يؤدي دمج قرص دلتا كبير إلى تجميد الجهاز الافتراضي لعدة ثوانٍ.

أثناء تجميد الجهاز الافتراضي:
* تنقطع اتصالات الشبكة، مما يسبب انتهاء مهلة التطبيقات.
* تفشل مجموعات التوافر العالي (مثل SQL Server Always On أو PostgreSQL Patroni أو MySQL Galera) في فحص نبضات القلب.
* قد تفترض المجموعة أن العقدة المجمدة ميتة، مما يؤدي إلى فشل غير ضروري ومزعج (سيناريو الدماغ المنقسم).

تمزق الصفحات وعدم محاذاة الإدخال والإخراج

تكتب محركات قواعد البيانات عادةً البيانات بأحجام صفحات محددة (مثل 8 كيلوبايت لـ PostgreSQL وSQL Server، و16 كيلوبايت لـ InnoDB). ومع ذلك، يقوم نظام التشغيل الأساسي ومصفوفات التخزين بمعالجة الإدخال والإخراج في كتل أصغر (مثل 4 كيلوبايت أو 512 بايت).

إذا أخذ المراقب الافتراضي لقطة بالضبط أثناء كتابة قاعدة البيانات لصفحة بحجم 8 كيلوبايت، فقد تلتقط اللقطة أول 4 كيلوبايت من البيانات الجديدة وآخر 4 كيلوبايت من البيانات القديمة. هذا يخلق صفحة ممزقة (Torn page). عند محاولة استعادة اللقطة، ستقرأ قاعدة البيانات الصفحة، وتفشل في التحقق من المجموع الاختباري، وتضع علامة على قاعدة البيانات بأنها تالفة.

العواقب الواقعية لمحركات قواعد بيانات محددة

تتفاعل محركات قواعد البيانات المختلفة مع اللقطات المتسقة مع الانهيار بطرق متنوعة، ولكن لا يوجد أي منها يتعامل معها بسلاسة في بيئة الإنتاج.

  • PostgreSQL: تعتمد PostgreSQL بشكل كبير على دليل pg_wal. إذا التقطت اللقطة دليل البيانات ($PGDATA) وسجلات WAL بشكل غير متزامن، فستفشل PostgreSQL في البدء، مما يؤدي إلى ظهور خطأ PANIC: could not locate a valid checkpoint record.
  • MySQL/InnoDB: يستخدم InnoDB مخزنًا مؤقتًا للكتابة المزدوجة (doublewrite buffer) لمنع الصفحات الممزقة، مما يوفر بعض الحماية ضد حالات الاتساق عند الانهيار. ومع ذلك، إذا تم التقاط ملف ibdata1 وملف ib_logfile بشكل غير متزامن، فسيتعطل محرك InnoDB عند التعافي.
  • Microsoft SQL Server: حساس للغاية لتجميد الإدخال والإخراج. بدون تكامل مناسب مع خدمة VSS (Volume Shadow Copy Service)، فإن استعادة SQL Server من لقطة جهاز افتراضي قياسية غالبًا ما تؤدي إلى قواعد بيانات مشبوهة وسلاسل سجلات مكسورة، مما يدمر قدرات الاستعادة إلى نقطة زمنية (PITR).

أفضل الممارسات للنسخ الاحتياطي الآمن لقواعد البيانات الافتراضية

لحماية قواعد البيانات المعاملاتية، يجب عليك الانتقال من النسخ الاحتياطي المتسق مع الانهيار إلى النسخ الاحتياطي المتسق مع التطبيق. يتطلب هذا من آلية النسخ الاحتياطي التواصل مع محرك قاعدة البيانات، مما يجبره على تفريغ الذاكرة إلى القرص وإيقاف عمليات الإدخال والإخراج مؤقتًا أثناء أخذ اللقطة.

1. الاستفادة من التجميد المدرك للتطبيق (VSS و fsfreeze)

لنظام Windows (SQL Server):
تأكد دائمًا من أن حل النسخ الاحتياطي الخاص بك يستخدم خدمة Microsoft Volume Shadow Copy Service (VSS). عند تشغيل نسخة احتياطية مدركة لـ VSS، يقوم كاتب VSS الخاص بـ SQL Server بتجميد عمليات الإدخال والإخراج لقاعدة البيانات، وتفريغ المعاملات المعلقة إلى القرص، وضمان أن اللقطة متسقة تمامًا مع التطبيق.

لنظام Linux (PostgreSQL / MySQL):
لا يمتلك Linux مكافئًا أصليًا لـ VSS. لتحقيق الاتساق مع التطبيق، يجب عليك استخدام نصوص برمجية (scripts) قبل التجميد وبعد الإلغاء بالتزامن مع أدوات الضيف الخاصة بالمراقب الافتراضي (مثل VMware Tools).

إليك مثال على نص برمجي pre-freeze-script لـ VMware لقاعدة بيانات PostgreSQL 15+ الذي يجهز قاعدة البيانات بأمان للقطة:

#!/bin/bash
# /usr/sbin/pre-freeze-script
# تأكد من أن هذا النص قابل للتنفيذ (chmod +x)

# 1. أخبر PostgreSQL بالاستعداد للنسخ الاحتياطي
su - postgres -c "psql -c "SELECT pg_backup_start('vm_snapshot', true);""

# 2. تفريغ مخازن نظام الملفات إلى القرص
sync

# 3. تجميد نظام الملفات (بافتراض أن البيانات موجودة في /var/lib/pgsql)
fsfreeze -f /var/lib/pgsql

والنص البرمجي المقابل post-thaw-script لاستئناف العمليات:

#!/bin/bash
# /usr/sbin/post-thaw-script

# 1. إلغاء تجميد نظام الملفات
fsfreeze -u /var/lib/pgsql

# 2. أخبر PostgreSQL بأن النسخ الاحتياطي قد اكتمل
su - postgres -c "psql -c "SELECT pg_backup_stop();""

2. استخدام أدوات النسخ الاحتياطي الأصلية لقاعدة البيانات

على الرغم من أن اللقطات المتسقة مع التطبيق أفضل من اللقطات القياسية، إلا أنها لا تزال تحمل خطر تجميد الجهاز الافتراضي. الطريقة الأكثر أمانًا لنسخ قواعد البيانات احتياطيًا هي استخدام أدوات النسخ الاحتياطي الأصلية التي تعمل بشكل مستقل عن المراقب الافتراضي.

PostgreSQL (pg_basebackup):

pg_basebackup -h localhost -U replication_user -D /mnt/backups/pg_backup -Ft -z -P

MySQL/MariaDB (Percona XtraBackup / Mariabackup):
تأخذ هذه الأدوات نسخًا احتياطية حية وغير حاصرة عن طريق نسخ ملفات البيانات وتتبع التغييرات في سجل الإعادة في نفس الوقت.

mariabackup --backup --target-dir=/mnt/backups/mysql_backup --user=root --password=SecurePass

SQL Server (T-SQL):

BACKUP DATABASE [ProductionDB] 
TO DISK = N'Z:BackupsProductionDB.bak' 
WITH NOFORMAT, NOINIT, NAME = N'ProductionDB-Full Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
GO

3. تنفيذ الاستعادة إلى نقطة زمنية (PITR) عبر أرشفة السجلات

اللقطة اليومية أو النسخ الاحتياطي الكامل يحميك فقط حتى اللحظة التي تم فيها أخذها. إذا تعطلت قاعدة بياناتك في الساعة 4:00 مساءً وكانت آخر لقطة لك في الساعة 2:00 صباحًا، فستفقد 14 ساعة من بيانات المعاملات.

لتحقيق مرونة مؤسسية حقيقية، يجب عليك الجمع بين النسخ الاحتياطي الكامل المتسق مع التطبيق وأرشفة السجلات المستمرة (نسخ سجلات WAL أو Redo Logs أو سجلات المعاملات احتياطيًا كل بضع دقائق). هذا يسمح لمديري قواعد البيانات باستعادة قاعدة البيانات إلى دقيقة محددة أو حتى معرف معاملة محدد قبل وقوع الكارثة.

استراتيجيات النسخ الاحتياطي للمؤسسات مع CloudSave

تعد إدارة النصوص البرمجية المخصصة قبل التجميد، ومهام cron للنسخ الأصلية، ونقل السجلات عبر عشرات خوادم قواعد البيانات كابوسًا تشغيليًا لفرق DevOps. وهنا يأتي دور منصة بمستوى مؤسسي مثل CloudSave.

تعمل CloudSave على سد الفجوة بين المحاكاة الافتراضية وبنية قاعدة البيانات. بدلاً من الاعتماد على لقطات المراقب الافتراضي العمياء، تستخدم CloudSave وكلاء مدركين للتطبيق يتكاملون أصلاً مع SQL Server وPostgreSQL وMySQL وOracle.

عندما تبدأ CloudSave في عملية نسخ احتياطي:
1. تتواصل مباشرة مع محرك قاعدة البيانات عبر واجهات برمجة التطبيقات الأصلية (مثل VSS لنظام Windows أو بث WAL الأصلي لنظام Linux).
2. تنظم عملية تفريغ مخازن الذاكرة إلى القرص دون التسبب في تجميد مزعج للجهاز الافتراضي.
3. تلتقط ملفات البيانات بأمان وتدير اقتطاع سجل المعاملات تلقائيًا.
4. تنسخ سجلات المعاملات احتياطيًا بشكل مستمر، مما يتيح الاستعادة الدقيقة إلى نقطة زمنية (PITR) ببضع نقرات.

من خلال تفريغ تعقيد الاتساق مع التطبيق إلى CloudSave، يمكن لمديري قواعد البيانات ومسؤولي الأنظمة ضمان سلامة البيانات دون التضحية بأداء أو توافر مجموعات الإنتاج الخاصة بهم.

الخلاصة

تعد لقطات الأجهزة الافتراضية أداة مذهلة لإدارة البنية التحتية، لكنها غير متوافقة جوهريًا مع متطلبات ACID لقواعد البيانات المعاملاتية. إن الاعتماد على لقطات المراقب الافتراضي المتسقة مع الانهيار يعرض مؤسستك لتمزق الصفحات، وسلاسل النسخ المتماثل المكسورة، وفقدان البيانات الكارثي.

لحماية بياناتك الحيوية، يجب عليك تنفيذ التجميد المدرك للتطبيق، واستخدام منهجيات النسخ الاحتياطي الأصلية لقواعد البيانات، والحفاظ على أرشيفات سجلات المعاملات المستمرة. من خلال اعتماد حلول نسخ احتياطي مؤسسية مصممة لهذا الغرض، يمكنك ضمان بقاء قواعد بياناتك متاحة للغاية، وقابلة للاسترداد بالكامل، وآمنة تمامًا.