
في هذه المقالة ، سنتحدث عن كيفية التخلص من الأخطاء في جداول Active Objects عند استعادة Jira من نسخة احتياطية وكتابة مكون إضافي لإزالة جداول Active Objects غير الضرورية من ملف أرشيف احتياطي.
ما هي جداول الكائنات النشطة؟
تحتوي قاعدة بيانات Jira على نوعين من الجداول: جداول النظام ، مثل jiraissue و cwd_user و changegroup والجداول المضافة بواسطة المكونات الإضافية المثبتة في Jira. هذه الجداول هي جداول كائنات نشطة. يمكن تمييزها بسهولة عن جداول النظام بالبادئة AO_XXXXXX.
يشير AO إلى Active Objects ، و XXXXXX هو رمز التجزئة الذي تنشئه Jira لكل مكون إضافي. هناك حاجة إلى رمز التجزئة حتى تتمكن من إنشاء جداول بنفس الاسم في مكونات إضافية مختلفة. نظرًا لأنه بعد إضافة بادئة AO_XXXXXX إلى الجداول التي تحمل الاسم نفسه ، تبدأ أسماء الجداول في الاختلاف ، وبالتالي يمكن إنشاؤها في قاعدة البيانات.
الكائنات النشطة هي طبقة ORM في منتجات Atlassian. اقرأ المزيد عنها
هنا .
في Jira ، يمكنك الاطلاع على معلومات حول جميع الجداول التي تم إنشاؤها بواسطة كل مكون إضافي ، إذا انتقلت إلى Gear -> System -> Plugin Data Storage. على سبيل المثال ، في مثيل Jira ، تبدو معلومات المكون الإضافي كما يلي:

تُظهر لقطة الشاشة أن المكوّن الإضافي لإعلامات Atlassian قد أنشأ ثلاثة جداول تحتوي على رمز التجزئة 21F425
أخطاء AO
الآن دعونا نرى كيف تبدو هذه الأخطاء في الوقت الحقيقي. في ما يلي مثال على خطأ "حقل غير معتمد تمت مصادفته: ثنائي":

نقوم بإصلاح الخطأ "تمت مصادفة حقل غير معتمد: ثنائي"
دعونا نحاول إصلاح هذا الخطأ. للقيام بذلك ، قم بفك ضغط ملف النسخ الاحتياطي. في الداخل سوف نرى ملفين :كييفات. xml و activeobjects.xml.
يحتوي ملفكييفات. xml على بيانات جدول النظام. يحتوي ملف activeobjects.xml على بيانات جدول الكائنات النشطة. نحتاج فقط إلى ملف activeobjects.xml.
افتح ملف activeobjects.xml وابحث عن كلمة "ثنائي" في الملف. في حالتي ، تم العثور على 10 مباريات. تبدو هذه التطابقات كما يلي:
<row> <string>Alexey Matveev</string> <string>alexey.matveev@aaa.com</string> <integer>1</integer> <timestamp xsi:nil="true"/> <string xsi:nil="true"/> <integer xsi:nil="true"/> <binary xsi:nil="true"/> <string xsi:nil="true"/> <string xsi:nil="true"/> <integer xsi:nil="true"/> <string>Europe/Moscow</string> <string>alexey</string> <string>alexey</string> </row>
احذف جميع الأسطر <binary xsi: nil = "true" /> في ملف activeobjects.xml وحاول استعادة Jira مرة أخرى.
هذه المرة تم إصلاح الخطأ "تمت مصادفة حقل غير معتمد: ثنائي" ، ولكننا نرى خطأ جديدًا:

