تتناول الأسئلة الشائعة حول ClickPipes for Postgres العديد من الأسئلة المتعلقة بكيفية عمل النسخ المتماثل في Postgres — بما في ذلك أعمدة TOAST، وفتحات النسخ المتماثل، والمنشورات، وتغييرات المخطط، وتعيينات الأنواع. وتنطبق المعلومات الواردة هناك أيضًا على عمليات الترحيل إلى ClickHouse Managed Postgres.
أواجه خطأ "invalid input value for enum" أثناء النسخ المتماثل
يحدث هذا الخطأ عندما يحتوي Postgres المصدر على قيمة enum غير موجودة في ClickHouse Managed Postgres الهدف. لا ينقل النسخ المتماثل المنطقي أوامر ALTER TYPE ... ADD VALUE تلقائيًا، لذلك فإن أي قيم enum جديدة تُضاف إلى المصدر بعد الإعداد الأولي للمخطط ستؤدي إلى فشل عمليات الإدراج على الهدف.
لإصلاح ذلك، أضف القيمة المفقودة إلى نوع enum في Postgres الهدف:
ALTER TYPE your_enum_type ADD VALUE 'new_value';استبدل your_enum_type باسم نوع enum الخاص بك، و'new_value' بالقيمة المفقودة الواردة في رسالة الخطأ.
يظهر لي خطأ انتهاك قيد فريد أو قيد تحقق أثناء النسخ المتماثل
قد تحدث انتهاكات للقيود أثناء النسخ المتماثل المنطقي عندما يؤدي ترتيب النسخ المتماثل إلى تعارض مع قيد موجود على الهدف.
- القيود الفريدة: نطبّق التغييرات كعمليات
MERGE/UPSERTمجمّعة تكتب أحدث قيمة لكل مفتاح أساسي، لذا قد لا يتوافق ترتيب العمليات لمفتاح معيّن مع الترتيب الذي يتوقعه الفهرس الفريد. وقد يؤدي ذلك مؤقتًا إلى انتهاك قيدUNIQUEضمن المعاملة، رغم استيفاء القيد عند اكتمالMERGE. لا يستطيع Postgres تأجيل التحقق من الفهارس الفريدة كما يؤجل التحقق من المفاتيح الخارجية، لذا لا يمكن تأجيل هذا التحقق إلى نهاية المعاملة. لا يؤثر ذلك في اتساق البيانات: إذ تُحدَّد هوية الصف بالمفتاح الأساسي، ويعتمد منطقMERGEعلى المفتاح الأساسي نفسه. - قيود التحقق: قد يكون قيد التحقق على الهدف أكثر صرامة من المصدر، أو قد لا تستوفي حالة وسيطة أثناء تنفيذ
MERGEمجمّع هذا القيد، رغم أن الحالة النهائية تستوفيه. وكما هو الحال مع القيود الفريدة، لا يؤثر ذلك في اتساق البيانات، إذ يعتمدMERGEعلى المفتاح الأساسي الذي يحدد هوية الصف.
لإعادة تشغيل النسخ المتماثل، احذف القيد المسبّب للمشكلة من Postgres الهدف:
-- Drop a unique constraint
ALTER TABLE your_table DROP CONSTRAINT your_constraint_name;
-- Drop a check constraint
ALTER TABLE your_table DROP CONSTRAINT your_check_constraint_name;يمكنك العثور على تفاصيل القيد باستخدام الاسم المذكور في رسالة الخطأ:
SELECT conname, conrelid::regclass, contype
FROM pg_constraint
WHERE conname = 'your_constraint_name';أعِد إضافة القيود أثناء التحويل، بعد اكتمال النسخ المتماثل وتوقف المصدر عن العمل:
ALTER TABLE your_table ADD CONSTRAINT your_constraint_name UNIQUE (column1, column2);
ALTER TABLE your_table ADD CONSTRAINT your_check_constraint_name CHECK (column1 > 0);تظهر رسالة الخطأ "cannot insert a non-DEFAULT value into column" أثناء النسخ المتماثل
يحدث هذا الخطأ عندما يُعرَّف عمود في الهدف — عادةً المفتاح الأساسي — بأنه GENERATED ALWAYS AS IDENTITY. ينقل النسخ المتماثل المنطقي القيم الصريحة من المصدر، لكن عمود GENERATED ALWAYS يرفض أي قيمة غير DEFAULT، لذا تفشل عمليات الإدراج بالرسالة التالية:
cannot insert a non-DEFAULT value into column "id"لحل هذه المشكلة، عدّل العمود في Postgres الهدف ليقبل القيم التي يوفّرها المستخدم. يمكنك تغيير عمود الهوية إلى GENERATED BY DEFAULT AS IDENTITY:
ALTER TABLE your_table ALTER COLUMN id SET GENERATED BY DEFAULT;GENERATED BY DEFAULT AS IDENTITY (أو عمود serial/bigserial) يُنشئ القيم تلقائيًا عند عدم تقديم قيمة، لكنه بخلاف GENERATED ALWAYS يقبل أيضًا القيم الصريحة المُنسخة من المصدر.
يظهر لي خطأ "الامتداد غير متاح" أثناء الترحيل
يحدث هذا الخطأ أثناء الترحيل الآلي للمخطط (pg_dump) عندما يعتمد المخطط المصدر على امتداد Postgres غير مثبّت أو غير متاح في Managed Postgres الهدف. ويظهر بإحدى الصيغ التالية:
ERROR: extension "your_extension" is not available
ERROR: could not open extension control file ".../your_extension.control": No such file or directoryاستبدل your_extension باسم الامتداد المذكور في رسالة الخطأ.
لحل هذه المشكلة، يمكنك:
- إعادة إنشاء الـ pipe باستخدام وضع تفريغ المخطط اليدوي، لتتمكن من تعديل المخطط وإزالة التبعية على الامتداد غير المدعوم أو استبدالها، أو
- فتح تذكرة دعم لتمكين الامتداد على Managed Postgres الهدف.