> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> لمحة عامة عن النسخ الاحتياطي والاستعادة في ClickHouse

# النسخ الاحتياطي / الاستعادة من نقطة نهاية S3 أو إليها

يتناول هذا المقال إنشاء نسخ احتياطية أو استعادتها إلى/من حاوية S3
عبر نقطة نهاية S3.

<div id="syntax">
  ## الصياغة
</div>

```sql theme={null}
-- core commands
BACKUP | RESTORE 
--- what to backup/restore (or exclude)
TABLE [db.]table_name           [AS [db.]table_name_in_backup] |
DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
DATABASE database_name          [AS database_name_in_backup] |
TEMPORARY TABLE table_name      [AS table_name_in_backup] |
VIEW view_name                  [AS view_name_in_backup] |
[EXCEPT TABLES ...] |
ALL [EXCEPT {TABLES|DATABASES}...] } [,...]
--- 
[ON CLUSTER 'cluster_name']
--- where to backup or restore to or from
TO|FROM 
File('<path>/<filename>') | 
Disk('<disk_name>', '<path>/') | 
S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>', '<extra_credentials>') |
AzureBlobStorage('<connection string>/<url>', '<container>', '<path>', '<account name>', '<account key>')
--- additional settings
[SETTINGS ...]
[ASYNC]
```

