# PG12에서 손상된 인덱스, 어떻게 수정하나요?

**URL:** https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570
**Category:** Self-hosting
**Created:** [5월 25, 2020, 2:45오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570 "2020-05-25T02:45:43Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 2:45오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/1 "2020-05-25T02:45:43Z")

</div>

다시 한번 이 주제를 꺼내서 죄송합니다. 아주 이상한 문제가 발생했습니다.

```plaintext
discourse=# REINDEX SCHEMA CONCURRENTLY public;
ERROR: could not create unique index "index_tags_on_name_ccnew"
DETAIL: Key (name)=(chronicillness) is duplicated.

```

@riking 님이 위에 제안한 해결책으로 수정할 수 있을 것 같지만, 제 상황에 맞게 구문을 어떻게 수정해야 할지 모르겠습니다. ☹

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 2:55오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/2 "2020-05-25T02:55:30Z")

</div>

참고:

[https://twitter.com/petervgeoghegan/status/1264325695997538304?s=20](https://twitter.com/petervgeoghegan/status/1264325695997538304?s=20)

[https://twitter.com/petervgeoghegan/status/1264404749899534338?s=20](https://twitter.com/petervgeoghegan/status/1264404749899534338?s=20)

이 오류를 확인한 경우 수행할 수 있는 작업은 두 가지입니다:

1. 문제를 우회할 수 있습니다 … 이 경우 `tags` 테이블에 `chronicillness`라는 이름의 중복 행이 있습니다.

2. 데이터베이스 백업이 있고 Peter와 공유하려는 세부 사항이 있다면 … Peter에게 개인적으로 또는 PG 메일링 리스트를 통해 공유하십시오.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 2:58오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/3 "2020-05-25T02:58:10Z")

</div>

제가 PostgreSQL 10의 discourse 생성 백업 파일을 가지고 있습니다. 이 파일이 도움이 될까요? 아카이브에서 PostgreSQL 부분만 추출해서 보내도 될까요?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 3:00오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/4 "2020-05-25T03:00:33Z")

</div>

> [@itsbhanusharma](#):
>
> 그래서 포스트그레스 10의 discourse 생성된 백업이 있습니다. 도움이 될까요?

확신은 없지만… Peter가 필요로 하는 것은 아마도 데이터베이스를 중지하고 데이터베이스가 포함된 폴더의 전체 내용을 복사하는 것일 것입니다.

가장 좋은 확인 방법은 그에게 이메일을 보내는 것입니다.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 3:02오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/5 "2020-05-25T03:02:29Z")

</div>

네, 이 문제를 해결하기 위해 그에게 이메일을 보내겠습니다 🙂

참고: 데이터 탐색기에서 SQL을 실행했을 때 다음과 같은 결과가 나왔습니다.

| id | name | topic\_count | created\_at | updated\_at | pm\_topic\_count | target\_tag |
| --- | --- | --- | --- | --- | --- | --- |
| 1710 | chronicillness | 2 | 2019-12-03T17:49:17.395Z | 2019-12-03T17:49:17.395Z | 0 | NULL |

다음처럼 하면

```plaintext
Tag.find_by(id: 1710).destroy

```

해결될까요?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 3:04오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/6 "2020-05-25T03:04:27Z")

</div>

아 … 인덱스는 LOWER(name)에 있네요.

쿼리는 이렇게 실행해 보세요:

```plaintext
select * from tags where name ilike 'chronicillness'

```

2개의 행이 반환되어야 합니다.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 3:06오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/7 "2020-05-25T03:06:02Z")

</div>

```plaintext
select * from tags where name ilike 'chronicillness'

```

| id | name | topic\_count | created\_at | updated\_at | pm\_topic\_count | target\_tag |
| --- | --- | --- | --- | --- | --- | --- |
| 329 | chronicillness | 12 | 2017-08-22T00:17:38.824Z | 2017-08-22T00:17:38.824Z | 0 | NULL |
| 1710 | chronicillness | 2 | 2019-12-03T17:49:17.395Z | 2019-12-03T17:49:17.395Z | 0 | NULL |

태그 이름 사이에 `-`가 있는 건가요?  
여기에는 chronicillness와 chronic-illness라는 두 가지 태그를 볼 수 있습니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 3:07오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/8 "2020-05-25T03:07:44Z")

</div>

그러면 그게 문제군요… 1710을 삭제해야 할 것 같습니다. 이후로 2개 주제가 해당 태그를 잃게 됩니다.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 3:10오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/9 "2020-05-25T03:10:57Z")

</div>

```plaintext
#<Tag:0x00005607bb92cf48
 id: 1710,
 name: "chronicillness",
 topic_count: 0,
 created_at: Tue, 03 Dec 2019 17:49:17 UTC +00:00,
 updated_at: Tue, 03 Dec 2019 17:49:17 UTC +00:00,
 pm_topic_count: 0,
 target_tag_id: nil>

```

왜 아무것도 연결되어 있지 않은 왜그(dwarf)인 것 같은 느낌이 드나요?

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 3:16오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/10 "2020-05-25T03:16:13Z")

</div>

태그를 삭제하니 더 많은 문제가 생겼습니다!

```plaintext
discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING: cannot reindex invalid index "public.tags_pkey_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_tags_on_name_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_tags_on_lower_name_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "pg_toast.pg_toast_309322_index_ccnew" concurrently, skipping
ERROR: could not create unique index "index_tags_on_name_ccnew1"
DETAIL: Key (name)=(time-management) is duplicated.

```

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 3:16오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/11 "2020-05-25T03:16:47Z")

