> ## 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 بـ PostgreSQL

> صفحة تشرح الطرق المختلفة لربط PostgreSQL بـ ClickHouse

export const ExperimentalBadge = () => {
  return <div className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            ميزة تجريبية. <u><a href="/docs/docs/beta-and-experimental-features#experimental-features">تعرّف على المزيد.</a></u>
        </div>;
};

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            غير مدعوم في ClickHouse Cloud
        </div>;
};

تستعرض هذه الصفحة الخيارات التالية لدمج PostgreSQL مع ClickHouse:

* استخدام محرك الجدول `PostgreSQL` للقراءة من جدول في PostgreSQL
* استخدام محرك قاعدة البيانات التجريبي `MaterializedPostgreSQL` لمزامنة قاعدة بيانات في PostgreSQL مع قاعدة بيانات في ClickHouse

<Tip>
  اطّلع على خدمة [Managed Postgres](/docs/ar/products/managed-postgres/overview) الخاصة بنا. فهي تعتمد على تخزين NVMe موجود فعليًا إلى جانب موارد الحوسبة، ما يوفّر أداءً أسرع حتى 10 مرات لأحمال العمل المقيّدة بأداء القرص مقارنةً بالبدائل التي تستخدم التخزين المتصل بالشبكة مثل EBS، كما تتيح لك نسخ بيانات Postgres إلى ClickHouse باستخدام موصل Postgres CDC في ClickPipes.
</Tip>

<div id="using-the-postgresql-table-engine">
  ## استخدام محرك الجدول PostgreSQL
</div>

يتيح محرك الجدول `PostgreSQL` تنفيذ عمليتي **SELECT** و**INSERT** على البيانات المخزنة على خادم PostgreSQL البعيد من داخل ClickHouse.
تهدف هذه المقالة إلى توضيح طرق التكامل الأساسية باستخدام جدول واحد.

