الانتقال إلى المحتوى الرئيسي
العمليات التالية متاحة على الأقسام:

DETACH PARTITION|PART

ALTER TABLE table_name [ON CLUSTER cluster] DETACH PARTITION|PART partition_expr
ينقل جميع البيانات الخاصة بالقسم المحدد إلى الدليل detached. ويتعامل الخادم مع قسم البيانات المفصول كما لو أنه غير موجود. ولن يكون الخادم على علم بهذه البيانات حتى تُجري استعلام ATTACH. مثال:
ALTER TABLE mt DETACH PARTITION '2020-11-21';
ALTER TABLE mt DETACH PART 'all_2_2_0';
اطّلع على كيفية تعيين تعبير التقسيم في قسم How to set the partition expression. بعد تنفيذ الاستعلام، يمكنك فعل ما تشاء بالبيانات الموجودة في الدليل detached — حذفها من نظام الملفات أو تركها كما هي. هذا الاستعلام مُكرَّر — إذ ينقل البيانات إلى الدليل detached على جميع النسخ المتماثلة. لاحظ أنه لا يمكنك تنفيذ هذا الاستعلام إلا على نسخة متماثلة قائدة. لمعرفة ما إذا كانت النسخة المتماثلة قائدة، نفِّذ استعلام SELECT على جدول system.replicas. وبدلًا من ذلك، من الأسهل تنفيذ استعلام DETACH على جميع النسخ المتماثلة — فجميع النسخ المتماثلة ستُطلق استثناءً، باستثناء النسخ المتماثلة القائدة (إذ يُسمح بوجود عدة قادة).

DROP PARTITION|PART

ALTER TABLE table_name [ON CLUSTER cluster] DROP PARTITION|PART partition_expr
يحذف القسم المحدد من الجدول. يضع هذا الاستعلام علامة على القسم باعتباره غير نشط، ثم يحذف البيانات نهائيًا خلال نحو 10 دقائق. اقرأ عن تعيين تعبير التقسيم في قسم كيفية تعيين تعبير التقسيم. هذا الاستعلام مُكرَّر — إذ يحذف البيانات من جميع النُسخ المتماثلة. مثال:
ALTER TABLE mt DROP PARTITION '2020-11-21';
ALTER TABLE mt DROP PART 'all_4_4_0';

DROP DETACHED PARTITION|PART

ALTER TABLE table_name [ON CLUSTER cluster] DROP DETACHED PARTITION|PART ALL|partition_expr
يزيل الجزء المحدد أو جميع أجزاء القسم المحدد من detached. اقرأ المزيد عن كيفية تعيين تعبير القسم في قسم كيفية تعيين تعبير القسم.

FORGET PARTITION

ALTER TABLE table_name FORGET PARTITION partition_expr
يزيل جميع البيانات الوصفية المتعلقة بقسم فارغ من ZooKeeper. يفشل الاستعلام إذا كان القسم غير فارغ أو غير معروف. تأكد من تنفيذ ذلك فقط على الأقسام التي لن تُستخدم مجددًا أبدًا. اقرأ عن تعيين تعبير القسم في قسم كيفية تعيين تعبير القسم. مثال:
ALTER TABLE mt FORGET PARTITION '20201121';

ATTACH PARTITION|PART

ALTER TABLE table_name ATTACH PARTITION|PART partition_expr
يضيف بيانات إلى الجدول من الدليل detached. ويمكن إضافة بيانات لقسم كامل أو لجزء منفصل. أمثلة:
ALTER TABLE visits ATTACH PARTITION 201901;
ALTER TABLE visits ATTACH PART 201901_2_2_0;
اقرأ المزيد عن تعيين تعبير القسم في قسم كيفية تعيين تعبير القسم. هذا الاستعلام مكرَّر. تتحقق النسخة المتماثلة المُبادِرة مما إذا كانت هناك بيانات في دليل detached. إذا وُجدت البيانات، يتحقق الاستعلام من سلامتها. وإذا كان كل شيء صحيحًا، يضيف الاستعلام البيانات إلى الجدول. إذا عثرت النسخة المتماثلة غير المُبادِرة، التي تستقبل أمر الإرفاق، على الجزء ذي قيم التحقق الصحيحة في مجلد detached الخاص بها، فإنها تُرفق البيانات من دون جلبها من النسخ المتماثلة الأخرى. إذا لم يوجد جزء ذو قيم تحقق صحيحة، تُنزَّل البيانات من أي نسخة متماثلة تحتوي على هذا الجزء. يمكنك وضع البيانات في دليل detached على إحدى النسخ المتماثلة واستخدام استعلام ALTER ... ATTACH لإضافتها إلى الجدول على جميع النسخ المتماثلة.

