تحذير! إذا كانت قاعدة بياناتك كبيرة جدًا، فستحتاج إلى مساحة قرص إضافية كبيرة (ضعف حجم قاعدة البيانات) ويجب أن تكون حذرًا جدًا مع هذا التحديث!
لقد قمنا للتو بتطبيق تغييرات لترقية صورة Docker الخاصة بنا إلى PostgreSQL 15. سيتم ترقية أي مسؤولي مواقع يقومون بإعادة بناء Discourse من سطر الأوامر إلى PostgreSQL 15 من PostgreSQL 13 السابق. لاحظ أنه إذا كنت قد أجلت الترقية عندما حدث تحديث PostgreSQL 13 في عام 2020، يمكنك تخطي تلك الترقية والانتقال مباشرة إلى PostgreSQL 15.
إذا كنت قد أجلت الترقية سابقًا، فقم بتغيير قالب PostgreSQL في app.yml من templates/postgres.12.template.yml إلى templates/postgres.template.yml.
كما هو الحال مع أي ترقية، يُنصح بشدة بأخذ نسخة احتياطية قبل القيام بأي شيء.
التحديث
دليل التثبيت الرسمي (حاوية واحدة)
عند إعادة البناء التالية، سترى هذه الرسالة في النهاية:
-------------------------------------------------------------------------------------
اكتمال ترقية POSTGRES
تم تخزين قاعدة بيانات 13 القديمة في /shared/postgres_data_old
لإكمال الترقية، أعد البناء مرة أخرى باستخدام:
./launcher rebuild app
-------------------------------------------------------------------------------------
هذا يعني أن كل شيء سار على ما يرام في الترقية! تحتاج فقط إلى إصدار إعادة بناء جديدة لإعادة موقعك وتشغيله.
تثبيت حاوية البيانات
إذا كنت تقوم بإعداد حاوية بيانات مخصصة بناءً على العينة المتوفرة في مستودع discourse_docker الخاص بنا، فأنت تريد التأكد من أنك تقوم بإيقاف PostgreSQL بطريقة آمنة ونظيفة.
في الوقت الحاضر، لدينا مهام خلفية تقوم بتشغيل استعلامات تمتد لعدة دقائق، لذا فإن إيقاف حاوية الويب سيساعد في إيقاف حاوية البيانات بأمان.
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
قبل إصدار إعادة البناء الأولى لحاوية البيانات، يمكنك تتبع سجل PostgreSQL لمعرفة ما إذا كان قد تم إيقافه بشكل صحيح.
سيمنحك تشغيل tail -f shared/standalone/log/var-log/postgres/current السجل التالي إذا كان نظيفًا:
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
القيام بتحديث يدوي / بيئات محدودة المساحة
يجب عليك عمل نسخة احتياطية من POSTGRES_DATA قبل محاولة هذا
إذا كنت في بيئة محدودة المساحة بدون أي طريقة للحصول على مساحة إضافية، يمكنك تجربة ما يلي:
./launcher stop app #(أو كل من web_only و data إذا كان هذا هو حالتك)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
--entrypoint=/bin/bash \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade"
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
docker run --rm -v /var/discourse/shared/standalone:/shared local_discourse/app \
chown -R postgres:postgres /shared/postgres_data #(أو local_discourse/data)
./launcher rebuild app #(أو بيانات أولاً ثم web_only إذا كان هذا هو حالتك)
في اختباراتي، تتطلب هذه الإجراءات أقل من 1x حجم قاعدة البيانات الحالي لديك كمساحة مجانية.
إذا كنت تستخدم إعدادًا محليًا غير افتراضي، يمكنك محاولة استبدال أمر docker الأول بهذا:
# قم بتغيير 'en_US.UTF-8' إلى الإعداد المحلي الخاص بك
docker run --rm \
--entrypoint=/bin/bash \
-e LANG='en_US.UTF-8' \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade'
تأجيل التحديث
إذا كنت بحاجة إلى تأجيل التحديث أثناء إعادة البناء التالية، يمكنك تبديل قالب PostgreSQL في ملف app.yml الخاص بك عن طريق تغيير "templates/postgres.template.yml" إلى "templates/postgres.13.template.yml".
لا يُنصح بذلك، حيث سينسى بعض مسؤولي المواقع التراجع عن التغيير لاحقًا.
مهام اختيارية بعد التحديث
تحسين إحصائيات PostgreSQL
بعد التحديث، لن يكون لدى PostgreSQL الجديد إحصائيات الجداول في متناول اليد. يمكنك إنشاؤها باستخدام:
docker exec -u postgres app \
/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages
تنظيف البيانات القديمة
للتثبيت القياسي، يمكنك حذف البيانات القديمة بتنسيق PG13 باستخدام الأمر التالي:
cd /var/discourse
./launcher cleanup
إذا كان لديك حاوية بيانات منفصلة، فستحتاج إلى إزالة النسخة الاحتياطية بهذه الطريقة:
rm -fr /var/discourse/shared/data/postgres_data_old/
الأسئلة الشائعة
لم يتم إيقاف الكتلة المصدر بشكل نظيف
إذا حصلت على فشل ترقية مع الرسالة المذكورة أعلاه، يمكنك تجربة نهج أبسط لإعادتها إلى حالة أفضل.
أعد تشغيل الحاوية القديمة باستخدام ./launcher start app. انتظر بضع دقائق حتى تعود للعمل.
الآن قم بإيقافها مرة أخرى باستخدام ./launcher stop app. بعد ذلك، قم بتتبع السجلات لمعرفة ما إذا كانت نظيفة:
tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
إذا لم تشير السجلات إلى إيقاف قاعدة البيانات، يمكنك بدء تشغيل الحاوية القديمة مرة أخرى، والدخول إليها باستخدام ./launcher enter app، وتشغيل هذه الأوامر وتتبع السجلات مرة أخرى عند الانتهاء.
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
إذا بدت السجلات كما هو موضح أعلاه، يمكنك الآن محاولة الترقية مرة أخرى باستخدام ./launcher rebuild app.
قيم lc_collate لقاعدة البيانات “postgres” غير متطابقة
يحدث هذا الخطأ إذا كنت تستخدم إعدادات محلية غير افتراضية لقاعدة البيانات الخاصة بك. تم الإبلاغ عن أنك بحاجة إلى 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
هذا يعني أن هناك لا تزال ملفات من الترقية الأخيرة عالقة. انقلها إلى مكان آخر قبل المتابعة.
نصوص اقتراح اكتمال الترقية - هل أحتاج إلى فعل أي شيء؟
بمجرد اكتمال الترقية، سترى مخرجات من رسالة pg_upgrade تقول:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
يمكنك تجاهل هذه الرسالة بأمان.
لقد قمت بتخطي تحديث PostgreSQL 13، ماذا أفعل الآن؟
يمكنك اتباع التعليمات القياسية في أعلى هذا الدليل وسيقومون بالترقية من إصدارك إلى 15 دون مشاكل.
إذا كنت تتبع التعليمات الخاصة بالمساحة المحدودة، فقم بتكييف أرقام الإصدارات وفقًا لذلك.
يمكن أن توفر لك إعادة بناء الفهارس مساحة قرص كبيرة. اتبع الخطوات من تحديث PostgreSQL 13 بعد الترقية.