<Steps>
  <Step title="إعداد PostgreSQL" id="1-setting-up-postgresql">
    1. في `postgresql.conf`، أضِف الإدخال التالي لتمكين PostgreSQL من الاستماع عبر واجهات الشبكة:

    ```text theme={null}
    listen_addresses = '*'
    ```

    2. أنشئ مستخدمًا للاتصال من ClickHouse. ولأغراض التوضيح، يمنح هذا المثال صلاحيات المستخدم الخارق كاملةً.

    ```sql theme={null}
    CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
    ```

    3. أنشئ قاعدة بيانات جديدة في PostgreSQL:

    ```sql theme={null}
    CREATE DATABASE db_in_psg;
    ```

    4. أنشئ جدولًا جديدًا:

    ```sql theme={null}
    CREATE TABLE table1 (
        id         integer primary key,
        column1    varchar(10)
    );
    ```

    5. لنُضِف بضعة صفوف للاختبار:

    ```sql theme={null}
    INSERT INTO table1
      (id, column1)
    VALUES
      (1, 'abc'),
      (2, 'def');
    ```

    6. لتهيئة PostgreSQL للسماح بالاتصال بقاعدة البيانات الجديدة باستخدام المستخدم الجديد لأغراض النسخ المتماثل، أضف الإدخال التالي إلى ملف `pg_hba.conf`. حدِّث سطر العنوان باستخدام الشبكة الفرعية أو عنوان IP لخادم PostgreSQL لديك:

    ```text theme={null}
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    db_in_psg             clickhouse_user 192.168.1.0/24          password
    ```

    7. أعد تحميل ملف الإعداد `pg_hba.conf` (عدّل هذا الأمر بما يتناسب مع إصدارك):

    ```text theme={null}
    /usr/pgsql-12/bin/pg_ctl reload
    ```

    8. تحقّق من إمكانية تسجيل دخول `clickhouse_user`:

    ```text theme={null}
    psql -U clickhouse_user -W -d db_in_psg -h <your_postgresql_host>
    ```

    <Note>
      إذا كنت تستخدم هذه الميزة في ClickHouse Cloud، فقد تحتاج إلى السماح لعناوين IP الخاصة بـ ClickHouse Cloud بالوصول إلى مثيل PostgreSQL الخاص بك.
      اطّلع على [واجهة برمجة تطبيقات Cloud Endpoints](/docs/ar/products/cloud/guides/sql-console/query-endpoints) في ClickHouse لمعرفة تفاصيل حركة المرور الصادرة.
    </Note>
  </Step>

  <Step title="أنشئ جدولًا في ClickHouse" id="2-define-a-table-in-clickhouse">
    1. سجّل الدخول إلى `clickhouse-client`:

    ```bash theme={null}
    clickhouse-client --user default --password ClickHouse123!
    ```

    2. لنُنشئ قاعدة بيانات جديدة:

    ```sql theme={null}
    CREATE DATABASE db_in_ch;
    ```

    3. أنشئ جدولًا يستخدم محرك `PostgreSQL`:

    ```sql theme={null}
    CREATE TABLE db_in_ch.table1
    (
        id UInt64,
        column1 String
    )
    ENGINE = PostgreSQL('postgres-host.domain.com:5432', 'db_in_psg', 'table1', 'clickhouse_user', 'ClickHouse_123');
    ```

    الحد الأدنى من المعلمات المطلوبة هو:

    | parameter | الوصف                            | المثال                        |
    | --------- | -------------------------------- | ----------------------------- |
    | host:port | اسم المضيف أو عنوان IP والمنفذ   | postgres-host.domain.com:5432 |
    | database  | اسم قاعدة بيانات PostgreSQL      | db\_in\_psg                   |
    | user      | اسم المستخدم للاتصال بـ Postgres | clickhouse\_user              |
    | password  | كلمة المرور للاتصال بـ Postgres  | ClickHouse\_123               |

    <Note>
      اطّلع على [صفحة التوثيق الخاصة بمحرك جدول PostgreSQL](/docs/ar/reference/engines/table-engines/integrations/postgresql) للحصول على قائمة كاملة بالمعلمات.
    </Note>
  </Step>

  <Step title="اختبر التكامل" id="3-test-the-integration">
    1. في ClickHouse، اعرض الصفوف المبدئية:

    ```sql theme={null}
    SELECT * FROM db_in_ch.table1
    ```

    يجب أن يُملأ جدول ClickHouse تلقائيًا بالصفّين اللذين كانا موجودين بالفعل في جدول PostgreSQL:

    ```response theme={null}
    Query id: 34193d31-fe21-44ac-a182-36aaefbd78bf

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    │  2 │ def     │
    └────┴─────────┘
    ```

    2. في PostgreSQL مرة أخرى، أضف صفَّين إلى الجدول:

    ```sql theme={null}
    INSERT INTO table1
      (id, column1)
    VALUES
      (3, 'ghi'),
      (4, 'jkl');
    ```

    4. من المفترض أن يظهر هذان الصفّان الجديدان في جدول ClickHouse لديك:

    ```sql theme={null}
    SELECT * FROM db_in_ch.table1
    ```

    يجب أن تكون الاستجابة كما يلي:

    ```response theme={null}
    Query id: 86fa2c62-d320-4e47-b564-47ebf3d5d27b

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    │  2 │ def     │
    │  3 │ ghi     │
    │  4 │ jkl     │
    └────┴─────────┘
    ```

    5. لنرَ ما يحدث عند إضافة صفوف إلى جدول ClickHouse:

    ```sql theme={null}
    INSERT INTO db_in_ch.table1
      (id, column1)
    VALUES
      (5, 'mno'),
      (6, 'pqr');
    ```

    6. يجب أن تظهر الصفوف المضافة إلى ClickHouse في الجدول في PostgreSQL:

    ```sql theme={null}
    db_in_psg=# SELECT * FROM table1;
    id | column1
    ----+---------
      1 | abc
      2 | def
      3 | ghi
      4 | jkl
      5 | mno
      6 | pqr
    (6 rows)
    ```

    عرض هذا المثال التكامل الأساسي بين PostgreSQL وClickHouse باستخدام محرك الجدول `PostrgeSQL`.
    اطّلع على [صفحة التوثيق الخاصة بمحرك جدول PostgreSQL](/docs/ar/reference/engines/table-engines/integrations/postgresql) لمزيد من الميزات، مثل تحديد المخططات، وإرجاع مجموعة فرعية من الأعمدة فقط، والاتصال بعدة نُسخ متماثلة. واطّلع أيضًا على مدونة [ClickHouse and PostgreSQL - a match made in data heaven - part 1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres).
  </Step>
