قيمة المفتاح المكررة تنتهك قيدًا فريدًا على جدول أثناء الترقية

مرحباً بالجميع، لدي مشكلة غريبة تتعلق بإحدى المنتديات التي أديرها.

أثناء الترقية، في صفحة الإدارة/الترقية أو عبر الطرفية، فشلت العملية وظهرت لي هذه الرسالة:

--------------------------------------------------------------------------------
فشل ترحيل 1!

فشل ترحيل الافتراضي
#<ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_screened_ip_addresses_on_ip_address"
DETAIL:  Key (ip_address)=(10.0.0.0/8) already exists.

لحسن الحظ، لم يتعطل المنتدى، حيث استخدمت أمر ./launcher restart app (لقد أنقذني الأمر ./launcher destroy app / ./launcher start app مرة سابقة عندما واجهت صفحة بيضاء بعد إعادة التشغيل)، لذا لا يوجد طارئ على الإطلاق، ولهذا السبب أبحث عن إرشادات.

قررت فحص قاعدة البيانات، وهناك بعض الإشارات إلى عنوان IP 10.0.0.0/8 تبدو وكأنها سجلات، لكن في جدول screened_ip_addresses، لا أرى أي تكرار.

--
-- TOC entry 6829 (class 0 OID 382198)
-- Dependencies: 657
-- Data for Name: screened_ip_addresses; Type: TABLE DATA; Schema: public; Owner: -
--

COPY public.screened_ip_addresses (id, ip_address, action_type, match_count, last_match_at, created_at, updated_at) FROM stdin;
236	10.0.0.0/8	2	0	\N	2020-05-24 19:44:41.587257	2020-05-24 19:44:41.587257
237	192.168.0.0/16	2	0	\N	2020-05-24 19:44:47.150337	2020-05-24 19:44:47.150337
239	172.16.0.0/12	2	0	\N	2020-05-24 19:44:57.347656	2020-05-24 19:44:57.347656
240	fc00::/7	2	0	\N	2020-05-24 19:45:02.270948	2020-05-24 19:45:02.270948
261	154.71.107.147	1	0	\N	2020-06-05 13:15:17.718236	2020-06-07 00:27:57.204765
257	154.126.107.81	1	0	\N	2020-06-02 09:51:31.191431	2020-06-07 00:27:58.538628
259	197.1.186.242	1	0	\N	2020-06-05 08:39:52.218198	2020-06-07 00:27:58.985867
258	89.158.72.7	1	0	\N	2020-06-02 20:44:41.584317	2020-06-07 00:27:59.542337
260	196.179.229.13	1	0	\N	2020-06-05 08:39:52.227515	2020-06-07 00:28:00.288445
238	127.0.0.0/8	2	0	\N	2020-05-24 19:44:52.369958	2020-05-24 19:44:52.369958

أخبرني مدير المنتدى أنه قام بتنظيف بعض عناوين IP في صفحة /admin/logs/screened_ip_addresses وأضاف أخرى. لكنني أشك في أنه لمس هذا العنوان بالتحديد. الشيء الغريب هو أن النظام يشير إلى أن العنوان تمت إضافته قبل 14 يوماً (كان ذلك آخر مرة قمت فيها بالترقية، وكان على الأرجح ترقية PostgreSQL) رغم أن المنتدى يعود لعام 2015. وفي المنتديات الأخرى، يتم التحقق من تاريخ الإنشاء.

لذا أعتقد أن الجدول يعاني من بعض الاضطراب، لكنه لا يبدو كذلك حقاً.

لا أريد المخاطرة كثيراً، خاصة أنني ضعيف في SQL. لذا أبحث عن إرشادات حول الإجراء الذي يجب اتباعه للتأكد من إمكانية الترقية بأمان :raised_hands:

هل يجب أن أنظف صفحة /admin/logs/screened_ip_addresses، أو أحاول حذف الإدخالات لهذا الجدول أو لجدول آخر؟

يبدو أن الفهرس تالف. يمكنك البحث في مواضيع أخرى حول الفهارس التالفة.

أولاً، يمكنك محاولة إعادة بناء الفهرس. لاحظ أيضًا أن العديد من عمليات البحث لن تجد الإدخالات المكررة لأنها تفترض أن الفهرس يعمل بشكل صحيح.

شكرًا لك، للتأكد، هل سيكون الأمر على هذا النحو؟

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
REINDEX SCHEMA CONCURRENTLY public;

إذا لم يساعد ذلك لأن الفهرس يبدو سليمًا بالنسبة للنظام، فهل يبدو هذا الحل مجديًا بالنظر إلى حجم هذا الجدول؟

TRUNCATE public.screened_ip_addresses

هل أقوم بإعادة الفهرسة ثم أضف عناوين IP هذه يدويًا مرة أخرى؟

أنا على هاتفي لذا سيتعين عليك قراءة الوثائق، لكنني سأعيد بناء public.screened_ip_addresses فقط. أعتقد أنك ستحصل على أخطاء تتعلق بالتضارب عندما تفعل ذلك.

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

تعديل: حسنًا، لم يفلح إعادة الفهرسة في فعل أي شيء.

فشل 1 هجرة!

فشل في ترحيل الإعداد الافتراضي
#<ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_screened_ip_addresses_on_ip_address"
DETAIL:  Key (ip_address)=(10.0.0.0/8) already exists.
>

أعدت تشغيل التطبيق، ونظفت جميع عناوين IP في /admin/logs/screened_ip_addresses، وتمت الترقية بنجاح.

عادت عناوين IP دون الحاجة لإضافتها يدويًا.

ربما كنت حذرًا أكثر من اللازم قليلاً، ولكن بما أن المنتدى ليس لي، لم أرد أن أفسد الأمور. شكرًا لك @pfaffman على المساعدة!

أعتقد أنني سأنتظر المرة القادمة لأرى إذا ما حدث الأمر مجددًا، لكن على الأقل سأعرف كيفية إصلاحه.

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

يمكنني تأكيد إغلاق المشكلة :raised_hands: