العمليات التالية متاحة على الأقسام:
- DETACH PARTITION|PART — ينقل قسمًا أو جزءًا إلى الدليل
detachedويفصله. - DROP PARTITION|PART — يحذف قسمًا أو جزءًا.
- DROP DETACHED PARTITION|PART - يحذف جزءًا أو جميع أجزاء قسم من
detached. - FORGET PARTITION — يحذف البيانات الوصفية لقسم من ZooKeeper إذا كان فارغًا.
- ATTACH PARTITION|PART — يضيف قسمًا أو جزءًا من الدليل
detachedإلى الجدول. - ATTACH PARTITION FROM — ينسخ قسم البيانات من جدول إلى آخر ثم يضيفه.
- REPLACE PARTITION — ينسخ قسم البيانات من جدول إلى آخر ثم يستبدله.
- MOVE PARTITION TO TABLE — ينقل قسم البيانات من جدول إلى آخر.
- CLEAR COLUMN IN PARTITION — يعيد تعيين قيمة عمود محدد في قسم.
- CLEAR INDEX IN PARTITION — يعيد تعيين الفهرس الثانوي المحدد في قسم.
- FREEZE PARTITION — ينشئ نسخة احتياطية لقسم.
- UNFREEZE PARTITION — يزيل نسخة احتياطية لقسم.
- FETCH PARTITION|PART — ينزّل جزءًا أو قسمًا من خادم آخر.
- MOVE PARTITION|PART — ينقل القسم/جزء البيانات إلى قرص أو وحدة تخزين أخرى.
- UPDATE IN PARTITION — يحدّث البيانات داخل القسم وفقًا لشرط.
- DELETE IN PARTITION — يحذف البيانات داخل القسم وفقًا لشرط.
- REWRITE PARTS — يعيد كتابة الأجزاء في الجدول بالكامل (أو في قسم محدد).
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 201902FREEZE 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'بدلًا من الرقم التزايدي.
يُنشأ داخل النسخة الاحتياطية نفس هيكل الأدلة الموجود داخل /var/lib/clickhouse/. وينفّذ الاستعلام chmod على جميع الملفات، بما يمنع الكتابة إليها.
بعد إنشاء النسخة الاحتياطية، يمكنك نسخ البيانات من /var/lib/clickhouse/shadow/ إلى الخادم البعيد ثم حذفها من الخادم المحلي. لاحظ أن الاستعلام ALTER t FREEZE PARTITION لا يُكرَّر. فهو ينشئ نسخة احتياطية محلية على الخادم المحلي فقط.
ينشئ الاستعلام النسخة الاحتياطية على الفور تقريبًا (لكنه ينتظر أولًا حتى تنتهي الاستعلامات الحالية على الجدول المعني من التنفيذ).
ينسخ ALTER TABLE t FREEZE PARTITION البيانات فقط، وليس بيانات وصفي الجدول. ولإنشاء نسخة احتياطية من بيانات وصفي الجدول، انسخ الملف /var/lib/clickhouse/metadata/database/table.sql
لاستعادة البيانات من نسخة احتياطية، اتبع ما يلي:
- أنشئ الجدول إذا لم يكن موجودًا. لعرض الاستعلام، استخدم ملف .sql (واستبدل
ATTACHفيه بـCREATE). - انسخ البيانات من الدليل
data/database/table/داخل النسخة الاحتياطية إلى الدليل/var/lib/clickhouse/data/database/table/detached/. - شغّل استعلامات
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'ينزّل قسمًا من خادم آخر. لا يعمل هذا الاستعلام إلا مع الجداول المُنسَّخة.
ينفّذ هذا الاستعلام ما يلي:
- ينزّل القسم|الجزء من الشظية المحددة. في 'path-in-zookeeper' يجب تحديد مسار إلى الشظية في ZooKeeper.
- ثم يضع الاستعلام البيانات التي تم تنزيلها في الدليل
detachedللجدولtable_name. استخدم الاستعلام ATTACH PARTITION|PART لإضافة البيانات إلى الجدول.
على سبيل المثال:
- FETCH PARTITION
ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits';
ALTER TABLE users ATTACH PARTITION 201902;- 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 من تعبير أو الثوابت يطابق (من حيث الأنواع) 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.