</Steps>

<div id="using-the-materializedpostgresql-database-engine">
  ## استخدام محرك قاعدة البيانات MaterializedPostgreSQL
</div>

<CloudNotSupportedBadge />

<ExperimentalBadge />

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

***في الإجراءات التالية، يُستخدم PostgreSQL CLI ‏(psql) وClickHouse CLI ‏(clickhouse-client). خادم PostgreSQL مُثبّت على Linux. وفيما يلي الحد الأدنى من الإعدادات إذا كانت قاعدة بيانات PostgreSQL عبارة عن تثبيت اختباري جديد***

<Steps>
  <Step title="في PostgreSQL" id="1-in-postgresql">
    1. في `postgresql.conf`، عيّن الحد الأدنى لمستويات الاستماع، ومستوى `WAL` للنسخ المتماثل، وفتحات النسخ المتماثل:

    أضِف الإدخالات التالية:

    ```text theme={null}
    listen_addresses = '*'
    max_replication_slots = 10
    wal_level = logical
    ```

    \**يتطلب ClickHouse حدًا أدنى من مستوى wal يبلغ `logical`، وحدًا أدنى قدره `2` من فتحات النسخ المتماثل*

    2. باستخدام حساب مسؤول، أنشئ مستخدمًا لكي يتصل ClickHouse من خلاله:

    ```sql theme={null}
    CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
    ```

    \**لأغراض التوضيح، مُنحت صلاحيات المستخدم الفائق الكاملة.*

    3. أنشئ قاعدة بيانات جديدة:

    ```sql theme={null}
    CREATE DATABASE db1;
    ```

    4. اتصل بقاعدة البيانات الجديدة باستخدام `psql`:

    ```text theme={null}
    \connect db1
    ```

    5. أنشئ جدولًا جديدًا:

    ```sql theme={null}
    CREATE TABLE table1 (
        id         integer primary key,
        column1    varchar(10)
    );
    ```

    6. أضف الصفوف الأولية:

    ```sql theme={null}
    INSERT INTO table1
    (id, column1)
    VALUES
    (1, 'abc'),
    (2, 'def');
    ```

    7. اضبط PostgreSQL للسماح بالاتصال بقاعدة البيانات الجديدة باستخدام المستخدم الجديد لأغراض النسخ المتماثل. فيما يلي الحد الأدنى من الإدخالات التي يجب إضافتها إلى ملف `pg_hba.conf`:

    ```text theme={null}
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    db1             clickhouse_user 192.168.1.0/24          password
    ```

    \**لأغراض العرض التوضيحي، تُستخدم هنا طريقة المصادقة بكلمة مرور بنص صريح. حدِّث سطر العنوان ليستخدم إمّا الشبكة الفرعية أو عنوان الخادم وفقًا لوثائق PostgreSQL*

    8. أعد تحميل إعداد `pg_hba.conf` بشيءٍ مثل هذا (عدِّله بما يناسب إصدارك):

    ```text theme={null}
    /usr/pgsql-12/bin/pg_ctl reload
    ```

    9. اختبر تسجيل الدخول باستخدام اسم المستخدم الجديد `clickhouse_user`:

    ```text theme={null}
     psql -U clickhouse_user -W -d db1 -h <your_postgresql_host>
    ```
  </Step>

  <Step title="في ClickHouse" id="2-in-clickhouse">
    1. سجّل الدخول إلى ClickHouse CLI

    ```bash theme={null}
    clickhouse-client --user default --password ClickHouse123!
    ```

    2. فعِّل الميزة التجريبية لـ PostgreSQL الخاصة بمحرك قاعدة البيانات:

    ```sql theme={null}
    SET allow_experimental_database_materialized_postgresql=1
    ```

    3. أنشئ قاعدة البيانات الجديدة المراد نسخها متماثلًا، وعرّف الجدول الأولي:

    ```sql theme={null}
    CREATE DATABASE db1_postgres
    ENGINE = MaterializedPostgreSQL('postgres-host.domain.com:5432', 'db1', 'clickhouse_user', 'ClickHouse_123')
    SETTINGS materialized_postgresql_tables_list = 'table1';
    ```

    الحد الأدنى من الخيارات:

    | parameter | Description                      | example                                           |
    | --------- | -------------------------------- | ------------------------------------------------- |
    | host:port | اسم المضيف أو عنوان IP والمنفذ   | postgres-host.domain.com:5432                     |
    | database  | اسم قاعدة بيانات PostgreSQL      | db1                                               |
    | user      | اسم المستخدم للاتصال بـ postgres | clickhouse\_user                                  |
    | password  | كلمة المرور للاتصال بـ postgres  | ClickHouse\_123                                   |
    | settings  | إعدادات إضافية للمحرك            | materialized\_postgresql\_tables\_list = 'table1' |

    <Info>
      للاطلاع على الدليل الكامل لمحرك قاعدة بيانات PostgreSQL، راجع [https://clickhouse.com/docs/engines/database-engines/materialized-postgresql/#settings](https://clickhouse.com/docs/engines/database-engines/materialized-postgresql/#settings)
    </Info>

    4. تحقّق من أن الجدول الأوّلي يحتوي على بيانات:

    ```sql theme={null}
    ch_env_2 :) select * from db1_postgres.table1;

    SELECT *
    FROM db1_postgres.table1
    ```

    ```response theme={null}
    Query id: df2381ac-4e30-4535-b22e-8be3894aaafc

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  2 │ def     │
    └────┴─────────┘
    ```
  </Step>

  <Step title="اختبر النسخ المتماثل الأساسي" id="3-test-basic-replication">
    1. في PostgreSQL، أضف صفوفًا جديدة:

    ```sql theme={null}
    INSERT INTO table1
    (id, column1)
    VALUES
    (3, 'ghi'),
    (4, 'jkl');
    ```

    2. في ClickHouse، تأكد من ظهور الصفوف الجديدة:

    ```sql theme={null}
    ch_env_2 :) select * from db1_postgres.table1;

    SELECT *
    FROM db1_postgres.table1
    ```

    ```response theme={null}
    Query id: b0729816-3917-44d3-8d1a-fed912fb59ce

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  4 │ jkl     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  3 │ ghi     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  2 │ def     │
    └────┴─────────┘
    ```
  </Step>

  <Step title="الملخص" id="4-summary">
    يركّز دليل التكامل هذا على مثال بسيط يوضّح كيفية إجراء النسخ المتماثل لقاعدة بيانات تحتوي على جدول واحد، لكن توجد خيارات أكثر تقدمًا تشمل نسخ قاعدة البيانات بالكامل أو إضافة جداول ومخططات جديدة إلى عمليات النسخ المتماثل الحالية. وعلى الرغم من أن أوامر DDL غير مدعومة في هذا النوع من النسخ المتماثل، يمكن ضبط المحرّك بحيث يكتشف التغييرات ويعيد تحميل الجداول عند إجراء تغييرات هيكلية.

    <Info>
      لمزيد من الإمكانات المتاحة ضمن الخيارات المتقدمة، يُرجى الاطلاع على [الوثائق المرجعية](/docs/ar/reference/engines/database-engines/materialized-postgresql).
    </Info>
  </Step>
</Steps>
