토토 결과성은 심각한 데이터베이스 시스템의 중요한 속성이며PostgreSQL토토 결과 수있는 작업을 보장하기 위해 가능한 모든 것을 수행합니다. 토토 결과 수있는 운영의 한 가지 측면은 커밋 된 트랜잭션에 의해 기록 된 모든 데이터가 전력 손실, 운영 체제 고장 및 하드웨어 고장으로부터 안전한 비 휘발성 영역에 저장되어야한다는 것입니다 (물론 비 휘발성 영역 자체의 실패 제외). 컴퓨터의 영구 스토리지 (디스크 드라이브 또는 이와 동등한)에 데이터를 성공적으로 작성하는 것이 일반적 으로이 요구 사항을 충족합니다. 실제로, 컴퓨터가 치명적으로 손상 되더라도 디스크 드라이브가 살아남는 경우 유사한 하드웨어를 사용하여 다른 컴퓨터로 이동할 수 있으며 모든 커밋 된 트랜잭션이 그대로 유지됩니다.
디스크 플래터에 데이터를 강제로 강제하는 것은 정기적으로 간단한 작동처럼 보일 수 있지만 그렇지 않습니다. 디스크 드라이브는 메인 메모리 및 CPU보다 크게 느리기 때문에 컴퓨터의 기본 메모리와 디스크 플래터 사이에는 여러 층의 캐싱이 존재합니다. 먼저 운영 체제의 버퍼 캐시가 있으며,이 버퍼 캐시는 자주 디스크 블록을 요청하고 디스크 토토 결과를 결합합니다. 다행히 모든 운영 체제는 애플리케이션에 버퍼 캐시에서 디스크로 토토 결과를 강제로 제공하는 방법을 제공합니다.PostgreSQL해당 기능을 사용합니다. (참조WAL_SYNC_METHOD이 작업이 수행되는 방식을 조정하는 매개 변수.)
다음으로 디스크 드라이브 컨트롤러에 캐시가있을 수 있습니다. 이것은 특히 일반적입니다Raid컨트롤러 카드. 이 캐시 중 일부는입니다.토토 결과 스루, 즉, 토토 결과는 도착하자마자 드라이브로 전송됩니다. 다른 사람은토토 결과 백, 즉, 데이터가 나중에 드라이브로 전송됩니다. 디스크 컨트롤러 캐시의 메모리가 휘발성이기 때문에 이러한 캐시는 토토 결과성 위험이 될 수 있으며 정전으로 내용물을 잃게됩니다. 더 나은 컨트롤러 카드는배터리 백 쿠크 장치(BBUs) - 시스템 전력 손실의 경우 캐시에 전원을 유지하는 배터리가 있습니다. 전원이 복원 된 후 데이터는 디스크 드라이브에 기록됩니다.
마지막으로 대부분의 디스크 드라이브에는 캐시가 있습니다. 일부는 쓰기가 끝나고 일부는 토토 결과 백이며 디스크 컨트롤러 캐시와 마찬가지로 토토 결과 백 드라이브 캐시에 대한 데이터 손실에 대한 동일한 우려가 있습니다. 소비자 등급의 IDE 및 SATA 드라이브는 특히 정전에서 살아남지 못하는 토토 결과 캐시가있을 가능성이 높습니다. 많은 솔리드 스테이트 드라이브 (SSD)도 휘발성 토토 결과 백 캐시를 가지고 있습니다.
이 캐시는 일반적으로 비활성화 될 수 있습니다. 그러나이를 수행하는 방법은 운영 체제 및 드라이브 유형에 따라 다릅니다.
onLinux, IDE 및 SATA 드라이브를 사용하여 쿼리 할 수 있습니다hdparm -i
; 토토 결과 캐싱이 활성화되어 있다면*
옆토토 결과 캐시
. HDPARM -W 0
토토 결과 캐싱을 끄는 데 사용될 수 있습니다. SCSI 드라이브는 사용을 쿼리 할 수 있습니다SDPARM. 사용sdparm --get = wce
토토 결과 캐시가 활성화되어 있는지 확인하려면sdparm -Clear = wce
비활성화하려면
onfreebsd, IDE drives can be queried usingAtacontrol
그리고 토토 결과 캐싱을 사용하여 끄기hw.ata.wc = 0
in/boot/loader.conf
; SCSI 드라이브는 사용을 쿼리 할 수 있습니다CamControl 식별
, 그리고 토토 결과 캐시는 쿼리 및 변경을 사용하여 변경되었습니다SDPARM
가능한 경우.
onSolaris, 디스크 토토 결과 캐시는에 의해 제어됩니다.형식 -E
. (SolarisZFS파일 시스템은 자체 디스크 캐시 플러시 명령을 발행하기 때문에 디스크 토토 결과 캐시가 활성화되어 안전합니다.)
onWindows, ifWal_sync_method
isOpen_Datasync
(기본값), 검사를 취소하여 토토 결과 캐싱을 비활성화 할 수 있습니다내 컴퓨터 \ Open \
. 또는 set디스크 드라이브
\ Properties \ Hardware \ Properties \ Policies \ 디스크에서 토토 결과 캐싱 활성화Wal_sync_method
tofsync
또는fsync_writethrough
, 토토 결과 캐싱을 방지하는 것.
onMacOS, 설정을 통해 토토 결과 캐싱을 방지 할 수 있습니다Wal_sync_method
tofsync_writethrough
.
최근 SATA 드라이브 (다음 사람들atapi-6또는 이후) 드라이브 캐시 플러시 명령을 제공합니다 (플러시 캐시 Ext
), SCSI 드라이브는 오랫동안 비슷한 명령을 지원해 왔습니다캐시 동기화
. 이 명령은 직접 액세스 할 수 없습니다postgresql그러나 일부 파일 시스템 (예 :ZFS, ext4)는이를 사용하여 Write-Back 지원 드라이브의 플래터에 데이터를 플러시 할 수 있습니다. 불행히도, 이러한 파일 시스템은 배터리 백업 장치 (와 결합 될 때 차 표적으로 행동합니다.BBU) 디스크 컨트롤러. 이러한 설정에서 동기화 명령은 모든 데이터를 컨트롤러 캐시에서 디스크로 강제하여 BBU의 많은 이점을 제거합니다. 당신은를 실행할 수 있습니다PG_TEST_FSYNC영향을 받는지 확인하는 프로그램. 영향을받는 경우 파일 시스템의 쓰기 장벽을 끄거나 디스크 컨트롤러를 재구성하여 BBU의 성능 이점을 회복 할 수 있습니다. 쓰기 장벽이 꺼지는 경우 배터리가 작동 상태인지 확인하십시오. 배터리 결함이 있으면 잠재적으로 데이터 손실이 발생할 수 있습니다. 바라건대 시스템과 디스크 컨트롤러 설계자는 결국이 차선책을 다룰 것입니다.
운영 체제가 스토리지 하드웨어에 쓰기 요청을 보내면 데이터가 진정한 비 휘발성 저장 영역에 도착했는지 확인하는 것이 거의 없습니다. 오히려 모든 스토리지 구성 요소가 데이터 및 파일 시스템 메타 데이터에 대한 무결성을 보장하는 것은 관리자의 책임입니다. 비 버터가 접지 된 토토 결과 캐시가있는 디스크 컨트롤러를 피하십시오. 드라이브 레벨에서는 드라이브가 종료 전에 데이터가 작성되도록 보장 할 수없는 경우 토토 결과 백 캐싱을 비활성화하십시오. SSD를 사용하는 경우이 중 많은 부분이 기본적으로 캐시 플러시 명령을 존중하지 않습니다. 신뢰할 수있는 I/O 하위 시스템 동작을 사용하여를 테스트 할 수 있습니다.diskchecker.pl
.
디스크 플래터 쓰기 작업 자체에 의해 데이터 손실의 또 다른 위험이 제기됩니다. 디스크 플래터는 각각 512 바이트 인 섹터로 나뉩니다. 모든 물리적 읽기 또는 쓰기 운영은 전체 부문을 처리합니다. 쓰기 요청이 드라이브에 도착하면 512 바이트 (의 일부 배수가 될 수 있습니다.postgresql일반적으로 한 번에 8192 바이트 또는 16 개의 섹터를 작성하고) 언제든지 전력 손실로 인해 글쓰기 과정이 실패 할 수 있으며, 이는 512 바이트 부문 중 일부가 작성되지 않았지만 다른 부문은 그렇지 않았습니다. 그러한 실패를 막기 위해PostgreSQL정기적으로 전체 페이지 이미지를 영구 WAL 스토리지에 토토 결과전디스크의 실제 페이지 수정. 이렇게하면 충돌 회복 중PostgreSQLWAL에서 부분적으로 작성된 페이지를 복원 할 수 있습니다. 부분 페이지 쓰기 (예 : ZFS)를 방지하는 파일 시스템 소프트웨어가있는 경우이 페이지 이미징을 끄면full_page_writes매개 변수. 배터리 지원 장치 (BBU) 디스크 컨트롤러는 데이터가 BBU에 전체 (8KB) 페이지로 기록되었음을 보장하지 않는 한 부분 페이지 작성을 방지하지 않습니다.
18512_18524또한 쓰레기 데이터 읽기/쓰기와 같은 시간이 지남에 따라 하드웨어 오류 또는 시간이 지남에 따라 미디어 고장으로 인해 발생할 수있는 스토리지 장치의 일부 데이터 손상으로부터 보호합니다.
WAL 파일의 각 개별 레코드는 CRC-32 (32 비트) 점검으로 보호되어 레코드 내용이 올바른지 알 수 있습니다. CRC 값은 각 WAL 레코드를 작성할 때 설정되고 충돌 복구, 아카이브 복구 및 복제 중에 확인되었습니다.
데이터 페이지는 현재 기본적으로 확인되지 않지만 WAL 레코드에 기록 된 전체 페이지 이미지는 보호됩니다. 보다initdb데이터 페이지 활성화에 대한 자세한 내용은
과 같은 내부 데이터 구조PG_XACT
, PG_SUBTRANS
, pg_multixact
, PG_SERIAL
, pg_notify
, PG_STAT
, PG_SNAPSHOTS
는 직접 확인되지 않았으며 페이지가 전체 페이지 토토 결과로 보호되지도 않습니다. 그러나 이러한 데이터 구조가 영구적 인 경우, Crash Recovery에서 최근 변경 사항을 정확하게 재건 할 수있는 WAL 레코드가 작성되고 이러한 WAL 레코드는 위에서 논의한대로 보호됩니다..
개별 상태 파일에서PG_TWOPHASE
CRC-32에 의해 보호됩니다.
정렬, 물질화 및 중간 결과에 더 큰 SQL 쿼리에 사용되는 임시 데이터 파일은 현재 확인되지 않으며 해당 파일의 변경을 위해 WAL 레코드가 작성되지 않습니다.
PostgreSQL수정 가능한 메모리 오류로부터 보호하지 않으며 산업 표준 오류 수정 코드 (ECC) 또는 더 나은 보호를 사용하는 RAM을 사용하여 작동한다고 가정합니다..