다음을 통해 공유


Azure Cosmos DB의 '찾을 수 없음' 예외를 진단하고 문제를 해결합니다.

적용 대상: NoSQL

HTTP 상태 코드 404는 리소스가 더 이상 존재하지 않음을 나타냅니다.

예상되는 동작

애플리케이션에서 코드 404를 예상하고 시나리오를 올바르게 처리하는 다양한 시나리오를 사용할 수 있습니다.

존재하거나 존재해야 하는 항목에 대해 찾을 수 없음 예외가 반환되었습니다.

항목이 존재하거나 존재해야 하는 경우 상태 코드 404가 반환되는 이유는 다음과 같습니다.

입력 세션 토큰에 읽기 세션을 사용할 수 없습니다.

해결 방법

  1. 현재 SDK를 사용 가능한 최신 버전으로 업데이트합니다. 이 특정 오류의 가장 일반적인 원인은 최신 SDK 버전에서 수정되었습니다.

경합 상태

여러 SDK 클라이언트 인스턴스가 있으며 쓰기 전에 읽기가 발생했습니다.

해결 방법

  1. Azure Cosmos DB에 대한 기본 계정 일관성은 세션 일관성입니다. 항목이 만들어지거나 업데이트되면 응답에서 SDK 인스턴스 간에 전달될 수 있는 세션 토큰을 반환하여 읽기 요청이 해당 변경 내용이 있는 복제본을 읽도록 합니다.
  2. 일관성 수준더 높은 수준으로 변경합니다.

컨테이너 또는 데이터베이스 리소스에 대한 처리량 읽기

PowerShell 또는 Azure CLI를 사용하고 찾을 수 없음 오류 메시지를 받습니다.

해결 방법

처리량은 데이터베이스 수준, 컨테이너 수준 또는 둘 다에서 프로비저닝할 수 있습니다. 찾을 수 없음 오류가 발생하면 부모 데이터베이스 리소스 또는 하위 컨테이너 리소스의 처리량을 읽어보세요.

잘못된 파티션 키 및 ID 조합

파티션 키와 ID 조합이 유효하지 않습니다.

해결 방법

잘못된 조합을 발생시키는 애플리케이션 논리를 수정합니다.

항목 ID의 잘못된 문자

항목 ID에 잘못된 문자가 포함된 항목이 Azure Cosmos DB에 삽입됩니다.

해결 방법

ID를 특수 문자를 포함하지 않는 다른 값으로 변경합니다. ID 변경이 옵션이 아닌 경우 ID를 Base64로 인코딩하여 특수 문자를 이스케이프할 수 있습니다. Base64는 대체해야 하는 잘못된 문자 '/'를 사용하여 이름을 생성할 수 있습니다.

ID에 대해 컨테이너에 이미 삽입된 항목은 이름 기반 참조 대신 RID 값을 사용하여 바꿀 수 있습니다.

// Get a container reference that uses RID values.
ContainerProperties containerProperties = await this.Container.ReadContainerAsync();
string[] selfLinkSegments = containerProperties.SelfLink.Split('/');
string databaseRid = selfLinkSegments[1];
string containerRid = selfLinkSegments[3];
Container containerByRid = this.cosmosClient.GetContainer(databaseRid, containerRid);

// Invalid characters are listed here.
// /dotnet/api/microsoft.azure.documents.resource.id#remarks
FeedIterator<JObject> invalidItemsIterator = this.Container.GetItemQueryIterator<JObject>(
    @"select * from t where CONTAINS(t.id, ""/"") or CONTAINS(t.id, ""#"") or CONTAINS(t.id, ""?"") or CONTAINS(t.id, ""\\"") ");
while (invalidItemsIterator.HasMoreResults)
{
    foreach (JObject itemWithInvalidId in await invalidItemsIterator.ReadNextAsync())
    {
        // Choose a new ID that doesn't contain special characters.
        // If that isn't possible, then Base64 encode the ID to escape the special characters.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(itemWithInvalidId["id"].ToString());
        itemWithInvalidId["id"] = Convert.ToBase64String(plainTextBytes).Replace('/', '!');

        // Update the item with the new ID value by using the RID-based container reference.
        JObject item = await containerByRid.ReplaceItemAsync<JObject>(
            item: itemWithInvalidId,
            ID: itemWithInvalidId["_rid"].ToString(),
            partitionKey: new Cosmos.PartitionKey(itemWithInvalidId["status"].ToString()));

        // Validating the new ID can be read by using the original name-based container reference.
        await this.Container.ReadItemAsync<ToDoActivity>(
            item["id"].ToString(),
            new Cosmos.PartitionKey(item["status"].ToString())); ;
    }
}

TTL(Time to Live) 제거

항목에 TTL(Time to Live) 속성이 설정되었습니다. TTL 속성이 만료되어 항목이 제거되었습니다.

해결 방법

항목이 제거되지 않도록 TTL 속성을 변경합니다.

지연 인덱싱

지연 인덱싱이 catch되지 않았습니다.

해결 방법

인덱싱이 인덱싱 정책을 따라잡거나 변경할 때까지 기다리세요.

부모 리소스 삭제됨

항목이 존재하는 데이터베이스 또는 컨테이너가 삭제되었습니다.

해결 방법

  1. 부모 리소스를 백업에서 복원하거나 리소스를 다시 만듭니다.
  2. 삭제된 리소스를 대체할 새 리소스를 만듭니다.

7. 컨테이너/컬렉션 이름은 대/소문자를 구분합니다.

컨테이너/컬렉션 이름은 Azure Cosmos DB에서 대/소문자를 구분합니다.

해결 방법

Azure Cosmos DB에 연결하는 동안 정확한 이름을 사용해야 합니다.