في الأمثلة أدناه، ستظهر وجهة النسخ الاحتياطي بالشكل Disk('backups', '1.zip').
ولاستخدام محرك النسخ الاحتياطي Disk، يجب أولاً إضافة ملف يحدد
وجهة النسخ الاحتياطي في المسار أدناه:
/etc/clickhouse-server/config.d/backup_disk.xml
على سبيل المثال، يحدّد الإعداد أدناه قرصًا باسم backups، ثم يضيف هذا القرص إلى
قائمة allowed_disk الخاصة بـ backups:
يمكن أيضًا إجراء BACKUP/RESTORE إلى S3 عبر تهيئة قرص S3 ضمن
إعدادات التخزين في ClickHouse. هيّئ القرص كما يلي، وذلك بإضافة ملف إلى
/etc/clickhouse-server/config.d كما فُعل أعلاه للقرص المحلي.
يُجرى BACKUP/RESTORE لقرص S3 بالطريقة نفسها كما هو الحال مع القرص المحلي:
BACKUP TABLE data TO Disk('s3_plain', 'cloud_backup');RESTORE TABLE data AS data_restored FROM Disk('s3_plain', 'cloud_backup');
يجب عدم استخدام هذا القرص مع MergeTree نفسه، وإنما فقط مع BACKUP/RESTORE
إذا كانت جداولك تعتمد على تخزين S3 وكانت أنواع الأقراص مختلفة،
فلن تُستخدَم استدعاءات CopyObject لنسخ الأجزاء إلى حاوية الوجهة، بل سيجري
تنزيلها ثم إعادة رفعها، وهذا غير فعّال جدًا. في هذه الحالة، يُفضَّل استخدام
الصيغة BACKUP ... TO S3(<endpoint>) لهذا الغرض.
سيفشل RESTORE أعلاه إذا كان الجدول test.table يحتوي على بيانات.
يتيح الإعداد allow_non_empty_tables=true لـ RESTORE TABLE إدراج البيانات
في الجداول غير الفارغة. سيؤدي ذلك إلى مزج البيانات الموجودة مسبقًا في الجدول مع البيانات المستخرجة من النسخة الاحتياطية.
لذلك قد يتسبب هذا الإعداد في تكرار البيانات داخل الجدول، ويجب استخدامه بحذر.
لاستعادة الجدول مع وجود بيانات فيه مسبقًا، شغّل:
RESTORE TABLE test_db.test_table FROM Disk('backups', '1.zip')SETTINGS allow_non_empty_tables=true
يمكن استعادة الجداول أو إنشاء نسخ احتياطية منها بأسماء جديدة:
RESTORE TABLE test_db.test_table AS test_db.test_table_renamed FROM Disk('backups', '1.zip')
يحتوي أرشيف هذه النسخة الاحتياطية على البنية التالية:
النسخة الاحتياطية الأساسية في ClickHouse هي النسخة الاحتياطية الكاملة الأولية التي تُنشأ انطلاقًا منها
النسخ الاحتياطية التزايدية اللاحقة. ولا تخزّن النسخ الاحتياطية التزايدية سوى التغييرات
التي أُجريت منذ إنشاء النسخة الاحتياطية الأساسية، لذلك يجب إبقاء النسخة الاحتياطية الأساسية متاحة
لكي تتمكن من الاستعادة من أي نسخة احتياطية تزايدية. ويمكن تعيين وجهة النسخة الاحتياطية الأساسية باستخدام الإعداد
base_backup.
تعتمد النسخ الاحتياطية التزايدية على النسخة الاحتياطية الأساسية. ويجب إبقاء النسخة الاحتياطية الأساسية متاحة
حتى تتمكن من الاستعادة من نسخة احتياطية تزايدية.
لإنشاء نسخة احتياطية تزايدية لجدول، أنشئ أولاً نسخة احتياطية أساسية:
BACKUP TABLE test_db.test_table TO Disk('backups', 'd.zip')
BACKUP TABLE test_db.test_table TO Disk('backups', 'incremental-a.zip')SETTINGS base_backup = Disk('backups', 'd.zip')
يمكن استعادة جميع البيانات من النسخة الاحتياطية التزايدية والنسخة الاحتياطية الأساسية إلى
جدول جديد test_db.test_table2 باستخدام الأمر:
RESTORE TABLE test_db.test_table AS test_db.test_table2FROM Disk('backups', 'incremental-a.zip');
يمكن تعيين كلمة مرور على ملفات النسخ الاحتياطية المكتوبة على القرص.
يمكن تحديد كلمة المرور باستخدام الإعداد password.
لا تُدعَم الحماية بكلمة مرور إلا لأرشيفات ZIP (.zip, .zipx).
يجب أن ينتهي مسار النسخة الاحتياطية بـ .zip أو .zipx حتى تُقبل كلمة المرور.
سيؤدي استخدام كلمة مرور مع أي تنسيق آخر - بما في ذلك أرشيفات tar والمسارات غير المؤرشفة - إلى
ظهور الخطأ BAD_ARGUMENTS: Password is not applicable, backup cannot be encrypted.
يمكن تخزين النسخ الاحتياطية ليس فقط كأرشيفات zip، بل أيضًا كأرشيفات tar.
وتبقى الوظائف نفسها كما في zip، باستثناء أن الحماية بكلمة مرور غير
مدعومة في أرشيفات tar. بالإضافة إلى ذلك، تدعم أرشيفات tar مجموعة متنوعة من
طرق الضغط.لإنشاء نسخة احتياطية من جدول كأرشيف tar:
BACKUP TABLE test_db.test_table TO Disk('backups', '1.tar')
للاستعادة من أرشيف tar:
RESTORE TABLE test_db.test_table FROM Disk('backups', '1.tar')
لتغيير طريقة الضغط، يجب إضافة امتداد الملف الصحيح
إلى اسم النسخة الاحتياطية. على سبيل المثال، لضغط أرشيف tar باستخدام gzip، شغّل:
BACKUP TABLE test_db.test_table TO Disk('backups', '1.tar.gz')
إذا كانت هناك حاجة إلى استعادة تقسيمات محددة مرتبطة بجدول، فيمكن تحديدها.لنُنشئ جدولًا بسيطًا مُقسّمًا إلى أربعة تقسيمات، ونُدرج بعض البيانات فيه، ثم
نأخذ نسخة احتياطية من التقسيمين الأول والرابع فقط:
الإعداد
CREATE IF NOT EXISTS test_db;-- إنشاء جدول مُقسّمCREATE TABLE test_db.partitioned ( id UInt32, data String, partition_key UInt8) ENGINE = MergeTree()PARTITION BY partition_keyORDER BY id;INSERT INTO test_db.partitioned VALUES(1, 'data1', 1),(2, 'data2', 2),(3, 'data3', 3),(4, 'data4', 4);SELECT count() FROM test_db.partitioned;SELECT partition_key, count() FROM test_db.partitionedGROUP BY partition_keyORDER BY partition_key;