تحديث PostgreSQL 12

:warning: تحذير! إذا كانت قاعدة بياناتك ضخمة جدًا، فستحتاج إلى مساحة تخزين إضافية كبيرة (ضعف حجم قاعدة البيانات) ويجب أن تكون حذرًا للغاية عند إجراء هذه الترقية!

لقد قمنا مؤخرًا بإطلاق ترقية الإصدار الرئيسي لـ PostgreSQL التي طال انتظارها. سيتم ترقية أي مدير موقع يعيد بناء Discourse من سطر الأوامر إلى PostgreSQL 12 من الإصدار القديم PostgreSQL 10.

نقوم بتشغيل هذا الإصدار الجديد منذ فترة على Meta، وكل شيء يعمل بشكل صحيح. يجلب PostgreSQL 12 العديد من التحسينات التي سيتم استغلالها تلقائيًا بواسطة Discourse.

التحديث

دليل التثبيت الرسمي (حاوية واحدة)

في إعادة البناء التالية، ستظهر هذه الرسالة في النهاية:

تمت الترقية بنجاح
----------------

لإكمال الترقية، أعد البناء مرة أخرى باستخدام الأمر:

./launcher rebuild app
-------------------------------------------------------------------------------------

هذا يعني أن كل شيء سار على ما يرام خلال الترقية! كل ما عليك فعله هو إصدار أمر إعادة بناء جديد لاستعادة موقعك وجعله يعمل مرة أخرى.

تثبيت حاوية البيانات

إذا كنت تشغل إعدادًا يحتوي على حاوية بيانات مخصصة بناءً على العينة المقدمة في مستودع discourse_dour، فتأكد من إيقاف تشغيل PostgreSQL بطريقة آمنة ونظيفة.

اليوم، لدينا مهام خلفية تعمل استعلامات تمتد لعدة دقائق، لذا فإن إيقاف تشغيل حاوية الويب سيساعد في إيقاف تشغيل حاوية البيانات بشكل آمن.

./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only

قبل إصدار أمر إعادة البناء الأول إلى حاوية البيانات، يمكنك تتبع سجل PostgreSQL للتأكد من أنه تم إيقاف تشغيله بشكل صحيح.

يجب أن يعطيك تشغيل الأمر tail -f shared/data/log/var-log/postgres/current السجل التالي إذا كان الإغلاق نظيفًا:

2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

إجراء تحديث يدوي / بيئات محدودة المساحة

:warning::warning::warning:
يجب عليك نسخ بيانات POSTGRES_DATA احتياطيًا قبل تجربة هذا الإجراء
:warning::warning::warning:

إذا كنت في بيئة محدودة المساحة ولا توجد لديك أي طريقة للحصول على مساحة إضافية، يمكنك تجربة ما يلي:

./launcher stop app #(أو كل من web_only و data إذا كان هذا هو حالتك)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/10/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/12/data \
	tianon/postgres-upgrade:10-to-12
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
./launcher rebuild app #(أو أولاً data ثم web_only إذا كان هذا هو حالتك)

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

تأجيل التحديث

إذا كنت بحاجة إلى تأجيل التحديث أثناء إعادة البناء التالية، فيمكنك تبديل قالب PostgreSQL في ملف app.yml عن طريق تغيير "templates/postgres.template.yml" إلى "templates/postgres.10.template.yml".

لا يُنصح بذلك، حيث قد ينسى بعض مدراء المواقع عكس التغيير لاحقًا.

مهام اختيارية بعد التحديث

تحسين إحصائيات PostgreSQL

بعد التحديث، لن يكون لدى PostgreSQL الجديد إحصائيات الجداول جاهزة. يمكنك توليدها باستخدام الأمر التالي:

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
VACUUM VERBOSE ANALYZE;
\q
exit
exit

أو النسخة المكونة من سطر واحد من الأمر أعلاه:

/var/discourse/launcher run app "echo 'vacuum verbose analyze;' | su postgres -c 'psql discourse'"

تنظيف البيانات القديمة