ATTACH PARTITION FROM

ALTER TABLE table2 [ON CLUSTER cluster] ATTACH PARTITION partition_expr FROM table1
ينسخ هذا الاستعلام قسم البيانات من table1 إلى table2. لاحظ ما يلي:
  • لن تُحذف البيانات من table1 ولا من table2.
  • قد يكون table1 جدولًا مؤقتًا.
لكي يُنفَّذ الاستعلام بنجاح، يجب استيفاء الشروط التالية:
  • يجب أن يكون للجدولين البنية نفسها.
  • يجب أن يكون للجدولين مفتاح التقسيم نفسه، ومفتاح ORDER BY نفسه، والمفتاح الأساسي نفسه.
  • يجب أن تكون للجدولين سياسة التخزين نفسها.
  • يجب أن يتضمن جدول الوجهة جميع الفهارس والإسقاطات الموجودة في الجدول المصدر. إذا كان الإعداد enforce_index_structure_match_on_partition_manipulation مُمكّنًا في جدول الوجهة، فيجب أن تكون الفهارس والإسقاطات متطابقة. وإلا، فيمكن أن يشتمل جدول الوجهة على جميع فهارس الجدول المصدر وإسقاطاته، بالإضافة إلى فهارس وإسقاطات أخرى.

REPLACE PARTITION

ALTER TABLE table2 [ON CLUSTER cluster] REPLACE PARTITION partition_expr FROM table1
ينسخ هذا الاستعلام قسم البيانات من table1 إلى table2 ويستبدل القسم الموجود في table2. هذه العملية ذرية. لاحظ ما يلي:
  • لن تُحذف البيانات من table1.
  • يمكن أن يكون table1 جدولًا مؤقتًا.
لكي يُنفَّذ الاستعلام بنجاح، يجب استيفاء الشروط التالية:
  • يجب أن تكون للجدولين البنية نفسها.
  • يجب أن يكون للجدولين مفتاح التقسيم نفسه، ومفتاح ORDER BY نفسه، والمفتاح الأساسي نفسه.
  • يجب أن تكون للجدولين سياسة التخزين نفسها.
  • يجب أن يتضمن الجدول الوجهة جميع الفهارس والإسقاطات الموجودة في الجدول المصدر. إذا كان الإعداد enforce_index_structure_match_on_partition_manipulation مُمكّنًا في الجدول الوجهة، فيجب أن تكون الفهارس والإسقاطات متطابقة. وإلا، يمكن أن يشتمل الجدول الوجهة على مجموعة فائقة من فهارس الجدول المصدر وإسقاطاته.

MOVE PARTITION TO TABLE

ALTER TABLE table_source [ON CLUSTER cluster] MOVE PARTITION partition_expr TO TABLE table_dest
ينقل هذا الاستعلام قسم البيانات من table_source إلى table_dest مع حذف البيانات من table_source. لكي يعمل الاستعلام بنجاح، يجب استيفاء الشروط التالية:
  • يجب أن يكون للجدولين البنية نفسها.
  • يجب أن يكون للجدولين مفتاح التقسيم نفسه، ومفتاح ORDER BY نفسه، والمفتاح الأساسي نفسه.
  • يجب أن تكون للجدولين سياسة التخزين نفسها.
  • يجب أن ينتمي الجدولان إلى الفئة نفسها من المحرك (replicated أو non-replicated).
  • يجب أن يتضمن جدول الوجهة جميع الفهارس والإسقاطات الموجودة في جدول المصدر. إذا كان الإعداد enforce_index_structure_match_on_partition_manipulation مُمكّنًا في جدول الوجهة، فيجب أن تكون الفهارس والإسقاطات متطابقة تمامًا. وإلا، يمكن أن يضم جدول الوجهة مجموعةً أشمل من فهارس جدول المصدر وإسقاطاته.

CLEAR COLUMN IN PARTITION

