2017-12-26 15 views
0

나는 여기에 인용 발견postgres Write-Ahead Log가 이중으로 다시 적용될 수 있습니까?

의 PostgreSQL은 미리 쓰기 로그에 의존하는 데이터베이스 (WAL) 중 하나입니다 - 모든 변경 먼저 로그 (변화의 흐름)에 기록하고,에 만 데이터 파일. 크래시의 경우 데이터베이스가 WAL을 사용하여 복구를 수행 할 수 있으므로 내구성을 제공합니다. WAL에서 변경 사항을 읽고 데이터 파일에 다시 적용하기 때문에 내구성을 제공합니다. 이 문서 https://blog.2ndquadrant.com/basics-of-tuning-checkpoints/

하자에서

쿼리 다음 WAL 파일 킵이 말을

UPDATE page SET view_count = view_count + 1;

내가 을 dB로 포스트 그레스는 이미 WAL을 적용하는 경우를 상상할 수

하지만 충돌 적용 직후.

DB가 최신 WAL 위치를 업데이트하지 않습니다. NOR 삭제 WAL 로그 파일이 아직 없습니다.

DB가 가동되면 복구가 완료되고이 WAL을 다시 적용합니다. 그렇지 않습니까? 데이터베이스의 최종 값은 view_count + 2이됩니까?

알려 주시기 바랍니다

답변

1

이러한 상황은 부분 페이지가을 기록했다. PostgreSQL에는이 문제에 대한 보호를 막기위한 구성 옵션이 있습니다. full_page_writes.

이 매개 변수가 켜지면 PostgreSQL 서버는 검사 점 이후 해당 페이지를 처음 수정할 때 각 디스크 페이지의 전체 내용을 WAL에 씁니다. 이는 운영 체제 충돌 중에 진행중인 페이지 쓰기가 부분적으로 만 완료되어 이전 데이터와 새 데이터가 혼합 된 디스크상의 페이지로 이어질 수 있기 때문에 필요합니다.

변경 내용을 다시 실행하는 대신 페이지 복사본을 복원하여 재생했습니다.

+0

의미가 있습니다. 고맙습니다. – chaintng

+0

질문이 하나 더 있습니다. 정말 큰 테이블 전체에 대한 데이터를 업데이트하는 경우 (예 : 테이블 크기 2GB) 'full_page_writes'는 메모리 크기가 충분히 크지 않기 때문에이 연산을 제한할까요? – chaintng

+0

아니요, 'full_page_writes'에는 쓰여진 페이지 수에 대한 제한이 없습니다. Postgre의 각 테이블은 고정 크기 [pages] (https://www.postgresql.org/docs/current/static/storage-page-layout.html) 배열로 저장됩니다. 특정 행은 모든 페이지에 저장할 수 있습니다. 이 페이지는 첫 수정시 WAL에 기록됩니다. 따라서 전체 표 (각 행)가 수정되면 모든 해당 페이지가 WAL에 기록됩니다. – Nikita