دعونا نرى محتويات ملف atlassian-jira.log:
[INFO] [talledLocalContainer] com.atlassian.activeobjects.spi.ActiveObjectsImportExportException: There was an error during import/export with <unknown plugin> (table AO_6B9F04_AIO_USER):Could not import data in table 'AO_6B9F04_AIO_USER' column
إذا كنت تبحث عن معلومات حول هذا الخطأ على الإنترنت ، فسوف نجد مثل هذا
KB .
في قاعدة المعارف هذه ، يُقترح تغيير بُعد الحقل رقم 10 إلى -1. لنجربها.
<table name="AO_6B9F04_AIO_USER"> <column name="DISPLAY_NAME" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="EMAIL_ADDRESS" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="ID" primaryKey="true" autoIncrement="true" sqlType="4" precision="10"/> <column name="LAST_LOGIN_DATE" primaryKey="false" autoIncrement="false" sqlType="93" precision="23" scale="3"/> <column name="LOCALE" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="LOGIN_DAYS_COUNT" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/> <column name="O_AUTH_TOKEN" primaryKey="false" autoIncrement="false" sqlType="-4" precision="2147483647"/> <column name="O_AUTH_TOKEN_SECRET" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="TABLEAU_KEY" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/> <column name="TIME_ZONE" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="USERKEY" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="USERNAME" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <foreignKey fromTable="AO_6B9F04_AIO_USER" fromColumn="TENANT_ID" toTable="AO_6B9F04_AIO_TENANT" toColumn="ID"/> </table>
التغيير:
<column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/>
على
<column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="-1"/>
ومحاولة استعادة Jira من نسخة احتياطية لدينا.
في السجل نرى مرة أخرى نفس الأخطاء. لم تساعد KB.
المساعد uknown
دعونا نقرأ الخطأ بعناية مرة أخرى. سنرى أنه لا يمكن استيراد البيانات من المكون الإضافي UKNOWN PLUGIN. لماذا من مكون إضافي غير معروف (UKUOWN PLUIGN)؟
إذا نظرت إلى لقطة الشاشة أدناه ، يمكنك أن ترى أن بعض الكائنات النشطة ليس لها أسماء المكونات الإضافية التي تتعلق بها:

