
Di artikel ini, kita akan berbicara tentang cara menghilangkan kesalahan dengan tabel Objek Aktif ketika mengembalikan Jira dari cadangan dan menulis plugin untuk menghapus tabel Objek Aktif yang tidak perlu dari file arsip cadangan.
Apa itu tabel Objek Aktif?
Basis data Jira berisi dua jenis tabel: tabel sistem, seperti jiraissue, cwd_user, changegroup, dan tabel yang ditambahkan oleh plugin yang dipasang di Jira. Tabel ini adalah tabel Objek Aktif. Mereka dapat dengan mudah dibedakan dari tabel sistem dengan awalan AO_XXXXXX.
AO adalah singkatan dari Active Objects, dan XXXXXX adalah kode hash yang dihasilkan Jira untuk setiap plugin. Kode hash diperlukan untuk dapat membuat tabel dengan nama yang sama di plugin yang berbeda. Karena setelah menambahkan awalan AO_XXXXXX ke tabel dengan nama yang sama, nama tabel mulai berbeda, dan oleh karena itu mereka dapat dibuat dalam database.
Objek Aktif adalah lapisan ORM dalam produk Atlassian. Baca lebih lanjut di
sini .
Di Jira, Anda dapat melihat informasi tentang semua tabel yang dibuat oleh setiap plugin, jika Anda pergi ke Gear -> System -> Plugin Data Storage. Misalnya, pada contoh Jira saya, informasi plugin terlihat seperti ini:

Tangkapan layar menunjukkan bahwa plugin Pemberitahuan Atlassian telah membuat tiga tabel yang memiliki kode hash 21F425
Kesalahan AO
Sekarang mari kita lihat bagaimana kesalahan ini terlihat secara real time. Berikut adalah contoh kesalahan "bidang tidak didukung yang ditemui: biner":

Kami memperbaiki kesalahan "bidang tidak didukung yang ditemui: biner"
Mari kita coba untuk memperbaiki kesalahan ini. Untuk melakukan ini, bukalah file cadangan. Di dalamnya kita akan melihat dua file: entitas.xml dan activeobjects.xml.
File entitas.xml berisi data tabel sistem. File activeobjects.xml berisi data tabel Objek Aktif. Kami hanya perlu file activeobjects.xml.
Buka file activeobjects.xml file dan cari kata "biner" dalam file. Dalam kasus saya, 10 pertandingan ditemukan. Pertandingan ini terlihat seperti ini:
<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>
Hapus semua baris <binary xsi: nil = "true" /> dalam file activeobjects.xml dan cobalah untuk mengembalikan Jira lagi.
Kali ini kesalahan "bidang tidak didukung ditemukan: biner" diperbaiki, tetapi kami melihat kesalahan baru:

Mari kita lihat isi file 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
Jika Anda mencari informasi tentang kesalahan ini di Internet, kami akan menemukan
KB seperti itu.
Dalam KB ini, diusulkan untuk mengubah dimensi bidang No. 10 ke -1. Ayo kita coba.
<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>
Ubah:
<column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/>
pada
<column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="-1"/>
dan coba pulihkan Jira dari cadangan kami.
Dalam log kita melihat lagi kesalahan yang sama. KB tidak membantu.
Plugin uknown
Mari kita baca lagi kesalahannya. Kita akan melihat bahwa data dari plugin UKNOWN PLUGIN tidak dapat diimpor. Mengapa dari plugin yang tidak dikenal (UKNOWN PLUIGN)?
Jika Anda melihat tangkapan layar di bawah ini, Anda dapat melihat bahwa beberapa Objek Aktif tidak memiliki nama plugin yang terkait:

Anda dapat melihat bahwa plugin ada di dalam persegi panjang merah, tetapi plugin itu tidak ada di dalam persegi panjang biru. Ini bisa terjadi jika kita menginstal plugin, lalu uninstall dan restart Jira dengan menghapus folder .osgi_plugins. Jenis memulai ulang Jira disarankan jika ada masalah dengan plugin.
Tabel kami AIO_USER tidak memiliki nama plugin, jadi kami hanya dapat menghapus tabel.
Mari cari definisi tabel ini dalam file activeobjects.xml, hapus definisi yang ditemukan dan coba pulihkan Jira dari cadangan.
Kami akan melihat kesalahan lain:
[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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
Masalahnya adalah kita menghapus definisi tabel, tetapi tidak menghapus data dari tabel ini. Mari cari data dalam tabel ini di file activeobjects.xml dan hapus.
Data di tabel dimulai dengan tag ini:
<data tableName="AO_6B9F04_AIO_USER">
Dan akhiri dengan tag ini:
</data>
Mari kita hapus tag ini dan semua yang ada di antara tag ini, dan coba lagi untuk mengembalikan Jira dari cadangan.
Kami akan mendapatkan kesalahan lain:
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.
Ini berarti bahwa masih ada tabel di plugin yang mereferensikan tabel ini, jadi kita masih perlu menghapus semua tabel yang mereferensikan tabel jarak jauh. Kemudian semuanya bisa berjalan di sepanjang rantai: Anda mungkin perlu menghapus tabel plugin ini yang merujuk ke tabel yang dihapus.
Oleh karena itu, akan jauh lebih cepat untuk menghapus semua tabel dengan awalan AO_6B9F04 dari file cadangan secara terprogram.
Mari kita menulis sebuah plugin yang akan menghapus tabel dari file cadangan dengan awalan yang diberikan. Plugin akan terdiri dari webwork, yang akan menerima nama file cadangan (file cadangan harus dalam JIRA_HOME / impor) dan awalan.
Kode sumber plugin dapat diambil di
sini .
Buat plugin
Buka terminal dan jalankan perintah berikut:
atlas-create-jira-plugin
Anda perlu menjawab pertanyaan seperti ini:
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
Mengedit POM.XML
File pom.xml akan terlihat seperti ini:
bitbucket.org/alex1mmm/clean-backup/src/master/pom.xmlKami membuat WEBWORK, WEB SECTION, dan WEB ITEM
Buka terminal dan jalankan:
atlas-create-jira-plugin-module
Anda perlu menjawab pertanyaan seperti ini:
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
Mengedit WEBWORK dan SUCCESS.VM
Ubah success.vm kami sehingga webwork kami dapat mengambil dua parameter: nama cadangan dan awalan:
clean-backup / src / main / resources / templates / cleanbackup / cleanbackup / success.vm .
Kami akan menggunakan SAX untuk bekerja dengan file xml, jadi kami akan menulis filter untuk menghapus tabel:
clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / TableFilter.java .
Sekarang buat perubahan pada webwork.
clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / CleanBackup.javaBangun dan jalankan plugin kami
Kami pergi ke folder plugin dan menjalankan:
atlas-run
Setelah Jira mulai, letakkan file cadangan kami di JIRA_HOME / impor dan buka alamat berikut di browser:
localhost : 2990 / jira / secure / CleanBackup.jspa
Masukkan nama cadangan, awalan, dan klik tombol Bersihkan:

Tabel dengan awalan yang kami masukkan akan dihapus dari cadangan dan setelah itu Anda dapat memulihkan Jira.