이 페이지는 기계 번역되었습니다. 영어 원본을 읽어보세요. English

IBSurgeon 라이브러리

"인덱스를 커밋할 수 없음" 또는 부분적으로 복원된(일관성 없는) 데이터베이스에서 데이터를 추출하는 방법

Alexey Kovyazin, 최종 업데이트 2014년 3월 30일

손상 복구 후 복원 단계에서 “Cannot commit index” 오류가 자주 발생합니다. Firebird 2.0 이상에서는 이 오류가 경고로 표시되며 데이터베이스는 온라인 상태로 전환되지 않습니다. Firebird 1.0-1.5 및 InterBase에서는 복원 프로세스를 중단시키는 매우 불쾌한 오류로 발생합니다(200GB 데이터베이스 복원이 끝나갈 무렵 이 오류를 보는 것은 인상적입니다).

“Cannot commit index..” 오류의 원인은 명백합니다. 손상이 데이터베이스 참조 무결성에 영향을 미치고, 서버 관점에서 레코드가 마술처럼 사라지기 때문입니다.

예를 들어, “Customers” 테이블과 외래 키로 참조되는 관련 “Orders” 테이블이 있다고 가정해 보겠습니다. 손상이 없다면 외래 키를 위반하거나 특정 고객을 참조하는 모든 주문을 먼저 삭제하지 않고 Customers에서 레코드를 삭제하는 것은 불가능합니다. 손상은 데이터베이스 파일을 저수준에서 영향을 주어 레코드를 직접 삭제합니다. 서버가 외래 키 레코드에서 마스터 레코드로의 해결되지 않은 링크를 발견하는 것은 정말 놀라운 일입니다.

여기서 복원 프로세스에 대한 팁을 추가해야 합니다. 엔진은 비활성화된 인덱스로 모든 테이블을 복원하고(레코드로 테이블을 채우는 속도가 훨씬 빨라짐), 그 후에 인덱스를 하나씩 활성화(즉, 구축)하기 시작합니다. 즉, 복원 프로세스가 인덱스 생성 단계를 시작할 때 모든 데이터가 이미 데이터베이스에 있으며 “Cannot commit index..” 오류가 표시됩니다.

“Cannot commit index” 오류가 표시될 때 가장 먼저 원하는 것은 복원을 완료할 수 있도록 해당 외래 키 제약 조건을 삭제하는 것입니다. 문제는 불일치하지만 성공적으로 복원된 데이터베이스로 무엇을 할 것인가입니다. 삭제된 외래 키는 비즈니스 로직의 중요한 부분일 수 있습니다.

여기에는 두 가지 접근 방식이 있습니다: 누락된 데이터를 재생성하거나 불일치 데이터를 삭제하는 것입니다. 위의 Customers-Orders 예제에서 이것이 무엇을 의미하는지 살펴보겠습니다.

누락된 데이터 재생성

불일치 Orders에 대해 누락된 Customers를 재생성해야 한다고 결정했다고 가정해 보겠습니다. 이 경우 손실된 ID를 확인해야 합니다. 일반적으로 다음과 같은 SQL 쿼리를 사용합니다(적절하게 적용하기 쉬울 것이라고 생각합니다):

SELECT O.Customer_ID FROM ORDERS O WHERE NOT EXISTS ( SELECT C.Customer_ID FROM CUSTOMERS C WHERE O.Customer_ID=C.Customer_ID)

그런 다음 누락된 기본 키 목록으로 레코드를 수동으로 삽입하고 백업/복원을 다시 실행할 수 있습니다.

일관된 데이터 펌핑

불일치 레코드를 잃는 것이 허용 가능하다고 생각한다면, 다음 접근 방식을 사용하여 부분적으로 복원된 데이터베이스에서 빈 데이터베이스로 모든 데이터를 펌핑하고 불일치 레코드를 건너뛸 수 있습니다:

  1. 무료 도구 IBDataPump 다운로드 http://www.clevercomponents.com/demo/datapump/IBPump.zip

  2. 다음 명령을 사용하여 (IBFirstAID 후) 복구된 데이터베이스의 백업에서 메타데이터만 포함된 데이터베이스 생성

gbak -c -m -user SYSDBA -pass masterkey Disk:\Path\backup.fbk Disk:\Path\fresh.fdb

  1. IBDataPump를 실행하고 부분적으로 복구된 데이터베이스를 소스로, 새 빈 데이터베이스를 대상으로 설정

  2. 다음 탭을 클릭하고 적절한 버튼을 클릭한 다음 3번째 탭에서 “Pump"를 클릭합니다. 완료될 때까지 기다립니다(오래 걸릴 수 있으며, 대상 데이터베이스 크기의 증가 추이를 확인하여 대략적인 진행 상황을 파악할 수 있습니다).

  3. 결과적으로 일관된 외래 키 관계를 가진 fresh.fdb 데이터베이스를 얻게 됩니다 - 완전히 정상입니다.

데이터베이스에 외래 키 루프가 있는 경우 IBDataPump가 경고하고 해당 제약 조건 목록을 제공합니다. 펌핑이 가능하려면 그 중 하나 이상을 삭제해야 합니다.

물론 펌핑에 특별한 접근 방식이 필요한 경우도 있었습니다. 이러한 상황에 직면하면 고객 지원에 문의해 주시기 바랍니다.