فشل النسخ الاحتياطي مع postgres 18

قاعدة بيانات مثيل Discourse الخاص بنا ليست حاوية محلية، بل نستخدم مجموعة قواعد بيانات مركزية. مؤخرًا، تم تحديث PostgreSQL المركزي إلى الإصدار 18.3. لاحظت أن نسخ Discourse الاحتياطي يفشل الآن:

[2026-05-19 03:37:37] [STARTED]
[2026-05-19 03:37:37] بدأ النظام النسخ الاحتياطي!
[2026-05-19 03:37:37] تحديد حالة النسخ الاحتياطي على أنها قيد التشغيل...
[2026-05-19 03:37:37] التأكد من وجود '/var/www/discourse/tmp/backups/default/2026-05-19-033737'...
[2026-05-19 03:37:37] التأكد من وجود '/var/www/discourse/public/backups/default'...
[2026-05-19 03:37:37] تحديث البيانات الوصفية...
[2026-05-19 03:37:37] تصفية مخطط قاعدة البيانات العام...
[2026-05-19 03:37:37] pg_dump: خطأ: التوقف بسبب عدم تطابق إصدار الخادم
[2026-05-19 03:37:37] pg_dump: تفاصيل: إصدار الخادم: 18.3 (Ubuntu 18.3-1.pgdg24.04+1); إصدار pg_dump: 15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] استثناء: فشل pg_dump
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173: في 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36: في 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13: في 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10: في 'Jobs::CreateBackup#execute'

هل لديك أي أفكار حول كيفية إصلاح هذا؟

يبدو أن هذا تعارض بين إصدارات عميل/خادم PostgreSQL.

يتم تشغيل النسخ الاحتياطي من حاوية Discourse، حيث يكون إصدار pg_dump هو 15.15، بينما خادم PostgreSQL الخارجي هو الإصدار 18.3:

server version: 18.3; pg_dump version: 15.15

أنا حذر من تعديل حاوية Discourse ما لم يوصي فريق Discourse بذلك. غريزتي الأولى هي الحفاظ على توافق مجموعة قواعد البيانات الخارجية مع إصدار PostgreSQL الذي تتوقعه/يدعمه Discourse حاليًا.

حسناً، مفهوم. في هذه الحالة لم يكن أمامي خيار، إذ كنا بحاجة إلى 18 لمشروع آخر يستخدم نفس مجموعة قواعد البيانات. هُمّ، يبدو أننا سنحتاج إلى خادم قاعدة بيانات منفصل مخصص بالكامل لـ Discourse بـ 15 وحدة.

هل هناك أي تعليقات من جانب CDCK؟

ربما يكون من الممكن ترقية العميل في مكانه؟

بما أنك أثبتت التوافق مع PG 18 حيث تستخدمه كقاعدة بيانات إنتاجية، فإن هذا يبدو منخفض المخاطر.

لقد أجريت اختبارًا سريعًا سابقًا باستخدام PostgreSQL 18 خارجيًا وتثبيت تجريبي لـ Discourse، ولم تظهر أي مشاكل. لكن، بصراحة، كان هذا الاختبار فقط “سريعًا وغير دقيق”، وليس اختبارًا “عميقًا”. على أي حال، يعمل النظام منذ أسبوعين، لذا أفترض أنه على ما يرام. حتى الآن، المشكلة الوحيدة هي النسخ الاحتياطي الداخلي الخاص بـ Discourse. من ناحية أخرى، يتم نسخ خادم قاعدة البيانات نفسه (الذي يعمل على LXC) احتياطيًا بشكل منفصل.

كانت السياسة في الماضي هي الترقية كل إصدارين. ومع ذلك، مرّ عام ونصف منذ إصدار PostgreSQL 17، ولا تزال صورة Docker الرسمية تستخدم الإصدار 15، لذا لست متأكدًا مما إذا كان هذا لا يزال هو الحال.

هناك مواضيع شبه مطابقة في الماضي يمكنك الرجوع إليها، مثل: Any chance to upgrade the postgres-client version?

فكرة فقط - هل يمكنك التصدير مباشرة من سطر الأوامر من خادم PostgreSQL؟

