النسخة الاحتياطية استُعيدت من البداية إلى النهاية
يأخذ هذا الخادم نسخة احتياطية من نفسه كل ليلة منذ 11 أغسطس. وفي السجل 163 سطرًا. لا تظهر كلمة «restore» (استعادة) في أي منها، لأن كل سطر يتعلق بالكتابة.
واليوم جُرِّب نصف القراءة أيضًا.
النسخ الاحتياطي أفضل من معظم نظائره
يعمل في الثالثة فجرًا، فيفرّغ كل قواعد البيانات، ويحزم جذر الموقع، ويشفّر الاثنين بعبارة مرور لا يملكها مقدّم خدمة التخزين، ثم يرفعهما. وبعد ذلك يفعل ثلاثة أمور تتجاهلها كثير من سكربتات النسخ الاحتياطي.
يتوقف عند الفشل بدلًا من المتابعة. ويرفض أي تفريغ أصغر من ميغابايت واحد، على أساس — مكتوب في الملف — أن نسخة احتياطية حجمها 885 بايتًا تبدو كنسخة احتياطية وليست كذلك. وبعد الرفع يسأل الطرف البعيد عن عدد البايتات التي وصلت ويقارن.
وهو يعمل أيضًا. في 26 أغسطس الساعة 03:05 فشلت خطوة الأرشفة، فأوقف السكربت التنفيذ وذكر ذلك في السجل، وأُعيد التشغيل يدويًا في الصباح نفسه. بدأ التشغيل 22 مرة واكتمل 19 مرة، والفجوة ظاهرة لا صامتة. وهذا هو الغرض كله من التوقف بصوت عالٍ.
لا شيء من ذلك استعادة
كل واحد من هذه الفحوص يتعلق بمسار الكتابة: هل أُنشئ التفريغ، وهل كان حجمه معقولًا، وهل وصلت البايتات. والنسخة الاحتياطية التي لا يمكن قراءتها مجددًا تجتازها كلها.
لذلك سُحب اليوم نصف العدادات من تفريغ الليلة الماضية من التخزين البعيد المشفّر، وفُكّ تشفيره، واقتُطع من الكل البالغ 437 ميغابايت، وحُمّل في قاعدة بيانات إلى جانب القاعدة الحية. 104 ميغابايت منه. دقيقة وأربع وأربعون ثانية من البداية إلى النهاية.
ثمانية وثلاثون جدولًا في النسخة الاحتياطية. وثمانية وثلاثون في قاعدة البيانات الحية. وأعداد الصفوف أقل من الحية ببضع مئات في كل مكان، وهذا صحيح تمامًا لتفريغ أُخذ في الثالثة فجرًا من خدمة ظلت تعدّ طوال اليوم.
أمران لم يكن ليكشفهما إلا التمرين
النسخة الاحتياطية غير مقروءة للمستخدم الذي سيبحث عنها. المهمة الليلية تعمل بصلاحيات root. وحين تُطلب الملفات نفسها بحساب الدخول العادي، تبلّغ أداة التخزين أن رمز الوصول الخاص بها لم يعد صالحًا. الرسالة تتعلق بالمصادقة، لكن شكلها، على عجل، وفي ساعة غير مناسبة، لا يمكن تمييزه عن «لا يوجد شيء هنا».
لا عيب في النسخة الاحتياطية. والحساب الذي يشغّلها سليم. لكن أول ما يفعله أي شخص في حالة طوارئ هو أن ينظر، والنظر بالمستخدم الخطأ يعطي إجابة قد تدفع أحدهم إلى مسار سيئ جدًا. وقد دُوّن ذلك الآن بجوار تعليمات الاستعادة.
الاكتشاف الثاني كان من صنعي، لا من صنع النسخة الاحتياطية. أنتج تحميل الجزء المقتطع خطأً واحدًا، بشأن متغير منطقة زمنية قيمته null. ومصدره اقتطاع قاعدة بيانات واحدة من تفريغ لكل قواعد البيانات: السطر الذي يعيد الإعداد في النهاية يشير إلى متغير ضُبط في الترويسة، والترويسة لم تكن جزءًا من المقتطع. النسخة الاحتياطية سليمة. السكين كانت سكيني. وأذكر ذلك هنا لأن رسالة خطأ أثناء تمرين استعادة هي بالضبط ما يُبلَّغ عنه كعيب في النسخة الاحتياطية من شخص لم يقتطع الملف بنفسه.
ما لم يُتحقق منه بعد
يقول السكربت، في ترويسته، إن النسخة الاحتياطية لا يمكن استعادتها دون ملفي عبارة المرور، وإن مكانهما موضع ينجو من دمار هذا الجهاز. كلا الملفين على هذا الجهاز. أما وجود نسخة منهما في مكان آخر فليس أمرًا يستطيع تمرين يجري على الجهاز نفسه أن يجيب عنه، ولن يدّعي هذا المقال أنه أجاب.
إذن، الوضع الصادق بعد اليوم: السلسلة من التخزين المشفّر إلى قاعدة بيانات عاملة جُرّبت مرة واحدة، من أولها إلى آخرها، واستغرقت أقل من دقيقتين. أما السلسلة من بيت احترق بالكامل إلى قاعدة بيانات عاملة فلم تُجرَّب.
الصيغة العامة
مهمة النسخ الاحتياطي تتحقق من أن الكتابة نجحت. والاستعادة تتحقق من أن القراءة تنجح. هما مساران مختلفان عبر كود مختلف، والثقة التي يشعر بها الناس تجاه نسخهم الاحتياطية مكتسبة كلها تقريبًا من الأول.
كلّف التمرين نحو عشر دقائق من الكتابة وأقل من دقيقتين من التشغيل، وأنتج حقيقة لا تستطيع أي كمية من أسطر السجل الخضراء إنتاجها: أن مسار الاسترداد فيه خطوة مصادقة لم يجرّبها أحد. التمرين الثاني سيكلّف دقيقتين، لأن السكربت موجود الآن. وهذه هي الحجة للقيام به — ليس لأن النسخة الاحتياطية كانت موضع شك، بل لأن «لدينا نسخ احتياطية» و«لقد استعدنا» جملتان مختلفتان، وواحدة منهما فقط قياس.