**راجع ["ملخص الأوامر"](/ar/concepts/features/backup-restore/overview#command-summary) لمزيد من التفاصيل
عن كل أمر.**

<div id="usage-examples">
  ## مثال للاستخدام
</div>

<div id="incremental-backup-to-an-s3-endpoint">
  ### نسخة احتياطية تزايدية إلى نقطة نهاية S3
</div>

في هذا المثال، سننشئ نسخة احتياطية على نقطة نهاية S3 ثم نستعيدها
منها مرة أخرى.

<Note>
  للاطلاع على شرح الفروق بين النسخة الاحتياطية الكاملة والنسخة الاحتياطية التزايدية،
  راجع ["أنواع النسخ الاحتياطي"](/ar/concepts/features/backup-restore/overview#backup-types)
</Note>

ستحتاج إلى المعلومات التالية لاستخدام هذه الطريقة:

| المَعلمة           | مثال                                                         |
| ------------------ | ------------------------------------------------------------ |
| نقطة نهاية S3      | `https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/` |
| معرّف مفتاح الوصول | `BKIOZLE2VYN3VXXTP9RC`                                       |
| مفتاح الوصول السري | `40bwYnbqN7xU8bVePaUCh3+YEyGXu8UOMV9ANpwL`                   |

<Tip>
  يرد شرح إنشاء حاوية S3 في قسم ["استخدام تخزين كائنات S3 كقرص في ClickHouse"](/ar/integrations/connectors/data-ingestion/AWS/integrating-s3-with-clickhouse#configuring-s3-for-clickhouse-use)
</Tip>

تُحدَّد وجهة النسخة الاحتياطية كما يلي:

```sql theme={null}
S3('<s3 endpoint>/<directory>', '<access key id>', '<secret access key>', '<extra_credentials>')
```

<br />

<Steps>
  <Step>
    #### الإعداد

    أنشئ قاعدة البيانات والجدول التاليين، ثم أدرج بعض البيانات العشوائية فيه.

    ```sql theme={null}
    CREATE DATABASE IF NOT EXISTS test_db;
    CREATE TABLE test_db.test_table
    (
        `key` Int,
        `value` String,
        `array` Array(String)
    )
    ENGINE = MergeTree
    ORDER BY tuple()
    ```

    ```sql theme={null}
    INSERT INTO test_db.test_table SELECT *
    FROM generateRandom('key Int, value String, array Array(String)')
    LIMIT 1000
    ```
  </Step>

  <Step>
    #### أنشئ نسخة احتياطية أساسية

    تتطلب النسخ الاحتياطية التزايدية نسخة احتياطية *أساسية* كنقطة انطلاق. المعلمة الأولى
    لوجهة S3 هي نقطة نهاية S3، تليها قيمة الدليل داخل الحاوية
    الذي سيُستخدم لهذه النسخة الاحتياطية. في هذا المثال، اسم الدليل هو `my_backup`.

    شغّل الأمر التالي لإنشاء النسخة الاحتياطية الأساسية:

    ```sql theme={null}
    BACKUP TABLE test_db.test_table TO S3(
    'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/base_backup',
    '<access key id>',
    '<secret access key>'
    )
    ```

    ```response theme={null}
    ┌─id───────────────────────────────────┬─status─────────┐
    │ de442b75-a66c-4a3c-a193-f76f278c70f3 │ BACKUP_CREATED │
    └──────────────────────────────────────┴────────────────┘
    ```
  </Step>

  <Step>
    #### أضف المزيد من البيانات

    تُملأ النسخ الاحتياطية التزايدية بالفرق بين النسخة الاحتياطية الأساسية
    والمحتوى الحالي للجدول الذي يُؤخذ له نسخة احتياطية. أضف المزيد من البيانات قبل أخذ
    النسخة الاحتياطية التزايدية:

    ```sql theme={null}
    INSERT INTO test_db.test_table SELECT *
    FROM generateRandom('key Int, value String, array Array(String)')
    LIMIT 100
    ```
  </Step>

  <Step>
    #### أنشئ نسخة احتياطية تزايدية

    يشبه أمر النسخ الاحتياطي هذا أمر النسخة الاحتياطية الأساسية، لكنه يضيف `SETTINGS base_backup` وموقع النسخة الاحتياطية الأساسية. لاحظ أن وجهة النسخة الاحتياطية التزايدية ليست الدليل نفسه الخاص بالنسخة الأساسية، بل هي نقطة النهاية نفسها مع دليل هدف مختلف داخل الـ bucket. توجد النسخة الاحتياطية الأساسية في `my_backup`، وستُكتب النسخة التزايدية إلى `my_incremental`:

    ```sql theme={null}
    BACKUP TABLE test_db.test_table TO S3(
    'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/incremental_backup',
    '<access key id>',
    '<secret access key>'
    )
    SETTINGS base_backup = S3(
    'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/base_backup',
    '<access key id>',
    '<secret access key>'
    )
    ```

    ```response theme={null}
    ┌─id───────────────────────────────────┬─status─────────┐
    │ f6cd3900-850f-41c9-94f1-0c4df33ea528 │ BACKUP_CREATED │
    └──────────────────────────────────────┴────────────────┘
    ```
  </Step>

  <Step>
    #### الاستعادة من النسخة الاحتياطية التزايدية

    يستعيد هذا الأمر النسخة الاحتياطية التزايدية إلى جدول جديد باسم `test_table_restored`.
    لاحظ أنه عند استعادة نسخة احتياطية تزايدية، تُدرَج أيضًا النسخة الاحتياطية الأساسية.
    حدِّد **النسخة الاحتياطية التزايدية** فقط عند الاستعادة:

    ```sql theme={null}
    RESTORE TABLE data AS test_db.test_table_restored FROM S3(
    'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/incremental_backup',
    '<access key id>',
    '<secret access key>'
    )
    ```

    ```response theme={null}
    ┌─id───────────────────────────────────┬─status───┐
    │ ff0c8c39-7dff-4324-a241-000796de11ca │ RESTORED │
    └──────────────────────────────────────┴──────────┘
    ```
  </Step>

  <Step>
    #### تحقّق من العدد

    أُجريت عمليتا إدراج في الجدول الأصلي `data`، إحداهما لـ 1,000 صف والأخرى لـ 100 صف، ليصبح المجموع 1,100.
    تحقّق من أن الجدول المُستعاد يحتوي على 1,100 صف:

    ```sql theme={null}
    SELECT count()
    FROM test_db.test_table_restored
    ```

    ```response theme={null}
    ┌─count()─┐
    │    1100 │
    └─────────┘
    ```
  </Step>

  <Step>
    #### التحقق من المحتوى

    يقارن هذا بين محتوى الجدول الأصلي `test_table` والجدول المستعاد `test_table_restored`:

    ```sql theme={null}
    SELECT throwIf((
       SELECT groupArray(tuple(*))
       FROM test_db.test_table
       ) != (
       SELECT groupArray(tuple(*))
       FROM test_db.test_table_restored
    ), 'Data does not match after BACKUP/RESTORE')
    ```
  </Step>
</Steps>