</div>

같은 해결책이에요 🙂 과정을 반복해야 합니다.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 3:17오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/12 "2020-05-25T03:17:31Z")

</div>

제가 하던 일이 바로 그거였어요. 근데 그 경고들은 괜찮은 거예요? 신경 쓸 필요 없는 거 맞죠?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 3:18오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/13 "2020-05-25T03:18:28Z")

</div>

네, 모든 경고가 정확합니다. 인덱스가 손상되었으니 먼저 수정해야 합니다.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 3:31오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/14 "2020-05-25T03:31:27Z")

</div>

그래서 이제 모든 복제본이 사라졌고, 재인덱싱 중에는 다음 경고만 남아 있습니다:

```plaintext
discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING: cannot reindex invalid index "public.tags_pkey_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_tags_on_name_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_tags_on_lower_name_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.tags_pkey_ccnew1" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_tags_on_name_ccnew1" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_tags_on_lower_name_ccnew1" concurrently, skipping
WARNING: cannot reindex invalid index "pg_toast.pg_toast_309322_index_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "pg_toast.pg_toast_309322_index_ccnew1" concurrently, skipping
REINDEX

```

이 경고들을 없애기 위해 해야 할 일이 있는지, 아니면 그냥 이 상태로 살아야 하는지 궁금합니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 4:45오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/15 "2020-05-25T04:45:28Z")

</div>

> [@itsbhanusharma](#):
>
> `tags_pkey_ccnew`

이 부분은 저에게 혼란스럽습니다… ccnew로 끝나는 인덱스 이름이 하나도 없는데… 이걸 수동으로 생성하신 건가요?

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 4:56오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/16 "2020-05-25T04:56:23Z")

</div>

Postgres 10에서 12로 마이그레이션하는 동안 사용된다고 생각합니다. 인덱스에 문제가 발생한 거의 모든 사용자에게서 이 현상을 확인했기 때문입니다. 예를 들어:  
[https://meta.discourse.org/t/postgresql-12-update/151236/208?u=itsbhanusharma](https://meta.discourse.org/t/postgresql-12-update/151236/208?u=itsbhanusharma)

[https://meta.discourse.org/t/postgresql-12-update/151236/237?u=itsbhanusharma](https://meta.discourse.org/t/postgresql-12-update/151236/237?u=itsbhanusharma)

수정: Postgres 자체에서 비롯된 것입니다.

> **[REINDEX](https://www.postgresql.org/docs/12/sql-reindex.html)**
>
> REINDEX REINDEX — rebuild indexes Synopsis REINDEX \[( option \[, ...\] ) \] { INDEX | TABLE | SCHEMA …

> 이러한 경우 권장되는 복구 방법은 잘못된 인덱스를 삭제하고 `REINDEX CONCURRENTLY`를 다시 실행하는 것입니다. 처리 중에 생성된 동시 인덱스는 접미사 `ccnew`로 끝나며, 삭제에 실패한 오래된 인덱스 정의인 경우 `ccold`로 끝납니다. 잘못된 인덱스는 `DROP INDEX`를 사용하여 삭제할 수 있으며, 잘못된 토스트 인덱스도 포함됩니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 4:59오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/17 "2020-05-25T04:59:44Z")

</div>

아프다… 테이블에 적절한 인덱스도 이미 존재합니까?

데이터 탐색기([data explorer](https://meta.discourse.org/t/32566?silent=true))를 사용하면 테이블의 인덱스를 나열할 수 있다고 생각합니다.

[https://stackoverflow.com/questions/37329561/how-to-list-indexes-created-for-table-in-postgres/37330092](https://stackoverflow.com/questions/37329561/how-to-list-indexes-created-for-table-in-postgres/37330092)

올바른 인덱스가 이미 있다면, 문제의 인덱스들은 그냥 삭제하면 됩니다.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 5:00오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/18 "2020-05-25T05:00:37Z")

</div>

확인해 볼게요. 결과 알려드릴게요.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [5월 25, 2020, 5:12오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/19 "2020-05-25T05:12:35Z")

</div>

즉, 인덱스는 존재하는 것 같습니다.

 ![image](https://global.discourse-cdn.com/meta/original/3X/2/b/2b570788d1990d6956b1da90ea2197f1d3e2763e.png)

문제가 있는 인덱스에 `ccnew` 또는 `ccnew1`이 추가된 중복 인덱스도 존재합니다.

 ![image](https://global.discourse-cdn.com/meta/original/3X/f/e/fee6efce66360d12a530be03a268851d36e1e8df.png)

 ![image](https://global.discourse-cdn.com/meta/original/3X/d/d/dd5cfe6c056e27748701ea735ca24a66d61956cf.png)

이 인덱스가 유효한지 확인할 방법을 모르지만, 삭제하는 것이 옵션이라면 삭제 후 재인덱싱을 기꺼이 수행하겠습니다.

수정: [여기](https://www.postgresql.org/docs/12/sql-reindex.html)에서 제안된 대로 `DROP INDEX`가 작동할까요?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [5월 25, 2020, 5:21오전 UTC](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570/20 "2020-05-25T05:21:48Z")

</div>

네, 전부 삭제하세요… 어떻게 거기에 있는지 전혀 모르겠네요… `DROP INDEX`를 사용하시면 됩니다.

```plaintext
./launcher enter app
rails c
DB.exec('drop index tags_pkey_ccnew1')

```

[다음 페이지](https://meta.discourse.org/t/corrupt-indexes-in-pg12-how-do-i-fix/152570.md?page=2)
