> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> يوفّر وصولًا فوريًا إلى جداول قاعدة بيانات على خادم ClickHouse بعيد، ويوجّه إليه استعلامات `SELECT` و`INSERT`.

# Remote

يوفّر محرّكا قواعد البيانات `Remote` و`RemoteSecure` وصولًا فوريًا إلى جداول قاعدة بيانات على خادم ClickHouse بعيد عبر بروتوكول TCP الأصلي. وهما نظيرا ClickHouse إلى ClickHouse لمحرّكي قواعد البيانات [`MySQL`](/docs/ar/reference/engines/database-engines/mysql) و[`PostgreSQL`](/docs/ar/reference/engines/database-engines/postgresql).

تُجلب قائمة الجداول وبنيتها من الخادم البعيد عند الطلب (باستخدام `SHOW TABLES` و`DESCRIBE TABLE` داخليًا)، لذا تعكس قاعدة البيانات دائمًا الحالة الحالية للخادم البعيد. يُتاح كل جدول كوحدة تخزين [`Distributed`](/docs/ar/reference/engines/table-engines/special/distributed) عبر عنقود مخصّص يُنشأ من العناوين المقدَّمة، ويوجّه استعلامات `SELECT` و`INSERT` إلى الخادم البعيد.

يفيد ذلك في ربط عدة عناقيد ClickHouse معًا أو في توصيل عنقود ClickHouse أكبر بـ `clickhouse-local` أو بعنقود أصغر.

<div id="creating-a-database">
  ## إنشاء قاعدة بيانات
</div>

<Tabs>
  <Tab title="Remote" id="remote">
    يتصل `Remote` عبر منفذ TCP غير المشفّر (`tcp_port`، وهو `9000` افتراضيًا) عند عدم تحديد المنفذ.

    ```sql theme={null}
    CREATE DATABASE remote_db
    ENGINE = Remote('addresses_expr', 'database'[, 'user'[, 'password']]);
    ```
  </Tab>

  <Tab title="RemoteSecure" id="remote-secure">
    يتصل `RemoteSecure` عبر اتصال TLS آمن باستخدام منفذ TCP الآمن (`tcp_port_secure`، وهو `9440` افتراضيًا) عند عدم تحديد المنفذ.

    ```sql theme={null}
    CREATE DATABASE remote_db
    ENGINE = RemoteSecure('addresses_expr', 'database'[, 'user'[, 'password']]);
    ```
  </Tab>
</Tabs>

**معلمات المحرك**

* `addresses_expr` — عنوان خادم بعيد أو تعبير يُنشئ عدة عناوين، بصيغة `host` أو `host:port`. يدعم تعبير العنوان أنماط التوسيع نفسها التي تدعمها دالة الجدول [`remote`](/docs/ar/reference/functions/table-functions/remote) (مثل `{a,b,c}` و`{N..M}` و`{a|b}` للتوسيع إلى عدة شرائح ونسخ متماثلة). عند عدم تحديد المنفذ، يستخدم `Remote` منفذ TCP غير المشفّر (`tcp_port`، وهو `9000` افتراضيًا)، بينما يستخدم `RemoteSecure` منفذ TCP الآمن (`tcp_port_secure`، وهو `9440` افتراضيًا).
* `database` — اسم قاعدة البيانات على الخادم البعيد.
* `user` — اسم المستخدم البعيد. اختياري؛ الافتراضي: `default`.
* `password` — كلمة مرور المستخدم البعيد. اختياري؛ الافتراضي: فارغ.

