그amcheck모듈은 관계 구조의 논리적 일관성을 확인할 수 있는 기능을 제공합니다.
B-Tree 검사 기능은 다양한 검증불변특정 관계 표현의 구조에서. 인덱스 스캔 및 기타 중요한 작업 뒤에 있는 액세스 방법 기능의 정확성은 항상 유지되는 이러한 불변성에 달려 있습니다. 예를 들어, 특정 기능은 무엇보다도 모든 B-Tree 페이지에 항목이 있는지 확인합니다.“논리적”순서(예: B-트리 토토 핫의 경우텍스트, 인덱스 튜플은 대조된 어휘 순서로 되어 있어야 합니다. 특정 불변성이 어떻게든 유지되지 않으면 영향을 받은 페이지의 이진 검색이 인덱스 스캔을 잘못 안내하여 SQL 쿼리에 대한 잘못된 응답을 초래할 것으로 예상할 수 있습니다. 구조가 유효한 것으로 나타나면 오류가 발생하지 않습니다. 이러한 검사 기능이 실행되는 동안검색_경로임시로 변경됨pg_catalog, pg_temp.
검증은 사용자 정의 연산자 클래스 코드일 수 있는 인덱스 스캔 자체에서 사용되는 것과 동일한 절차를 사용하여 수행됩니다. 예를 들어, B-트리 인덱스 확인은 하나 이상의 B-트리 지원 기능 1 루틴을 사용한 비교에 의존합니다. 참조섹션 36.16.3연산자 클래스 지원 함수에 대한 자세한 내용은.
오류를 발생시켜 손상을 보고하는 B-Tree 검사 기능과 달리 힙 검사 기능verify_heapam테이블을 검사하고 행 집합을 반환하려고 시도합니다(감지된 손상당 한 행씩). 그럼에도 불구하고 해당 시설이 있는 경우verify_heapam의존하는 자체가 손상되면 함수가 계속 진행되지 않고 대신 오류가 발생할 수 있습니다.
실행 권한amcheck수퍼유저가 아닌 사용자에게 기능을 부여할 수 있지만 그러한 권한을 부여하기 전에 데이터 보안 및 개인정보 보호 문제를 신중하게 고려해야 합니다. 이러한 기능에 의해 생성된 손상 보고서는 손상된 데이터의 내용보다는 해당 데이터의 구조와 발견된 손상의 성격에 중점을 두지만, 이러한 기능을 실행할 수 있는 권한을 얻은 공격자는 특히 공격자가 손상을 유도할 수 있는 경우 이러한 메시지에서 데이터 자체의 일부를 추론할 수 있습니다.
bt_index_check(index regclass, heapallindexed boolean, checkunique boolean)은 void를 반환합니다. bt_index_check대상인 B-트리 인덱스가 다양한 불변성을 존중하는지 테스트합니다. 사용 예:
test=# SELECT bt_index_check(index = c.oid, heapallindexed = i.indisunique),
c.relname,
c.relpages
pg_index i에서
JOIN pg_opclass op ON i.indclass[0] = op.oid
JOIN pg_am am ON op.opcmethod = am.oid
JOIN pg_class c ON i.indexrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
am.amname = 'btree' AND n.nspname = 'pg_catalog'
-- 다른 세션에 있을 수 있는 임시 테이블을 확인하지 마세요.
AND c.relpersistence != 't'
-- 생략되면 함수에서 오류가 발생할 수 있습니다.
AND c.relkind = 'i' AND i.indisready AND i.indisvalid
c.relpages DESC LIMIT 10으로 주문;
bt_index_check | 이름 | 다시 페이지
-++----------+----------
| pg_dependent_reference_index | 43
| pg_dependent_dependent_index | 40
| pg_proc_proname_args_nsp_index | 31
| pg_description_o_c_o_index | 21
| pg_attribute_relid_attnam_index | 14
| pg_proc_oid_index | 10
| pg_attribute_relid_attnum_index | 9
| pg_amproc_fam_proc_index | 5
| pg_amop_opr_fam_index | 5
| pg_amop_fam_strat_index | 5
(10행)
이 예는 데이터베이스에서 가장 큰 10개의 카탈로그 색인을 확인하는 세션을 보여줍니다.“테스트”. 고유 인덱스인 하위 집합에 대해 인덱스 튜플인 힙 튜플이 있는지 확인이 요청됩니다. 오류가 발생하지 않으므로 테스트된 모든 인덱스는 논리적으로 일관성이 있는 것으로 보입니다. 당연히 이 쿼리는 호출로 쉽게 변경될 수 있습니다.bt_index_check검증이 지원되는 데이터베이스의 모든 인덱스에 대해.
bt_index_check획득액세스공유잠금대상 인덱스 및 그것이 속한 힙 관계에 대해. 이 잠금 모드는 단순 관계에서 획득한 것과 동일한 잠금 모드입니다.선택문장.bt_index_check자식/부모 관계에 걸쳐 있는 불변성을 확인하지 않지만 다음과 같은 경우 인덱스 내에서 모든 힙 튜플이 인덱스 튜플로 존재하는지 확인합니다.힙폴인덱싱됨이다참. 언제checkuniqueis참 bt_index_check고유 인덱스의 중복 항목 중 하나만 표시되는지 확인합니다. 실제 프로덕션 환경에서 손상에 대한 일상적인 경량 테스트가 필요한 경우 다음을 사용합니다.bt_index_check종종 검증의 철저함과 애플리케이션 성능 및 가용성에 대한 영향 제한 사이에서 최상의 절충안을 제공합니다.
bt_index_parent_check(index regclass, heapallindexed boolean, rootdescend boolean, checkunique boolean)은 void를 반환합니다. bt_index_parent_check대상인 B-트리 인덱스가 다양한 불변성을 존중하는지 테스트합니다. 선택적으로 다음과 같은 경우힙폴인덱싱됨인수는참, 이 함수는 인덱스 내에서 찾아야 하는 모든 힙 튜플이 있는지 확인합니다. 언제checkuniqueis참 bt_index_parent_check고유 인덱스의 중복 항목 중 하나만 표시되는지 확인합니다. 선택적일 때rootdescend인수는참, 확인에서는 각 튜플의 루트 페이지에서 새 검색을 수행하여 리프 수준에서 튜플을 다시 찾습니다. 수행할 수 있는 검사는bt_index_parent_check다음으로 수행할 수 있는 검사의 상위 집합입니다.bt_index_check. bt_index_parent_check보다 철저한 변형으로 생각할 수 있습니다.bt_index_check: 달리bt_index_check, bt_index_parent_check또한 색인 구조에 누락된 다운링크가 없는지 확인하는 것을 포함하여 상위/하위 관계에 걸쳐 있는 불변성을 확인합니다.bt_index_parent_check논리적 불일치나 기타 문제가 발견되면 오류를 발생시키는 일반적인 규칙을 따릅니다.
A 공유 잠금다음에 의해 대상 인덱스에 필요합니다.bt_index_parent_check(a공유 잠금또한 힙 관계에서 획득됩니다). 이러한 잠금은 동시 데이터 수정을 방지합니다.삽입, 업데이트및삭제명령. 잠금은 또한 기본 관계가 동시에 처리되는 것을 방지합니다.진공및 기타 모든 유틸리티 명령. 이 함수는 전체 트랜잭션이 아닌 실행 중에만 잠금을 유지합니다.
bt_index_parent_check의 추가 검증을 통해 다양한 병리학적 사례를 탐지할 가능성이 높아졌습니다. 이러한 경우에는 검사된 토토 핫에서 사용되는 잘못 구현된 B-트리 연산자 클래스가 포함될 수 있으며, 가정적으로는 기본 B-트리 토토 핫 액세스 방법 코드에서 발견되지 않은 버그가 포함될 수 있습니다. 참고하세요bt_index_parent_check상시 대기 모드가 활성화된 경우(즉, 읽기 전용 물리적 복제본에서) 사용할 수 없습니다.bt_index_check.
gin_index_check(index regclass)가 void를 반환함 gin_index_check대상 GIN 인덱스가 일관된 상위-하위 튜플 관계를 가지고 있는지(상위 튜플에는 튜플 조정이 필요하지 않음) 페이지 그래프가 균형 트리 불변성을 준수하는지 테스트합니다(내부 페이지는 리프 페이지만 참조하거나 내부 페이지만 참조함).
bt_index_check그리고bt_index_parent_check둘 모두에서 확인 프로세스에 대한 로그 메시지를 출력합니다.디버그1그리고디버그2심각도 수준. 이 메시지는 관심을 가질 수 있는 확인 프로세스에 대한 자세한 정보를 제공합니다.PostgreSQL개발자. 고급 사용자에게도 이 정보가 도움이 될 수 있습니다. 확인 과정에서 실제로 불일치가 감지될 경우 추가 컨텍스트를 제공하기 때문입니다. 실행 중:
SET client_min_messages = DEBUG1;
대화형에서psql세션은 확인 쿼리를 실행하기 전에 관리 가능한 세부 수준으로 확인 진행 상황에 대한 메시지를 표시합니다.
verify_heapam(relation regclass, on_error_stop boolean, check_toast boolean, 텍스트 건너뛰기, startblock bigint, endblock bigint, blkno OUT bigint, offnum OUT 정수, attnum OUT 정수, msg OUT 텍스트)는 레코드 집합을 반환합니다.관계의 페이지에 잘못된 형식의 데이터가 포함되어 있는 구조적 손상과 페이지가 구조적으로 유효하지만 데이터베이스 클러스터의 나머지 부분과 일치하지 않는 논리적 손상이 있는지 테이블, 시퀀스 또는 구체화된 뷰를 확인합니다.
다음 선택적 인수가 인식됩니다:
on_error_stop참이면 손상 검사는 손상이 발견된 첫 번째 블록 끝에서 중지됩니다.
기본값은 false입니다.
check_toast참이면 토스트된 값이 대상 관계의 TOAST 테이블에 대해 확인됩니다.
이 옵션은 느린 것으로 알려져 있습니다. 또한 토스트 테이블이나 해당 인덱스가 손상된 경우 토스트 값과 비교하여 확인하면 서버가 충돌할 수 있지만 대부분의 경우 오류가 발생합니다.
기본값은 false입니다.
건너뛰기그렇지 않다면없음, 손상 검사는 지정된 대로 모두 표시되거나 모두 고정된 것으로 표시된 블록을 건너뜁니다. 유효한 옵션은 다음과 같습니다.모두 표시, 모두 동결그리고없음.
기본값없음.
시작블록지정된 경우 손상 검사는 지정된 블록에서 시작되며 모든 이전 블록을 건너뜁니다. a를 지정하는 것은 오류입니다.시작 블록대상 테이블의 블록 범위를 벗어났습니다.
기본적으로 확인은 첫 번째 블록에서 시작됩니다.
엔드블록지정된 경우 손상 검사는 지정된 블록에서 끝나고 나머지 모든 블록을 건너뜁니다. 다음을 지정하는 것은 오류입니다.엔드블록대상 테이블의 블록 범위를 벗어났습니다.
기본적으로 모든 블록이 확인됩니다.
각 손상이 감지될 때마다,verify_heapam다음 열이 포함된 행을 반환합니다:
blkno손상된 페이지가 포함된 블록의 번호.
offnum손상된 튜플의 OffsetNumber.
attnum손상이 튜플 전체가 아닌 열에만 국한된 경우 튜플에 있는 손상된 열의 속성 번호.
msg발견된 문제를 설명하는 메시지입니다.
힙폴인덱싱확인#때힙폴인덱싱됨B-Tree 검증 기능에 대한 인수는 다음과 같습니다.참, 대상 인덱스 관계와 관련된 테이블에 대해 추가 확인 단계가 수행됩니다. 이는 다음으로 구성됩니다.“더미” 색인 생성작업은 임시 메모리 내 요약 구조에 대해 모든 가상의 새 인덱스 튜플이 있는지 확인합니다(기본적인 첫 번째 확인 단계에서 필요할 때 구축됨). 요약 구조“지문”대상 토토 핫 내에서 발견된 모든 튜플. 뒤에 숨어있는 높은 수준의 원칙힙폴인덱싱됨확인은 기존 대상 인덱스와 동일한 새 인덱스에는 기존 구조에서 찾을 수 있는 항목만 있어야 한다는 것입니다.
추가힙폴인덱싱단계에서는 상당한 오버헤드가 추가됩니다. 확인에는 일반적으로 몇 배 더 오랜 시간이 걸립니다. 그러나 다음과 같은 경우 획득한 관계 수준 잠금에는 변경 사항이 없습니다.힙폴인덱싱확인이 수행되었습니다.
요약 구조의 크기는 다음과 같이 제한됩니다.maintenance_work_mem. 인덱스에 표시되어야 하는 각 힙 튜플에 대한 불일치를 감지하지 못할 확률이 2%를 넘지 않도록 하려면 튜플당 약 2바이트의 메모리가 필요합니다. 튜플당 사용 가능한 메모리가 줄어들면서 불일치를 놓칠 확률이 서서히 증가합니다. 이 접근 방식은 검증 오버헤드를 크게 제한하는 동시에 문제 감지 가능성을 약간만 줄입니다. 특히 검증이 일상적인 유지 관리 작업으로 처리되는 설치의 경우 더욱 그렇습니다. 존재하지 않거나 형식이 잘못된 단일 튜플은 새로운 확인 시도를 할 때마다 감지될 수 있는 새로운 기회를 갖습니다.
amcheck효과적으로#amcheck다양한 유형의 실패 모드를 감지하는 데 효과적일 수 있습니다.데이터 체크섬잡지 못할 것입니다. 여기에는 다음이 포함됩니다.
잘못된 연산자 클래스 구현으로 인한 구조적 불일치.
여기에는 운영 체제 데이터 정렬의 비교 규칙 변경으로 인해 발생하는 문제가 포함됩니다. 다음과 같은 조합 가능한 유형의 데이텀 비교텍스트은 변경이 불가능해야 합니다(B-트리 인덱스 스캔에 사용되는 모든 비교가 변경 불가능해야 하는 것처럼). 이는 운영 체제 대조 규칙이 절대로 변경되어서는 안 된다는 것을 의미합니다. 드물기는 하지만 운영 체제 대조 규칙을 업데이트하면 이러한 문제가 발생할 수 있습니다. 보다 일반적으로 기본 서버와 대기 서버 간의 데이터 정렬 순서 불일치는 다음과 같은 이유로 인해 발생합니다.전공사용 중인 운영 체제 버전이 일치하지 않습니다. 이러한 불일치는 일반적으로 대기 서버에서만 발생하므로 일반적으로 대기 서버에서만 감지될 수 있습니다.
이와 같은 문제가 발생하면 영향을 받은 데이터 정렬을 사용하여 정렬된 각 개별 색인에 영향을 미치지 않을 수 있습니다. 그 이유는 다음과 같습니다.색인이 생성됨값은 동작 불일치에 관계없이 동일한 절대 순서를 가질 수 있습니다. 참조PostgreSQL : 문서 : 17 : 23.1. 사설 토토 사이트 지원그리고PostgreSQL : 문서 : 17 : 23.2. 메이저 토토 사이트 Support방법에 대한 자세한 내용은포스트그레SQL운영 체제 로케일 및 데이터 정렬을 사용합니다.
토토 핫와 인덱싱된 힙 관계 사이의 구조적 불일치(언제힙폴인덱싱검증이 수행됩니다.
정상 작동 중에는 힙 관계에 대한 토토 핫 교차 검사가 없습니다. 힙 손상 증상은 미묘할 수 있습니다.
기본에서 발견되지 않은 가상의 버그로 인한 손상포스트그레SQL액세스 방법 코드, 정렬 코드 또는 거래 관리 코드.
색인의 구조적 무결성에 대한 자동 검증은 신규 또는 제안된 일반 테스트에서 역할을 합니다.PostgreSQL논리적 불일치가 도입될 가능성이 있는 기능입니다. 테이블 구조와 관련 가시성, 거래 상태 정보 확인도 비슷한 역할을 합니다. 한 가지 확실한 테스트 전략은 전화를 거는 것입니다.amcheck표준 회귀 테스트를 실행할 때 계속 작동합니다. 참조PostgreSQL : 문서 : 17 : 31.1. 시험 범퍼카 토토테스트 실행에 대한 자세한 내용은.
데이터 체크섬이 비활성화되면 파일 시스템 또는 저장소 하위 시스템에 오류가 발생합니다.
참고하세요amcheck블록에 액세스할 때 공유 버퍼 적중만 있는 경우 확인 시 일부 공유 메모리 버퍼에 표시된 대로 페이지를 검사합니다. 결과적으로,amcheck검증 시 파일 시스템에서 읽은 데이터를 반드시 검사하지는 않습니다. 체크섬이 활성화되면,amcheck손상된 블록을 버퍼로 읽을 때 체크섬 오류로 인해 오류가 발생할 수 있습니다.
RAM 결함 또는 더 넓은 메모리 하위 시스템으로 인한 손상.
PostgreSQL수정 가능한 메모리 오류로부터 보호하지 않으며 업계 표준 ECC(오류 수정 코드) 또는 더 나은 보호 기능을 사용하는 RAM을 사용하여 작동한다고 가정합니다. 그러나 ECC 메모리는 일반적으로 단일 비트 오류에만 영향을 받지 않으며 다음을 제공한다고 가정해서는 안 됩니다.절대메모리 손상을 초래하는 오류로부터 보호합니다.
언제힙폴인덱싱검증이 수행되면 엄격한 이진 동일성이 테스트되고 힙 내의 색인화된 속성이 테스트되므로 일반적으로 단일 비트 오류를 감지할 가능성이 크게 높아집니다.
저장 하드웨어 결함으로 인해 구조적 손상이 발생하거나 관련 없는 소프트웨어가 관계 파일을 덮어쓰거나 수정하면 발생할 수 있습니다. 이러한 종류의 손상은 다음을 통해서도 감지할 수 있습니다.데이터 페이지 체크섬.
정확한 형식, 내부 일관성 및 자체 내부 체크섬과 관련된 올바른 관계 페이지에는 여전히 논리적 손상이 포함될 수 있습니다. 따라서 이러한 종류의 손상은 다음으로는 감지할 수 없습니다.체크섬. 예를 들어 토스트 테이블에 해당 항목이 없는 기본 테이블의 토스트 값과 데이터베이스 또는 클러스터에서 가장 오래된 유효한 트랜잭션 ID보다 오래된 트랜잭션 ID가 있는 기본 테이블의 튜플이 포함됩니다.
프로덕션 시스템에서 버그를 포함하여 논리적 손상의 여러 원인이 관찰되었습니다.PostgreSQL서버 소프트웨어, 결함이 있고 잘못된 백업 및 복원 도구, 사용자 오류.
부패한 관계는 라이브 프로덕션 환경, 즉 고위험 활동을 가장 환영받지 못하는 환경에서 가장 우려됩니다. 이러한 이유로,verify_heapam과도한 위험 없이 부패를 진단하도록 설계되었습니다. 심각하게 손상된 시스템에서는 호출 쿼리를 실행하는 것조차 안전하지 않을 수 있으므로 백엔드 충돌의 모든 원인을 방지할 수는 없습니다. 액세스범퍼카 토토 : 문서 : 17 : 51.1. 개요수행되며 카탈로그 자체가 손상된 경우 문제가 될 수 있습니다.
일반적으로,amcheck부패의 존재만을 증명할 수 있습니다. 부재를 증명할 수 없습니다.
다음에 의해 제기된 부패 관련 오류가 없습니다.amcheck항상 거짓양성이어야 합니다.amcheck정의상 절대 발생해서는 안 되는 조건이 발생할 경우 오류를 발생시키므로 주의 깊게 분석합니다.amcheck오류가 필요한 경우가 많습니다.
문제를 해결하는 일반적인 방법은 없습니다.amcheck감지합니다. 불변 위반의 근본 원인에 대한 설명을 찾아야 합니다.Postgresql: Tài liệu: 17: F.23. PageInsPect-Kiểm tra cấp độ thấp của các tra롤 토토 cơ sở dữ liệu부패를 진단하는 데 유용한 역할을 할 수 있습니다.amcheck감지합니다. 갑REINDEX부패를 복구하는 데 효과적이지 않을 수 있습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.