ALTER TABLE table_name [ON CLUSTER cluster] CLEAR COLUMN column_name IN PARTITION partition_expr
يعيد ضبط جميع القيم في العمود المحدد داخل قسم. إذا كان البند DEFAULT محددًا عند إنشاء جدول، فإن هذا الاستعلام يعيّن قيمة العمود إلى القيمة الافتراضية المحددة. مثال:
ALTER TABLE visits CLEAR COLUMN hour in PARTITION 201902

FREEZE PARTITION

ALTER TABLE table_name [ON CLUSTER cluster] FREEZE [PARTITION partition_expr] [WITH NAME 'backup_name']
ينشئ هذا الاستعلام نسخة احتياطية محلية لقسم محدد. وإذا حُذف بند PARTITION، ينشئ الاستعلام نسخة احتياطية لجميع الأقسام دفعة واحدة.
تُنفَّذ عملية النسخ الاحتياطي بالكامل من دون إيقاف الخادم.
لاحظ أنه بالنسبة إلى الجداول ذات النمط القديم، يمكنك تحديد بادئة اسم القسم (على سبيل المثال، 2019) — وعندئذٍ ينشئ الاستعلام نسخة احتياطية لجميع الأقسام المطابقة. اقرأ عن تعيين تعبير القسم في قسم كيفية تعيين تعبير القسم. عند التنفيذ، ولإنشاء لقطة بيانات، ينشئ الاستعلام روابط صلبة لبيانات الجدول. وتوضع هذه الروابط الصلبة في الدليل /var/lib/clickhouse/shadow/N/...، حيث:
  • يمثّل /var/lib/clickhouse/ دليل العمل الخاص بـ ClickHouse والمحدَّد في ملف config.
  • يمثّل N الرقم التزايدي للنسخة الاحتياطية.
  • إذا جرى تحديد المعلَمة WITH NAME، فتُستخدم قيمة المعلَمة 'backup_name' بدلًا من الرقم التزايدي.
إذا كنت تستخدم مجموعة من الأقراص لتخزين البيانات في جدول، فسيظهر الدليل shadow/N على كل قرص، مع تخزين أجزاء البيانات التي طابقتها عبارة PARTITION.
يُنشأ داخل النسخة الاحتياطية نفس هيكل الأدلة الموجود داخل /var/lib/clickhouse/. وينفّذ الاستعلام chmod على جميع الملفات، بما يمنع الكتابة إليها. بعد إنشاء النسخة الاحتياطية، يمكنك نسخ البيانات من /var/lib/clickhouse/shadow/ إلى الخادم البعيد ثم حذفها من الخادم المحلي. لاحظ أن الاستعلام ALTER t FREEZE PARTITION لا يُكرَّر. فهو ينشئ نسخة احتياطية محلية على الخادم المحلي فقط. ينشئ الاستعلام النسخة الاحتياطية على الفور تقريبًا (لكنه ينتظر أولًا حتى تنتهي الاستعلامات الحالية على الجدول المعني من التنفيذ). ينسخ ALTER TABLE t FREEZE PARTITION البيانات فقط، وليس بيانات وصفي الجدول. ولإنشاء نسخة احتياطية من بيانات وصفي الجدول، انسخ الملف /var/lib/clickhouse/metadata/database/table.sql لاستعادة البيانات من نسخة احتياطية، اتبع ما يلي:
  1. أنشئ الجدول إذا لم يكن موجودًا. لعرض الاستعلام، استخدم ملف ‎.sql‎ (واستبدل ATTACH فيه بـ CREATE).
  2. انسخ البيانات من الدليل data/database/table/ داخل النسخة الاحتياطية إلى الدليل /var/lib/clickhouse/data/database/table/detached/.
  3. شغّل استعلامات ALTER TABLE t ATTACH PARTITION لإضافة البيانات إلى جدول.
لا تتطلب الاستعادة من نسخة احتياطية إيقاف الخادم. يعالج الاستعلام الأجزاء بالتوازي، ويُنظَّم عدد خيوط التنفيذ بواسطة الإعداد max_threads. لمزيد من المعلومات حول النسخ الاحتياطي واستعادة البيانات، راجع قسم “النسخ الاحتياطي والاستعادة في ClickHouse”.

UNFREEZE PARTITION

