外部ディレクトリとの同期が、エラー "query did not return unique result" で失敗する

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

プラットフォームについて: Server と Data Center のみ - この記事は、サーバーおよびデータセンター プラットフォームのアトラシアン製品にのみ適用されます。

問題

外部ディレクトリとの手動同期を行ったときに、同期に失敗し、少数のユーザー/グループのみが Confluence に同期される。 

UI と atlassian-confluence.log: に次のエラーが表示されます。

org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result: 2

上述のログでは次のスタック トレースを確認できます。

com.atlassian.confluence.user.persistence.dao.hibernate.HibernateConfluenceUserDao.findByUsername

例:

2015-06-23 12:56:20,326 ERROR [scheduler_Worker-5] [atlassian.crowd.directory.DbCachingDirectoryPoller] pollChanges Error occurred while refreshing the cache for directory [ 7864321 ].
org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result: 2
    at org.springframework.orm.hibernate.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:590)
    at org.springframework.orm.hibernate.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:353)
    at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:375)
    at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:337)
    at com.atlassian.confluence.user.persistence.dao.hibernate.HibernateConfluenceUserDao.findByUsername(HibernateConfluenceUserDao.java:82)

HibernateConfluenceUserDao.findByUsername の文字列が見つからない場合、「Confluence でユーザーに関連する問題が発生し、"query did not return a unique result" エラー メッセージが表示される」をご確認ください。

診断

影響を受けているかどうかを確認するために、1 つめの診断を実行します。1 つめの診断が結果を返さなかった場合にのみ、2 つめの診断を実行します。

診断 1 - user_mapping テーブルの重複した非 null レコード

次のクエリを実行して、user_mapping テーブルの重複ユーザーを確認します。

SELECT lower_username FROM user_mapping WHERE lower_username IS NOT NULL GROUP BY lower_username HAVING (COUNT(lower_username) > 1);

これらのクエリが何らかの結果を返す場合、ソリューション 1 に進みます。

これらのクエリが結果を返さない場合、診断 2 に進みます。

診断 2 - user_mapping テーブルの null レコード

次のクエリを実行して、user_mapping テーブルの NULL レコードを探します。

SELECT  * FROM user_mapping where lower_username is null;

これらのクエリが何らかの結果を返す場合、ソリューション 2 に進みます。

原因

このエラーは、データベースの重複した値か、ディレクトリのキャッシュの破損によって発生します。

ソリューション 

ソリューション 1 user_mapping テーブルの重複レコード

ステップ 1: 重複したユーザーの user_key を取得

1 つめのクエリの lower_username と次のクエリを使用して user_key を見つけることができます。

SELECT * FROM user_mapping WHERE lower_username = '<Result of Query From Diagnosis #2 above>';

結果は次のようになります。

user_key
username
lower_username
402881a340e4a73a0140e4a7e42c0009
user1
user1
402881a340e4a73a0140e4a7e42c0008
user1
user1


ステップ 2: user_key に関連付けられているコンテンツがないことを確認

取得した user_key のうち、作成済みのコンテンツを持たない user_key を特定し、削除すべき重複ユーザーを特定します。返される count は 0 になります。

SELECT COUNT(*) FROM CONTENT WHERE CREATOR = '<user_key>' AND CONTENTTYPE != 'USERINFO';

ステップ 3: ユーザーを削除

データベースの変更を行う場合は必ず事前にバックアップを取得してください。可能な場合は、まずステージング サーバーで SQL コマンドの変更、挿入、更新、または削除を行うようにします。

上述のクエリでカウントが 0 だったユーザーを削除します。重複エントリのみを削除し、0 以外の結果を持つアカウントは残すようにします。

DELETE FROM CONTENT WHERE CONTENTTYPE = 'USERINFO' and USERNAME = '<duplicated_user_key>';
DELETE FROM user_mapping WHERE user_key= '<duplicated_user_key>';

ソリューション 2 - user_mapping テーブルの NULL レコード

次のバグの影響を受けています。 CONFSERVER-36018 - Getting issue details... STATUS . チケットに記載された回避策に従います。

説明

外部ディレクトリとの手動同期を行ったときに、同期に失敗し、少数のユーザー/グループのみが Confluence に同期される。 

製品Confluence
プラットフォームサーバー
最終更新日: 2018 年 12 月 10 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.