يمكنك أن ترى أن المكوّن الإضافي موجود في المستطيل الأحمر ، ولكن المكوّن الإضافي ليس في المستطيل الأزرق. يمكن أن يحدث هذا إذا قمنا بتثبيت المكون الإضافي ، ثم إلغاء تثبيته وإعادة تشغيل Jira مع حذف المجلد. osgi_plugins. يوصى بهذا النوع من إعادة تشغيل Jira إذا كانت هناك أي مشاكل في المكونات الإضافية.
لا يحتوي جدولنا AIO_USER على اسم مكون إضافي ، لذلك يمكننا فقط حذف الجدول.
دعونا نجد تعريف هذا الجدول في ملف activeobjects.xml ، وحذف التعريف الموجود وحاول استعادة Jira من النسخة الاحتياطية.
سنرى خطأ آخر:
[INFO] [talledLocalContainer] com.atlassian.activeobjects.spi.ActiveObjectsImportExportException: There was an error during import/export with <unknown plugin> (table AO_6B9F04_AIO_USER):Could not create prepared statement for SQL query, [INSERT INTO PUBLIC."AO_6B9F04_AIO_USER" ("DISPLAY_NAME", "EMAIL_ADDRESS", "ID", "LAST_LOGIN_DATE", "LOCALE", "LOGIN_DAYS_COUNT", "O_AUTH_TOKEN", "O_AUTH_TOKEN_SECRET", "TABLEAU_KEY", "TENANT_ID", "TIME_ZONE", "USERKEY", "USERNAME") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
المشكلة هي أننا حذفنا تعريف الجدول ، لكننا لم نحذف البيانات من هذا الجدول. دعونا نجد البيانات في هذا الجدول في ملف activeobjects.xml ونحذفها.
تبدأ البيانات على الجدول بهذه العلامة:
<data tableName="AO_6B9F04_AIO_USER">
وتنتهي هذه العلامة:
</data>
لنحذف هذه العلامات وكل شيء بين هذه العلامات ونحاول مرة أخرى استعادة Jira من النسخة الاحتياطية.
سنحصل على خطأ آخر:
There was a problem restoring ActiveObjects data for the <unknown plugin> plugin. Caught exception with following message: Table "AO_6B9F04_AIO_USER" not found; SQL statement: ALTER TABLE PUBLIC.AO_6B9F04_AIO_REPORT ADD CONSTRAINT fk_ao_6b9f04_aio_report_owner_id FOREIGN KEY (OWNER_ID) REFERENCES PUBLIC.AO_6B9F04_AIO_USER(ID) [42102-185]. Please check the log for details.
هذا يعني أنه لا تزال هناك جداول في المكون الإضافي تشير إلى هذا الجدول ، لذلك ما زلنا بحاجة إلى حذف جميع الجداول التي تشير إلى الجدول البعيد. ثم يمكن أن يسير كل شيء على طول السلسلة: قد تحتاج إلى حذف جداول هذا المكون الإضافي التي تشير إلى الجداول المحذوفة.
لذلك ، سيكون من الأسرع بكثير حذف كافة الجداول ببادئة AO_6B9F04 من ملف النسخ الاحتياطي برمجياً.
دعنا نكتب مكونًا إضافيًا يحذف الجداول من ملف النسخ الاحتياطي بالبادئة المحددة. سيتكون المكون الإضافي من عمل الويب ، والذي سيتلقى اسم ملف النسخ الاحتياطي (يجب أن يكون ملف النسخ الاحتياطي في JIRA_HOME / import) والبادئة.
يمكن الحصول على رمز المصدر للمكوِّن الإضافي
هنا .
أنشئ مكونًا إضافيًا
افتح الوحدة الطرفية وقم بتنفيذ الأمر التالي:
atlas-create-jira-plugin
تحتاج إلى إجابة أسئلة مثل هذا:
Define value for groupId: : ru.matveev.alexey.plugins.jira.cleanbackup Define value for artifactId: : clean-backup Define value for version: 1.0.0-SNAPSHOT: : Define value for package: ru.matveev.alexey.plugins.jira.cleanbackup: : Confirm properties configuration: groupId: ru.matveev.alexey.plugins.jira.cleanbackup artifactId: clean-backup version: 1.0.0-SNAPSHOT package: ru.matveev.alexey.plugins.jira.cleanbackup Y: : Y
تحرير POM.XML
يجب أن يبدو ملف pom.xml كما يلي:
bitbucket.org/alex1mmm/clean-backup/src/master/pom.xmlنقوم بإنشاء WEBWORK ، WEB SECTION و WEB ITEM
افتح الوحدة وقم بتنفيذ:
atlas-create-jira-plugin-module
تحتاج إلى إجابة أسئلة مثل هذا:
Choose a number (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34): 31 Enter Plugin Module Name My Webwork Module: : cleanbackup Show Advanced Setup? (Y/y/N/n) N: : y Module Key cleanbackup: : Module Description The cleanbackup Plugin: : i18n Name Key cleanbackup.name: : i18n Description Key cleanbackup.description: : Enter Action Classname MyActionClass: : CleanBackup Enter Package Name ru.matveev.alexey.plugins.jira.cleanbackup.jira.webwork: : Enter Alias CleanBackup: : CleanBackup Enter View Name success: : success Enter Template Path /templates/cleanbackup/cleanbackup/success.vm: : Add Another View? (Y/y/N/n) N: : N Add Another Action? (Y/y/N/n) N: : N Add Another Plugin Module? (Y/y/N/n) N: : Y Choose a number (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34): 30 Enter Plugin Module Name My Web Section: : CleanBackup Enter Location (eg system.admin/mynewsection): admin_plugins_menu Show Advanced Setup? (Y/y/N/n) N: : n Add Another Plugin Module? (Y/y/N/n) N: : Y Choose a number (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34): 25 Enter Plugin Module Name My Web Item: : CleanAO Enter Section (eg system.admin/globalsettings): admin_plugins_menu/clean-backup Enter Link URL (eg /secure/CreateIssue!default.jspa): /secure/CleanBackup.jspa? Show Advanced Setup? (Y/y/N/n) N: : Y Module Key clean-ao: : Module Description The CleanAO Plugin: : i18n Name Key clean-ao.name: : i18n Description Key clean-ao.description: : Weight 1000: : Link Id clean-ao-link: : Enter Label Key clean-ao.label: : CleanBackup Enter Label Value CleanAO: : CleanAO Add Label Param? (Y/y/N/n) N: : n Add Icon? (Y/y/N/n) N: : n Add Tooltip? (Y/y/N/n) N: : n Add Resource (Y/y/N/n) N: : n Add Velocity Context Provider (Y/y/N/n) N: : n Add Plugin Module Param? (Y/y/N/n) N: : n Add Conditions? (Y/y/N/n) N: : n Add Another Plugin Module? (Y/y/N/n) N: : n
تحرير WEBWORK و SUCCESS.VM
قم بتغيير our.vm الخاص بنا بحيث يمكن أن يأخذ عمل الويب الخاص بنا معلمتين: اسم النسخ الاحتياطي والبادئة:
clean-backup / src / main / resources / templates / cleanbackup / cleanbackup / Success.vm .
سنستخدم SAX للعمل مع ملفات xml ، لذا سنكتب مرشحًا لحذف الجداول:
clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / TableFilter.java .
الآن قم بإجراء تغييرات على webwork.
clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / CleanBackup.javaبناء وتشغيل البرنامج المساعد لدينا
نذهب إلى مجلد البرنامج المساعد وننفذ:
atlas-run
بعد بدء Jira ، ضع ملف النسخ الاحتياطي في JIRA_HOME / import وانتقل إلى العنوان التالي في المتصفح:
المضيف المحلي: 2990 / jira / secure / CleanBackup.jspa
أدخل اسم النسخة الاحتياطية والبادئة وانقر على زر التنظيف:

سيتم حذف الجداول بالبادئة التي أدخلناها من النسخة الاحتياطية وبعد ذلك يمكنك استعادة Jira.