تُخزَّن العناوين وبيانات الاعتماد في تعريف قاعدة البيانات، لذا تُخفى كلمة المرور في `SHOW CREATE DATABASE`. وكما هو الحال مع دالة الجدول `remote`، يُعامل العنوان الذي يشير إلى الخادم الحالي كشريحة محلية: يُنفَّذ `SELECT` و`INSERT` مباشرةً باسم المستخدم الحالي — الذي يحتاج بالتالي إلى الامتيازات المناسبة على قاعدة البيانات الأساسية وجداولها — ولا تُستخدم بيانات الاعتماد المخزنة إلا للخوادم البعيدة فعليًا. إذا لم تكن النسخة المتماثلة المحلية لشريحة ما تحتوي على قاعدة البيانات أو أحد الجداول، يعود البحث إلى النسخ المتماثلة البعيدة للشريحة، كما يفعل جدول [`Distributed`](/docs/ar/reference/engines/table-engines/special/distributed). في هذه الحالة، يعرض `SHOW CREATE TABLE` عناوين الرجوع الفعلية (بعد إزالة النسخ المتماثلة المحلية من شرائحها) بدلًا من العناوين المُهيَّأة، بحيث يعيد تعريف الجدول `Remote(...)` الناتج إنشاء الكائن الذي يخدم الاستعلامات فعليًا.