ALTER TABLE table_name [ON CLUSTER cluster] UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'
يزيل أقسام frozen ذات الاسم المحدد من القرص. وإذا حُذفت عبارة PARTITION، يزيل الاستعلام النسخة الاحتياطية لجميع الأقسام دفعةً واحدة.

CLEAR INDEX IN PARTITION

ALTER TABLE table_name [ON CLUSTER cluster] CLEAR INDEX index_name IN PARTITION partition_expr
يعمل الاستعلام بشكل مشابه لـ CLEAR COLUMN، لكنه يعيد تعيين فهرس بدلًا من بيانات عمود.

FETCH PARTITION|PART

ALTER TABLE table_name [ON CLUSTER cluster] FETCH PARTITION|PART partition_expr FROM 'path-in-zookeeper'
ينزّل قسمًا من خادم آخر. لا يعمل هذا الاستعلام إلا مع الجداول المُنسَّخة. ينفّذ هذا الاستعلام ما يلي:
  1. ينزّل القسم|الجزء من الشظية المحددة. في ‘path-in-zookeeper’ يجب تحديد مسار إلى الشظية في ZooKeeper.
  2. ثم يضع الاستعلام البيانات التي تم تنزيلها في الدليل detached للجدول table_name. استخدم الاستعلام ATTACH PARTITION|PART لإضافة البيانات إلى الجدول.
على سبيل المثال:
  1. FETCH PARTITION
ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits';
ALTER TABLE users ATTACH PARTITION 201902;
  1. FETCH PART
ALTER TABLE users FETCH PART 201901_2_2_0 FROM '/clickhouse/tables/01-01/visits';
ALTER TABLE users ATTACH PART 201901_2_2_0;
لاحظ ما يلي:
  • إن الاستعلام ALTER ... FETCH PARTITION|PART لا يُكرَّر عبر النسخ المتماثلة. فهو يضع الجزء أو القسم في الدليل detached على الخادم المحلي فقط.
  • إن الاستعلام ALTER TABLE ... ATTACH يُكرَّر عبر النسخ المتماثلة. فهو يضيف البيانات إلى جميع النسخ المتماثلة. وتُضاف البيانات إلى إحدى النسخ المتماثلة من الدليل detached، وإلى النسخ الأخرى من النسخ المتماثلة المجاورة.
قبل التنزيل، يتحقق النظام مما إذا كان القسم موجودًا وما إذا كانت بنية الجدول متطابقة. ويُختار تلقائيًا أنسب نسخة متماثلة من بين النسخ المتماثلة السليمة. على الرغم من أن الاستعلام يُسمى ALTER TABLE، فإنه لا يغيّر بنية الجدول ولا يغيّر فورًا البيانات المتاحة في الجدول.

MOVE PARTITION|PART

ينقل الأقسام أو أجزاء البيانات إلى وحدة تخزين أو قرص آخر في الجداول التي تستخدم المحرك MergeTree. راجع استخدام عدة أجهزة تخزين كتلية لتخزين البيانات.
ALTER TABLE table_name [ON CLUSTER cluster] MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name'
استعلام ALTER TABLE t MOVE:
  • غير مكرّر، لأن النسخ المتماثلة المختلفة قد تكون لها سياسات تخزين مختلفة.
  • يُرجع خطأً إذا لم يكن القرص أو وحدة التخزين المحددة مُهيّأة. ويُرجع الاستعلام أيضًا خطأً إذا تعذّر تطبيق شروط نقل البيانات المحددة في سياسة التخزين.
  • قد يُرجع خطأً إذا كانت البيانات المطلوب نقلها قد نُقلت بالفعل بواسطة عملية في الخلفية، أو بواسطة استعلام ALTER TABLE t MOVE آخر متزامن، أو نتيجة دمج البيانات في الخلفية. ولا ينبغي للمستخدم اتخاذ أي إجراءات إضافية في هذه الحالة.
مثال:
ALTER TABLE hits MOVE PART '20190301_14343_16206_438' TO VOLUME 'slow'
ALTER TABLE hits MOVE PARTITION '2019-09-01' TO DISK 'fast_ssd'

UPDATE IN PARTITION

يُعدِّل البيانات في القسم المحدد التي تطابق تعبير التصفية المحدد. ويُنفَّذ كـ mutation. البنية:
ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_expr] WHERE filter_expr

