내장된 모든 무지개 토토 로그 모듈에는 고유한 유형의 무지개 토토 레코드가 있지만 일반적인 방식으로 페이지 변경 사항을 설명하는 일반 무지개 토토 레코드 유형도 있습니다. 이는 자체 무지개 토토 다시 실행 루틴을 등록할 수 없기 때문에 사용자 정의 액세스 방법을 제공하는 확장에 유용합니다.
일반 WAL 레코드를 구성하기 위한 API는 다음에 정의되어 있습니다.access/generic_xlog.h및 구현액세스/transam/generic_xlog.c.
일반 WAL 레코드 기능을 사용하여 WAL 로그 데이터 업데이트를 수행하려면 다음 단계를 따르십시오.
상태 = GenericXLogStart(관계)— 주어진 관계에 대한 일반 무지개 토토 레코드 구성을 시작합니다.
page = GenericXLogRegisterBuffer(상태, 버퍼, 플래그)— 현재 일반 WAL 레코드 내에서 수정될 버퍼를 등록합니다. 이 함수는 수정이 이루어져야 하는 버퍼 페이지의 임시 복사본에 대한 포인터를 반환합니다. (버퍼의 내용을 직접 수정하지 마십시오.) 세 번째 인수는 작업에 적용할 수 있는 플래그의 비트 마스크입니다. 현재 유일한 플래그는 다음과 같습니다.GENERIC_XLOG_FULL_IMAGE는 델타 업데이트가 아닌 전체 페이지 이미지가 무지개 토토 레코드에 포함되어야 함을 나타냅니다. 일반적으로 이 플래그는 페이지가 새 페이지이거나 완전히 다시 작성된 경우 설정됩니다.GenericXLogRegisterBuffer무지개 토토에 기록된 작업이 여러 페이지를 수정해야 하는 경우 반복될 수 있습니다.
이전 단계에서 얻은 페이지 이미지에 수정사항을 적용합니다.
GenericXLogFinish(상태)— 변경 사항을 버퍼에 적용하고 일반 무지개 토토 레코드를 내보냅니다.
WAL 레코드 생성은 위 단계 사이에서 다음을 호출하여 취소할 수 있습니다.GenericXLogAbort(상태). 페이지 이미지 사본에 대한 모든 변경사항이 삭제됩니다.
일반 WAL 레코드 기능을 사용할 때 다음 사항에 유의하십시오.
버퍼를 직접 수정하는 것은 허용되지 않습니다! 모든 수정은 다음에서 얻은 사본으로 수행되어야 합니다.GenericXLogRegisterBuffer(). 즉, 일반 무지개 토토 레코드를 만드는 코드는 절대 호출하면 안 됩니다.BufferGetPage()그 자체로. 그러나 적절한 시간에 버퍼를 고정/고정 해제하고 잠그거나 잠금 해제하는 것은 호출자의 책임입니다. 이전부터 각 대상 버퍼에 배타적 잠금을 유지해야 합니다.GenericXLogRegisterBuffer()이후까지GenericXLogFinish().
버퍼 등록(2단계)과 페이지 이미지 수정(3단계)은 자유롭게 혼합할 수 있습니다. 즉, 두 단계를 임의의 순서로 반복할 수 있습니다. 버퍼는 재생 중에 잠금을 얻는 순서와 동일한 순서로 등록되어야 한다는 점을 명심하세요.
일반 무지개 토토 레코드에 등록할 수 있는 최대 버퍼 수는MAX_GENERIC_XLOG_PAGES. 이 한도를 초과하면 오류가 발생합니다.
일반 무지개 토토은 수정될 페이지가 표준 레이아웃을 가지고 있으며 특히 사이에 유용한 데이터가 없다고 가정합니다.pd_lower그리고pd_upper.
버퍼 페이지의 복사본을 수정하고 있으므로,GenericXLogStart()중요 섹션을 시작하지 않습니다. 따라서 사이에 메모리 할당, 오류 던지기 등을 안전하게 수행할 수 있습니다.GenericXLogStart()그리고GenericXLogFinish(). 내부에는 유일한 실제 중요 섹션이 있습니다.GenericXLogFinish(). 전화는 걱정하지 않으셔도 됩니다.GenericXLogAbort()오류 종료 중.
GenericXLogFinish()버퍼를 더티로 표시하고 해당 LSN을 설정합니다. 이 작업을 명시적으로 수행할 필요는 없습니다.
기록되지 않은 관계의 경우 실제 무지개 토토 레코드가 내보내지지 않는다는 점을 제외하면 모든 것이 동일하게 작동합니다. 따라서 일반적으로 기록되지 않은 관계에 대해 명시적인 검사를 수행할 필요가 없습니다.
일반 무지개 토토 다시 실행 기능은 등록된 순서와 동일한 순서로 버퍼에 대한 배타적 잠금을 획득합니다. 모든 변경 사항을 다시 실행한 후에는 동일한 순서로 잠금이 해제됩니다.
만약GENERIC_XLOG_FULL_IMAGE이(가) 등록된 버퍼에 대해 지정되지 않았습니다. 일반 WAL 레코드에는 이전 페이지 이미지와 새 페이지 이미지 사이의 델타가 포함되어 있습니다. 이 델타는 바이트별 비교를 기반으로 합니다. 이는 페이지 내에서 데이터를 이동하는 경우 매우 간단하지 않으며 향후 개선될 수 있습니다.