عندما يصف تعبير العنوان عدة شرائح، يقرأ كل جدول وكيل من جميعها، لكن البيانات الوصفية — قائمة الجداول وبنيتها — تُؤخذ من شريحة عشوائية (مع تفضيل الشريحة المحلية)، تمامًا كما تفعل دالة الجدول [`remote`](/docs/ar/reference/functions/table-functions/remote)، بحيث يتطلب عرض القائمة استعلامًا واحدًا بدلًا من استعلام لكل شريحة. لذلك، يُتوقع أن تخدم شرائح العنقود المجموعة نفسها من الجداول؛ أما الجدول الموجود في بعض هذه الشرائح فقط، فيخدمه وكيل تفشل استعلاماته على الشرائح التي لا تحتويه. يرسل `INSERT` إلى جدول في قاعدة بيانات متعددة الشرائح كل صف إلى شريحة عشوائية (تحمل جداول `Distributed` الوكيلة مفتاح تقسيم `rand()` ضمنيًا)؛ ولتثبيت الشريحة لاستعلام ما، عيّن [`insert_shard_id`](/docs/ar/reference/settings/session-settings/insert#insert_shard_id). لا يوزع المفتاح الضمني سوى الصفوف المُدرجة؛ أما عند القراءة، فيتصرف الجدول كجدول `Distributed` بلا مفتاح تقسيم (وبالأخص، لا يعامل [`optimize_skip_unused_shards`](/docs/ar/reference/settings/session-settings/optimize-skip#optimize_skip_unused_shards) و[`force_optimize_skip_unused_shards`](/docs/ar/reference/settings/session-settings/force-optimize#force_optimize_skip_unused_shards) هذا المفتاح كمفتاح لتقليم الشرائح). يتضمن `SHOW CREATE TABLE` المفتاح في تعريف الجدول `Remote(...)` الناتج، لذا يقبل الجدول المُعاد إنشاؤه منه أيضًا استعلامات `INSERT` متعددة الشرائح.

المجموعات المسماة مدعومة أيضًا:

```sql theme={null}
CREATE DATABASE remote_db
ENGINE = Remote(my_named_collection, database = 'default');
```

<div id="notes">
  ## ملاحظات
</div>

* المحرك عبارة عن عرض قراءة مباشر للخادم البعيد: لا تُدعم تعليمات DDL مثل `CREATE TABLE` و`DROP TABLE` و`ALTER` وما شابهها على قاعدة البيانات `Remote`. أدِر المخطط مباشرةً على الخادم البعيد.
* تُطبَّق حقوق الوصول على الخادم البعيد للمستخدم البعيد المُهيأ، ومحليًا عبر الامتيازات المعتادة على قاعدة البيانات وجداولها.
* يُبلَّغ عن جدول في شريحة محلية لا يُسمح للمستخدم برؤيته باعتباره مفقودًا لا محظورًا، لذا لا يمكن استخدام قاعدة بيانات `Remote` لاستقصاء أسماء جداول قاعدة بيانات محلية لا يملك المستخدم امتيازات عليها. ينطبق ذلك على سرد الجداول (`SHOW TABLES`، `EXISTS TABLE`) وكذلك على تحليلها (`DESCRIBE TABLE`، `SHOW CREATE TABLE`، `SELECT`)، ولا يُتاح هذا الجدول أيضًا عبر النسخ المتماثلة البعيدة لـ شريحة الخاص به: لا يحدث الرجوع الاحتياطي الموضح أعلاه إلا عندما لا تحتوي النسخة المتماثلة المحلية على الجدول فعلًا.
* يشمل سرد جداول قاعدة بيانات موجودة على النسخة المتماثلة المحلية لـ شريحة أيضًا الجداول الموجودة فقط لدى النسخ المتماثلة البعيدة لذلك شريحة، بحيث يتوافق `SHOW TABLES` و`system.tables` مع `EXISTS TABLE` و`DESCRIBE TABLE` و`SELECT`، التي تلجأ احتياطيًا إلى تلك النسخ. وعندما لا تستجيب أي من النسخ المتماثلة البعيدة، تُعاد قائمة النسخة المتماثلة المحلية كما هي، لأنها تمثل بالفعل استجابة نسخة متماثلة متاحة.
* إذا كان الخادم البعيد غير متاح، فإن سرد جداوله (`SHOW TABLES`، `system.tables`) يُظهر خطأ الاتصال بدلًا من قائمة جداول فارغة، تمامًا كما يفعل `EXISTS TABLE` و`SELECT` على قاعدة البيانات نفسها. لاحظ أن تنفيذ `SELECT` على `system.tables` ليشمل جميع قواعد البيانات يفشل أيضًا ما دامت قاعدة بيانات كهذه يتعذر الوصول إليها.
* قد تشير قاعدة بيانات `Remote` إلى قاعدة بيانات `Remote` أخرى على الخادم نفسه. لا يتطلب سرد جداول هذه السلسلة ووصفها امتيازات على قاعدة البيانات الوسيطة، إذ لا تحتفظ ببيانات أو بيانات وصفية خاصة بها، كما أن كل قفزة تتحقق أصلًا من حقوق المستدعي على الكائنات التي توكلها بدورها. أما قراءة البيانات وكتابتها فتتطلب `SELECT` / `INSERT` في كل قفزة من السلسلة، لأن الاستعلام يُنفَّذ فعليًا على جدول قاعدة البيانات الوسيطة، تمامًا كما في جدول `Distributed` فوق جدول `Distributed` آخر. وتبقى قاعدة الرؤية الموضحة أعلاه سارية عبر السلسلة: فالجدول الذي تخفيه قاعدة البيانات الوسيطة عن المستدعي لا يُتاح أيضًا عبر النسخ المتماثلة البعيدة لقاعدة البيانات الخارجية. وإذا تعذر على قاعدة البيانات الوسيطة في النسخة المتماثلة المحلية الوصول إلى هدفها، فلن تتمكن النسخة المتماثلة المحلية لـ شريحة الخارجي من الاستجابة إطلاقًا، تمامًا كما لو كانت النسخة المتماثلة نفسها متوقفة، وعندها تلجأ قاعدة البيانات الخارجية احتياطيًا إلى النسخ المتماثلة البعيدة لـ شريحة.

<div id="example">
  ## مثال
</div>

أنشئ قاعدة بيانات `Remote` تشير إلى قاعدة بيانات `system` على خادم بعيد، ثم اقرأ منها:

```sql theme={null}
CREATE DATABASE remote_system
ENGINE = Remote('127.0.0.1:9000', 'system', 'default', '');
```

```sql theme={null}
SHOW TABLES FROM remote_system LIKE 'one';
```

```text theme={null}
┌─name─┐
│ one  │
└──────┘
```

```sql theme={null}
SELECT * FROM remote_system.one;
```

```text theme={null}
┌─dummy─┐
│     0 │
└───────┘
```