في حالة التثبيت القياسي، يمكنك حذف البيانات القديمة بتنسيق PG10 باستخدام الأمر التالي:

cd /var/discourse
./launcher cleanup

إذا كان لديك حاوية بيانات منفصلة، فستحتاج إلى إزالة نسخة النسخ الاحتياطي بهذه الطريقة:

rm -fr /var/discourse/shared/data/postgres_data_old/

الأسئلة الشائعة

لم يتم إيقاف تشغيل مجموعة المصادر بشكل نظيف

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

أعد تشغيل الحاوية القديمة باستخدام ./launcher start app. انتظر بضع دقائق حتى تعود للعمل.

الآن أوقف تشغيلها مرة أخرى باستخدام ./launcher stop app. بعد ذلك، تابع السجلات للتأكد من أنها كانت نظيفة:

tail -f shared/data/log/var-log/postgres/current
2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

إذا بدت السجلات مثل ما هو موضح أعلاه، يمكنك الآن محاولة الترقية مرة أخرى باستخدام ./launcher rebuild app.

قيم lc_collate لقاعدة البيانات “postgres” لا تتطابق

يحدث هذا الخطأ إذا كنت تستخدم مناطق (locales) غير افتراضية لقاعدة بياناتك. تم الإبلاغ عن أنك تحتاج إلى 3 متغيرات لكي تنجح العملية. تأكد من أن قسم env: في ملف app.yml يحتوي على الأسطر الثلاثة التالية:

  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

استبدل en_US.UTF-8 بمنطقتك الخاصة.

كل إعادة بناء تقوم بالترقية مرة أخرى (حلقة الترقية)

عند حدوث ذلك، ستحتوي سجلات الترقية على:

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty

هذا يعني أن هناك ملفات لا تزال موجودة من الترقية الأخيرة. انقلها إلى مكان آخر قبل المتابعة.

68 إعجابًا
Update failed (postgresql)
Trouble with latest update
Discourse Update Probs. Help please
Cant backup because of version mismatch on aws
User profile page and other features page not available
Error after Upgrading
SAML error after upgrade
Updated to latest version: ./analyze_new_cluster.sh message
Discourse 2.5.0.beta5 Release Notes
Problem with upgrading the latest version
UPGRADE OF POSTGRES FAILED - I've tried everything
Trouble with postgre(maybe)
Postgres upgrade success loop due to prior postgres 8 to 10 migration
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
Failed upgrade from 2.5.0beta4 to 2.5.0beta5
Corrupt indexes in PG12, how do I fix?
PostgreSQL 13 update
Fixing discourse after disk full
LDAP Auth Missing from Plugins
Today error when upgrade from 2.5.1 to 2.5.2, discourse-assign
Discourse for Teams (Alpha Testing summer 2020)
Issue Rebuilding App Failing on Postgres Upgrade
How hard is it to handle Discourse after installation
Primary Postgres database process (postmaster) eating all CPU
Discourse failing to connect to port 3000
Upgrade of postgres failed
Search 502 errors in 2.5.0.beta6
2.6.0 beta 3 update failed on disk and/or memory space
How to backup and restore a whole /var/discourse app folder?
PostgreSQL update wrecked my forum. Please help!
Instead of auto-deleting old replies, make them auto-hide?
Add print CSS for front page and category page?
Site down after failed update: permission denied to create extension "unaccent"
Migrate quickly to separate web and data containers
Rebuild failed - FAILED TO BOOTSTRAP
Old Postgres on Docker Image with two containers: web and data
Can't rebuild due to failed postgres 12 upgrade
Should I also rebuild my data container when upgrading
Old Postgres on Docker Image with two containers: web and data
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
UPGRADE OF POSTGRES FAILED - I've tried everything
PostgreSQL 15 update
Help! Problem with firewall/permissions and postgre?
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
Problem with upgrading the latest version
Restore failed at "EXCEPTION: x of y uploads are not migrated to S3. S3 migration failed for db 'default'."
Trouble with latest update
Can't upgrade due to old docker version
Database migration chokes on huge value of a "calendar-details" item in table "post_custom_fields"
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade