SQL を使用して Jira サーバーからアプリケーション リンクを取り除く
目的
システム停止、データベースの破損、他の特定されていない原因などの発生後の特定の状況において、Jira のアプリケーション リンク (「アプリケーション リンクの設定」を参照) が破損する可能性があります。
このような場合、回避策として破損したアプリケーションをデータベースから直接取り除きます。このナレッジベース記事では、この方法について説明します。
診断
各アプリケーション リンクはアプリケーション キーで特定されます。次のクエリを実行して、どのキーがどのアプリケーションに所属するかを特定します。
SELECT SUBSTR(a.property_key,16,36) as "Application Key", b.propertyvalue as "Application Name" FROM propertyentry a join propertystring b on a.id=b.id where a.property_key like 'applinks.admin%name';
-- NOTE: For Microsoft SQLServer use the following query:
SELECT substring(a.property_key,16,36) as "Application Key", b.propertyvalue as "Application Name" FROM propertyentry a join propertystring b on a.id=b.id where a.property_key like 'applinks.admin%name';
このクエリの結果は次のようなものになります。
+--------------------------------------+--------------------+
| Application Key | Application Name |
+--------------------------------------+--------------------+
| 2c66970e-35f8-365f-bc65-f535d7edf1a1 | Confluence |
| f365831f-1827-3ecf-a992-1dff949398b1 | Fisheye |
+--------------------------------------+--------------------+
2 rows in set (0.00 sec)
ソリューション
データベースの変更を行う場合は 必ず事前にバックアップを取得してください。可能な場合はテスト サーバーで変更を試すことをおすすめします。
この例では、Confluence アプリケーションを取り除きます。アプリケーション キーは 2c66970e-35f8-365f-bc65-f535d7edf1a1 です。
これらのクエリの一部はアプリケーション リンクが設定された認証タイプに応じるため、結果を返さない可能性があります。
- Jira をシャットダウンします。
診断セクションの上述の SQL を使用して取り除く必要があるアプリケーションのアプリケーション キーを特定したら、次のクエリを次の順序で実行します。
DELETE FROM oauthspconsumer WHERE consumer_key IN (SELECT propertyvalue FROM propertystring WHERE id IN (SELECT id FROM propertyentry WHERE property_key LIKE 'applinks.%2c66970e-35f8-365f-bc65-f535d7edf1a1%')); -- NOTE: For Microsoft SQLServer use the following query: DELETE FROM oauthspconsumer WHERE consumer_key IN (SELECT CONVERT(NVARCHAR(MAX), propertyvalue) FROM propertystring WHERE id IN (SELECT id FROM propertyentry WHERE property_key LIKE 'applinks.%2c66970e-35f8-365f-bc65-f535d7edf1a1%'));
DELETE FROM oauthconsumertoken WHERE token_key LIKE '%2c66970e-35f8-365f-bc65-f535d7edf1a1%';
DELETE FROM trustedapp WHERE application_id IN (SELECT propertyvalue FROM propertystring WHERE id IN (SELECT id FROM propertyentry WHERE property_key LIKE 'applinks.%2c66970e-35f8-365f-bc65-f535d7edf1a1%')); -- NOTE: For Microsoft SQLServer use the following query: DELETE FROM trustedapp WHERE application_id IN (SELECT CONVERT(NVARCHAR(MAX), propertyvalue) FROM propertystring WHERE id IN (SELECT id FROM propertyentry WHERE property_key LIKE 'applinks.%2c66970e-35f8-365f-bc65-f535d7edf1a1%'));
DELETE FROM propertystring WHERE id IN (SELECT id FROM propertyentry WHERE property_key LIKE 'applinks.%2c66970e-35f8-365f-bc65-f535d7edf1a1%');
DELETE FROM propertyentry WHERE property_key LIKE 'applinks.admin.2c66970e-35f8-365f-bc65-f535d7edf1a1%';
Fisheye インスタンスの場合、次のクエリを実行してデータベースのプロパティとプロジェクト リンクを取り除きます。
DELETE FROM propertytext WHERE id in (SELECT id FROM propertyentry WHERE property_key LIKE '%ual.2c66970e-35f8-365f-bc65-f535d7edf1a1%'); DELETE FROM propertyentry WHERE property_key LIKE '%ual.2c66970e-35f8-365f-bc65-f535d7edf1a1%'; DELETE FROM propertyentry WHERE id in (SELECT id FROM propertystring WHERE propertyvalue LIKE '%2c66970e-35f8-365f-bc65-f535d7edf1a1%'); DELETE FROM propertystring WHERE propertyvalue LIKE '%2c66970e-35f8-365f-bc65-f535d7edf1a1%'; DELETE FROM propertyentry WHERE id in (SELECT id FROM propertytext WHERE propertyvalue LIKE '%2c66970e-35f8-365f-bc65-f535d7edf1a1%'); DELETE FROM propertytext WHERE propertyvalue LIKE '%2c66970e-35f8-365f-bc65-f535d7edf1a1%';
次の SQL を使い、アプリケーションの一覧からアプリケーション キーを取り除きます。
UPDATE propertystring SET propertyvalue = REPLACE(propertyvalue,'\n2c66970e-35f8-365f-bc65-f535d7edf1a1','') where id in (select id from propertyentry where property_key like 'applinks.global%'); -- NOTE: For Microsoft SQLServer use the following query: UPDATE propertystring SET propertyvalue = CAST(REPLACE(CAST(propertyvalue as NVarchar(MAX)), CHAR(10)+'2c66970e-35f8-365f-bc65-f535d7edf1a1','') AS NText) where id in (select id from propertyentry where property_key like 'applinks.global%'); -- NOTE: For Oracle use the following query: UPDATE propertystring SET propertyvalue = REPLACE(propertyvalue, chr(10) || '2c66970e-35f8-365f-bc65-f535d7edf1a1','') where id in (select id from propertyentry where property_key like 'applinks.global%');
注意 1: 上述の 1 つめのクエリでは、アプリケーション キーの前に改行 (\n) があります。これは、アプリケーション リンクの一覧での空白行を防ぐために必要です。詳細については、Microsoft の「Specify Field and Row Terminators (SQL Server)」ドキュメントをご確認ください。
注意 2: Oracle データベースを使用する場合、すべての変更をデータベースにコミットするために "commit" を実行するようにします。Oracle により、実行されたが Jira に変更が反映されないコマンドが表示されます。
注意 3: 2 つめのクエリ (Microsoft SQL Server 用) では、アプリケーション キーの手前でパラメーター CHAR(10)+ を使用しています。これは、アプリケーション キーの分割に改行ではなくシンプルな空白が使われているが、これが REPLACE 機能では許可されず、このため、シンプルな空白をその文字コードで置き換える必要があるためです。Jira を起動します。
アプリケーション リンクの一覧に空白行があった場合、次の atlassian-jira.log
の例のようにエラーが発生する可能性があります。
2012-05-18 11:23:17,150 Spring executor 8 ERROR [plugin.osgi.factory.OsgiPlugin] Unable to start the Spring context for plugin com.atlassian.jira.plugin.ext.bamboo
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gadgetListener' defined in URL [bundle://60.0:0/META-INF/spring/atlassian-plugins-components.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: id must be a valid java.util.UUID string:
...
org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: id must be a valid java.util.UUID string:
...
Caused by: java.lang.IllegalArgumentException: Invalid UUID string:
at java.util.UUID.fromString(Unknown Source)
at com.atlassian.applinks.api.ApplicationId.<init>(ApplicationId.java:34)
このようなエラーが発生した場合、次のクエリの結果を参考に、空白行がないことを確認します。
select * from propertystring where id in (select id from propertyentry where property_key like 'applinks.global%');
ご利用の DBMS に応じて上述の SQL を変更する必要がある可能性があります。詳細については社内の DBA にご相談ください。
代替ソリューション
ソリューションが役に立たない場合、「Fisheye のアプリケーション リンクを取り除けない」記事をご確認ください。
これは Fisheye/Crucible アプリケーションにのみ適用されます。