يمكنك إضافة كود إلى ملف app.yml لتحديث PostgreSQL إلى الإصدار المطابق. لقد قمت بذلك من قبل، لكنني لم أتمكن من العثور على ملاحظاتي. أسهل طريقة هي الدخول إلى الحاوية، وتنفيذ أوامر apt لتثبيت عملاء PostgreSQL المناسبين، ثم محاولة عمل نسخة احتياطية. بمجرد نجاح ذلك، أضف هذه الأوامر إلى أوامر exec في ملف app.yml لضمان عملها بعد إعادة البناء التالية.

إذا كنت بحاجة إلى شخص يشرح لك الخطوات، فيمكنك مراسلتي عبر البريد الإلكتروني أو النشر في قناة Marketplace.

هه، كان الأمر بسيطًا جدًا:

  1. ./launcher enter web_only
  2. sudo apt-get install postgresql

هذا يحدّث حزمة postgres إلى الإصدار 18.
ثم ابدأ النسخ الاحتياطي من واجهة المسؤول، ويبدو أن العملية ناجحة

[2026-05-21 16:26:50] بدأ المستخدم «admin» عملية النسخ الاحتياطي!
[2026-05-21 16:26:50] جاري تحديد حالة النسخ الاحتياطي على أنها قيد التنفيذ...
[2026-05-21 16:26:50] جاري التأكد من وجود المسار '/var/www/discourse/tmp/backups/default/2026-05-21-162650'...
[2026-05-21 16:26:50] جاري التأكد من وجود المسار '/var/www/discourse/public/backups/default'...
[2026-05-21 16:26:50] جاري تحديث البيانات الوصفية...
[2026-05-21 16:26:50] جاري تصدير المخطط العام لقاعدة البيانات...
[2026-05-21 16:26:50] pg_dump: تنفيذ SELECT pg_catalog.set_config('search_path', '', false);
[2026-05-21 16:26:50] pg_dump: آخر معرف كائن مدمج هو 16383
[2026-05-21 16:26:50] pg_dump: قراءة الامتدادات
[2026-05-21 16:26:50] pg_dump: تحديد أعضاء الامتداد
[2026-05-21 16:26:50] pg_dump: قراءة المخططات
[2026-05-21 16:26:50] pg_dump: قراءة الجداول المعرفة بواسطة المستخدم
[2026-05-21 16:26:50] pg_dump: قراءة الدوال المعرفة بواسطة المستخدم
[2026-05-21 16:26:50] pg_dump: قراءة الأنواع المعرفة بواسطة المستخدم
[2026-05-21 16:26:50] pg_dump: قراءة اللغات الإجرائية
[2026-05-21 16:26:50] pg_dump: قراءة الدوال المجمعة المعرفة بواسطة المستخدم
[2026-05-21 16:26:50] pg_dump: قراءة المشغلات المعرفة بواسطة المستخدم
[2026-05-21 16:26:50] pg_dump: قراءة طرق الوصول المعرفة بواسطة المستخدم
[2026-05-21 16:26:50] pg_dump: قراءة فئات المشغلات المعرفة بواسطة المستخدم
[2026-05-21 16:26:50] pg_dump: قراءة عائلات المشغلات المعرفة بواسطة المستخدم
[... .... ...]
[2026-05-21 16:26:57] جاري إنهاء عملية النسخ الاحتياطي...
[2026-05-21 16:26:57] جاري إنشاء الأرشيف: netzwissen-forum-2026-05-21-162650-v20260520064255.tar.gz
[2026-05-21 16:26:57] جاري التأكد من عدم وجود الأرشيف مسبقًا...
[2026-05-21 16:26:57] جاري إنشاء أرشيف فارغ...
[2026-05-21 16:26:57] جاري أرشفة بيانات التصدير...
[2026-05-21 16:26:57] جاري أرشفة الملفات المرفقة...
[2026-05-21 16:26:58] جاري حذف المجلد المؤقت '/var/www/discourse/tmp/backups/default/2026-05-21-162650'...
[2026-05-21 16:26:58] جاري ضغط الأرشيف باستخدام Gzip، وقد يستغرق ذلك بعض الوقت...

رائع! سأحاول على الأرجح تثبيت مكونات عميل PostgreSQL 18 تحديدًا لضمان عدم الانتقال إلى الإصدار 19 في مرحلة ما. كما ستحتاج إلى إضافة هذه الأوامر إلى ملف app.yml، ما لم تكن تفضل تنفيذها يدويًا مع كل ترقية.