الانتقال إلى المحتوى الرئيسي
يُستخدم الاستعلام CHECK TABLE في ClickHouse لإجراء فحص تحقّق لجدول معيّن أو لأقسامه. وهو يضمن سلامة البيانات من خلال التحقّق من المجاميع الاختبارية وبُنى البيانات الداخلية الأخرى. وعلى وجه الخصوص، يقارن أحجام الملفات الفعلية بالقيم المتوقعة المخزّنة على الخادم. وإذا لم تتطابق أحجام الملفات مع القيم المخزّنة، فهذا يعني أن البيانات تالفة. وقد يحدث ذلك، على سبيل المثال، بسبب تعطل النظام أثناء تنفيذ الاستعلام.
قد يقرأ الاستعلام CHECK TABLE جميع البيانات الموجودة في الجدول ويشغل بعض الموارد، مما يجعله مرتفع الاستهلاك للموارد. ضع في اعتبارك التأثير المحتمل على الأداء واستهلاك الموارد قبل تنفيذ هذا الاستعلام. لن يؤدي هذا الاستعلام إلى تحسين أداء النظام، ويجب ألا تنفذه إذا لم تكن متأكدًا مما تفعله.

الصيغة

الصيغة الأساسية للاستعلام كما يلي:
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، بشكل افتراضي، حالة التحقق العامة للجدول:
Query
CHECK TABLE test_table;
Response
┌─result─┐
│      1 │
└────────┘
إذا أردت الاطلاع على حالة الفحص لكل جزء بيانات على حدة، يمكنك استخدام الإعداد check_query_single_value_result. وللتحقق من قسم محدد من الجدول، يمكنك استخدام الكلمة المفتاحية PARTITION.
Query
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Response
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
│ 201003_3_3_0 │         1 │         │
└──────────────┴───────────┴─────────┘
وبالمثل، يمكنك فحص جزء معيّن من الجدول باستخدام الكلمة المفتاحية PART.
Query
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Response
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
└──────────────┴───────────┴─────────┘
لاحظ أنه عندما لا يكون الجزء موجودًا، يُرجع الاستعلام خطأً:
Query
CHECK TABLE t0 PART '201003_111_222_0'
Response
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
Query
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Response
┌─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 │         │
└──────────┴──────────┴─────────────┴───────────┴─────────┘

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

إذا كان الجدول تالفًا، يمكنك نسخ البيانات غير التالفة إلى جدول آخر. للقيام بذلك:
  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.
آخر تعديل في ٢٥ يونيو ٢٠٢٦