Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

CHECK TABLE

يُستخدم الاستعلام CHECK TABLE في ClickHouse لإجراء فحص تحقّق لجدول معيّن أو لأقسامه. وهو يضمن سلامة البيانات من خلال التحقّق من المجاميع الاختبارية وبُنى البيانات الداخلية الأخرى.

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

الصيغة

الصيغة الأساسية للاستعلام كما يلي:

CHECK TABLE table_name [PARTITION partition_expression | PART part_name] [FORMAT format] [SETTINGS check_query_single_value_result = (0|1) [, other_settings]]
  • table_name: يحدّد اسم الجدول الذي تريد التحقق منه.
  • partition_expression: (اختياري) إذا كنت تريد التحقق من قسم محدد من الجدول، يمكنك استخدام هذا التعبير لتحديد القسم.
  • part_name: (اختياري) إذا كنت تريد التحقق من جزء محدد في الجدول، يمكنك إضافة قيمة حرفية نصية لتحديد اسم الجزء.
  • FORMAT format: (اختياري) يتيح لك تحديد format الإخراج للنتيجة.
  • SETTINGS: (اختياري) يتيح لك إضافة إعدادات إضافية.
    • (اختياري): check_query_single_value_result: يتحكم هذا الإعداد في ما إذا كان الإخراج مفصلًا (0) أو مُلخّصًا (1).
    • يمكن أيضًا تطبيق إعدادات أخرى. إذا لم تكن بحاجة إلى ترتيب حتمي للنتائج، يمكنك تعيين max_threads إلى قيمة أكبر من واحد لتسريع الاستعلام.

تعتمد استجابة الاستعلام على قيمة الإعداد check_query_single_value_result. في حال كانت قيمة check_query_single_value_result = 1، تتم إعادة العمود result فقط مع صف واحد. وتكون القيمة داخل هذا الصف 1 إذا نجح فحص السلامة، و0 إذا كانت البيانات تالفة.

عند استخدام check_query_single_value_result = 0، يعيد الاستعلام الأعمدة التالية:

  • part_path: يشير إلى المسار إلى جزء البيانات أو اسم الملف.
    • is_passed: يعيد 1 إذا نجح الفحص لهذا الجزء، وإلا 0.
    • message: أي رسائل إضافية مرتبطة بالفحص، مثل رسائل الخطأ أو النجاح.

يدعم الاستعلام CHECK TABLE محركات الجداول التالية:

يؤدي تنفيذ هذا الاستعلام على جداول تستخدم محركات جداول أخرى إلى ظهور الاستثناء NOT_IMPLEMENTED.

لا توفّر المحركات من عائلة *Log استعادة تلقائية للبيانات عند الفشل. استخدم الاستعلام CHECK TABLE لاكتشاف فقدان البيانات في الوقت المناسب.

أمثلة

يعرض استعلام CHECK TABLE، بشكل افتراضي، حالة التحقق العامة للجدول:

Querysql
CHECK TABLE test_table;
Responsetext
┌─result─┐
│      1 │
└────────┘

إذا أردت الاطلاع على حالة الفحص لكل جزء بيانات على حدة، يمكنك استخدام الإعداد check_query_single_value_result.

وللتحقق من قسم محدد من الجدول، يمكنك استخدام الكلمة المفتاحية PARTITION.

Querysql
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Responsetext
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
│ 201003_3_3_0 │         1 │         │
└──────────────┴───────────┴─────────┘

وبالمثل، يمكنك فحص جزء معيّن من الجدول باستخدام الكلمة المفتاحية PART.

Querysql
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Responsetext
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
└──────────────┴───────────┴─────────┘

لاحظ أنه عندما لا يكون الجزء موجودًا، يُرجع الاستعلام خطأً:

Querysql
CHECK TABLE t0 PART '201003_111_222_0'
Responsetext
DB::Exception: No such data part '201003_111_222_0' to check in table 'default.t0'. (NO_SUCH_DATA_PART)

تلقّي نتيجة 'Corrupted'

احذف ملف checksum الحالي:

rm /var/lib/clickhouse-server/data/default/t0/201003_3_3_0/checksums.txt
Querysql
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Responsetext
┌─part_path────┬─is_passed─┬─message──────────────────────────────────┐
│ 201003_7_7_0 │         1 │                                          │
│ 201003_3_3_0 │         1 │ Checksums recounted and written to disk. │
└──────────────┴───────────┴──────────────────────────────────────────┘

إذا كان الملف checksums.txt مفقودًا، فيمكن استعادته. سيُعاد حسابه وكتابته أثناء تنفيذ الأمر CHECK TABLE للقسم المحدد، وسيظل يُبلَّغ عن الحالة على أنها 'is_passed = 1'.

يمكنك التحقق من جميع جداول (Replicated)MergeTree الموجودة دفعةً واحدة باستخدام الاستعلام CHECK ALL TABLES.

CHECK ALL TABLES
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
┌─database─┬─table────┬─part_path───┬─is_passed─┬─message─┐
│ default  │ t2       │ all_1_95_3  │         1 │         │
│ db1      │ table_01 │ all_39_39_0 │         1 │         │
│ default  │ t1       │ all_39_39_0 │         1 │         │
│ db1      │ t1       │ all_39_39_0 │         1 │         │
│ db1      │ table_01 │ all_1_6_1   │         1 │         │
│ default  │ t1       │ all_1_6_1   │         1 │         │
│ db1      │ t1       │ all_1_6_1   │         1 │         │
│ db1      │ table_01 │ all_7_38_2  │         1 │         │
│ db1      │ t1       │ all_7_38_2  │         1 │         │
│ default  │ t1       │ all_7_38_2  │         1 │         │
└──────────┴──────────┴─────────────┴───────────┴─────────┘

للتحقق من حالة قاعدة بيانات كاملة بدلًا من سلامة الجداول الفردية، استخدم استعلام CHECK DATABASE. وهو مخصّص أساسًا لقواعد البيانات التي تستخدم المحرك DataLakeCatalog، حيث يتحقق من إمكانية الوصول إلى الكتالوج الخارجي.

إذا كانت البيانات تالفة

إذا كان الجدول تالفًا، يمكنك نسخ البيانات غير التالفة إلى جدول آخر. للقيام بذلك:

  1. أنشئ جدولًا جديدًا له البنية نفسها للجدول التالف. للقيام بذلك، نفّذ الاستعلام CREATE TABLE <new_table_name> AS <damaged_table_name>.
  2. اضبط قيمة max_threads على 1 لمعالجة الاستعلام التالي باستخدام خيط تنفيذ واحد. للقيام بذلك، شغّل الاستعلام SET max_threads = 1.
  3. نفّذ الاستعلام INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>. ينسخ هذا الطلب البيانات غير التالفة من الجدول التالف إلى جدول آخر. لن تُنسخ إلا البيانات التي تسبق الجزء التالف.
  4. أعد تشغيل clickhouse-client لإعادة ضبط قيمة max_threads.
Navigation