مثال

-- using partition name
ALTER TABLE mt UPDATE x = x + 1 IN PARTITION 2 WHERE p = 2;

-- using partition id
ALTER TABLE mt UPDATE x = x + 1 IN PARTITION ID '2' WHERE p = 2;

انظر أيضًا

DELETE IN PARTITION

يحذف البيانات من القسم المحدد التي تطابق تعبير التصفية المحدد. ويُنفَّذ على هيئة mutation. البنية:
ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE [IN PARTITION partition_expr] WHERE filter_expr

مثال

-- using partition name
ALTER TABLE mt DELETE IN PARTITION 2 WHERE p = 2;

-- using partition id
ALTER TABLE mt DELETE IN PARTITION ID '2' WHERE p = 2;

REWRITE PARTS

سيُعيد هذا كتابة الأجزاء من الصفر باستخدام جميع الإعدادات الجديدة. وهذا منطقي، لأن الإعدادات على مستوى الجدول مثل use_const_adaptive_granularity لا تُطبَّق افتراضيًا إلا على الأجزاء التي أُعيدت كتابتها حديثًا.

مثال

ALTER TABLE mt REWRITE PARTS;
ALTER TABLE mt REWRITE PARTS IN PARTITION 2;

راجع أيضًا

كيفية تحديد تعبير التقسيم

يمكنك تحديد تعبير التقسيم في استعلامات ALTER ... PARTITION بطرق مختلفة:
  • كقيمة من العمود partition في جدول system.parts. على سبيل المثال: ALTER TABLE visits DETACH PARTITION 201901.
  • باستخدام keyword ‏ALL. ولا يمكن استخدامه إلا مع DROP/DETACH/ATTACH/ATTACH FROM. على سبيل المثال: ALTER TABLE visits ATTACH PARTITION ALL.
  • كـ Tuple من expressions أو الثوابت يطابق (من حيث الأنواع) Tuple الخاص بـ partitioning key للجدول. وفي حالة partitioning key المكوَّن من عنصر واحد، يجب تضمين تعبير التقسيم داخل الدالة tuple (...). على سبيل المثال: ALTER TABLE visits DETACH PARTITION tuple(toYYYYMM(toDate('2019-01-25'))).
  • باستخدام partition ID. وهو معرّف String للقسم (human-readable إن أمكن) يُستخدم كاسم للأقسام في نظام الملفات وفي ZooKeeper. ويجب تحديد partition ID في clause ‏PARTITION ID بين single quotes. على سبيل المثال: ALTER TABLE visits DETACH PARTITION ID '201901'.
  • في استعلامَي ALTER ATTACH PART وDROP DETACHED PART، لتحديد اسم part، استخدم string literal بقيمة من العمود name في جدول system.detached_parts. على سبيل المثال: ALTER TABLE visits ATTACH PART '201901_1_1_0'.
يعتمد استخدام علامات الاقتباس عند تحديد القسم على type الخاص بـ تعبير التقسيم. فعلى سبيل المثال، بالنسبة إلى النوع String، يجب تحديده بين علامتَي اقتباس ('). أما النوعان Date وInt* فلا يحتاجان إلى علامات اقتباس. تنطبق جميع القواعد المذكورة أعلاه أيضًا على استعلام OPTIMIZE. وإذا كنت بحاجة إلى تحديد القسم الوحيد عند تحسين جدول غير مُقسَّم، فاضبط expression ‏PARTITION tuple(). على سبيل المثال:
OPTIMIZE TABLE table_not_partitioned PARTITION tuple() FINAL;
يحدِّد IN PARTITION القسم الذي تُطبَّق عليه تعبيرات UPDATE أو DELETE نتيجةً لاستعلام ALTER TABLE. ولا تُنشأ أجزاء جديدة إلا من القسم المحدَّد. وبهذه الطريقة، يساعد IN PARTITION على تقليل الحمل عندما يكون الجدول مُقسَّمًا إلى عدد كبير من الأقسام، ولا تحتاج إلا إلى تحديث البيانات بشكل موضعي. تُعرَض أمثلة على استعلامات ALTER ... PARTITION في الاختبارين 00502_custom_partitioning_local و00502_custom_partitioning_replicated_zookeeper.
آخر تعديل في ٢٥ يونيو ٢٠٢٦