이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 24 장. 일상 토토 사이트 유지 보수 작업버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

21 장. 일상적인 토토 유지 보수 작업

해야 할 일상적인 토토 보수 집안이 있습니다. A를 토토하기 위해 정기적으로 수행PostgreSQL서버가 원활하게 실행됩니다. 그만큼 여기에서 논의 된 과제는 본질적으로 반복적이며 쉽게 와 같은 표준 유닉스 도구를 사용하여 자동화Cron스크립트. 그러나 토토입니다 적절한 스크립트를 설정하는 관리자의 책임 및 그들이 성공적으로 실행되는지 확인하려면

하나의 명백한 토토 보수 작업은 백업 사본 생성입니다. 정기 일정에 따른 데이터. 최근 백업이 없으면 있습니다 재앙 후 회복 가능성 없음 (디스크 고장, 화재, 실수로 중요한 테이블을 삭제합니다). 백업 및 이용 가능한 복구 메커니즘PostgreSQLPostgreSQL : 문서 : 8.0 : 토토 및 토토.

토토 보수 작업의 다른 주요 범주는 주기적입니다"진공 청소기"토토. 이것 활동은에서 논의됩니다.섹션 21.1.

주기적으로주의가 필요한 다른 것은 로그 파일입니다. 관리. 이것은에서 논의됩니다.섹션 21.3.

PostgreSQL유지 보수가 적습니다 다른 토토 관리 시스템에 비해 그래도 여전히, 이러한 작업에 대한 적절한주의는 시스템에 대한 즐겁고 생산적인 경험.

21.1. 일상 진공 청소기

PostgreSQL's진공명령은 정기적으로 실행해야합니다 몇 가지 이유로 :

  1. 업데이트되거나 삭제 된 디스크 공간을 복구하려면 줄.

  2. PostgreSQL쿼리 플래너.

  3. |트랜잭션 ID 랩 어라운드.

의 주파수와 범위진공이들 각각에 대해 수행 된 작업 이유는 각 사이트의 요구에 따라 다릅니다. 따라서 토토 관리자는 이러한 문제를 이해해야합니다 적절한 유지 보수 전략을 개발하십시오. 이 섹션 높은 수준의 문제를 설명하는 데 중점을 둡니다. 자세한 내용 Command Syntax 정보 등, 참조진공참조 페이지.

시작PostgreSQL7.2, 표준 형태진공can 일반 데이터베이스 작업과 병렬로 실행됩니다 (SELECTS, 삽입, 업데이트, 삭제이지만 테이블 변경은 없습니다 정의). 따라서 일상적인 진공 청소기는 거의 다릅니다 이전 릴리스에서 방해가되었으며 낮은 일 시간에 예약을 시도하는 것이 중요합니다.

시작PostgreSQL8.0, 조정할 수있는 구성 매개 변수가 있습니다. 배경 진공 청소기의 성능 영향을 더욱 줄입니다. 보다섹션 16.4.3.4.

21.1.1. 디스크 복구 공간

정상PostgreSQL작동, an업데이트또는삭제의 행은 즉시 제거되지 않습니다 행의 이전 버전. 이 접근법은 필요합니다 Multiversion Concurrency Control의 이점을 얻으십시오 (참조범퍼카 토토 : 문서 : 8.0 : 범퍼카 토토 제어) : 행 버전은해서는 안됩니다 여전히 다른 사람에게는 잠재적으로 볼 수있는 동안 삭제됩니다. 업무. 그러나 결국 구식 또는 삭제 된 행입니다 버전은 더 이상 거래에 관심이 없습니다. 그만큼 새로운 행으로 재사용하려면 점유하는 공간은 디스크 공간 요구 사항의 무한한 성장을 피하십시오. 이것은 실행 중진공.

명확하게, 자주 업데이트 또는 삭제를받는 테이블 테이블보다 더 자주 진공 청소기를 청소해야합니다. 거의 업데이트되지 않았습니다. 정기적 인 설정에 유용 할 수 있습니다Cron작업진공테이블을 건너 뛰는 선택된 테이블 만 그것은 자주 변하지 않는 것으로 알려져 있습니다. 이것은 아마도 가능할 것입니다 크게 업데이트 된 테이블이 모두 있으면 도움이됩니다 큰 거의 거의없는 테이블-진공 청소기의 추가 비용 작은 테이블은 걱정할 가치가 없습니다.

두 가지 변형이 있습니다진공명령. 로 알려진 첫 번째 형태"게으른 진공"또는 Just진공, 표에서 마크가 만료 된 데이터와 향후 재사용을위한 색인;not이 만료 된 데이터가 즉시 사용하는 공간. 따라서, 테이블 파일이 단축되지 않고 파일의 사용하지 않은 공간 운영 체제로 반환되지 않습니다. 이 변형진공동시에 실행할 수 있습니다 일반 데이터베이스 작업.

두 번째 양식은입니다.진공 가득한명령. 이것은보다 공격적인 알고리즘을 사용합니다 만료 된 행 버전으로 소비되는 공간을 되 찾습니다. 어느 에 의해 해방되는 공간진공 Full즉시 운영 체제로 반환됩니다. 불행히도,이 변형의진공명령은 독점 잠금을 획득합니다 각 테이블 동안진공 Fullis 처리. 따라서 자주 사용진공 Full매우 부정적 일 수 있습니다 동시 토토 쿼리의 성능에 미치는 영향.

표준 형태진공is 상당한 수준을 유지하려는 목표로 가장 잘 사용됩니다. 디스크 공간의 정상 사용. 디스크를 반환 해야하는 경우 사용할 수있는 운영 체제의 공간진공 Full- 그러나 요점은 무엇입니까 만 할당하기 만하면 디스크 공간 출시 곧 다시? 적당히 빈번한 표준진공실행은보다 더 나은 접근 방식입니다 드문진공 Full무거운 업데이트 된 테이블 유지.

대부분의 사이트에 대한 권장 실습은 일정을 잡는 것입니다 토토 전체진공하루에 한 번 a 낮은 사용 시간은 더 자주 보충됩니다 필요한 경우 무거운 업데이트 된 테이블의 진공 청소기. (일부 데이터 속도가 매우 높은 설치 가감진공바쁜 테이블 AS 몇 분마다 종종.) 여러 사람이있는 경우 클러스터의 토토, 잊지 마십시오진공각각; 프로그램Vacuumdb도움이 될 수 있습니다.

팁 :thecontrib/pg_autovacuum프로그램이 될 수 있습니다 고주파 진공 청소기를 자동화하는 데 유용합니다 운영.

진공 Full권장됩니다 대부분의 행을 삭제 한 경우 테이블의 정상 상태 크기는 실질적으로진공 가득한의 더 공격적인 접근. 평원 사용진공, 아님진공 가득한, 우주 회복을위한 일상적인 진공 청소기.

내용이 삭제되는 테이블이있는 경우 정기적 인 기준,로하는 것을 고려하십시오.Truncate사용하기보다는삭제그 뒤에진공. Truncate표의 전체 내용을 즉시 제거합니다 후속 요구진공또는진공 Full지금은 디스크 공간을 사용하지 않습니다.

21.1.2. 업데이트 플래너 통계

thePostgreSQL쿼리 플래너는 내용에 대한 통계 정보에 의존합니다 쿼리에 대한 좋은 계획을 생성하기 위해 테이블의. 이것들 통계는에 의해 수집됩니다.분석명령 그 자체 또는 선택적 단계진공. 합리적으로하는 것이 중요합니다 정확한 통계, 그렇지 않으면 계획의 불량한 선택이있을 수 있습니다 토토 성능 저하.

공간 복구를위한 진공 청소기와 마찬가지로 빈번한 업데이트 통계는 업데이트 된 테이블보다 더 유용합니다 거의 업데이트 된 것들을 위해. 그러나 심지어 심지어 심지어 업데이트 된 것도 마찬가지입니다 표, 통계 업데이트가 필요하지 않을 수 있습니다. 데이터의 통계 분포는 크게 변하지 않습니다. 에이 간단한 규칙은 최소의 양에 대해 생각하는 것입니다. 테이블 변경의 열의 최대 값. 을 위한 예, A타임 스탬프열이 행 업데이트 시간은 다음에 포함됩니다 행이 추가 될 때 지속적으로 최대 값을 증가시킵니다 업데이트; 이러한 열은 아마도 더 자주 필요할 것입니다 통계는 URL을 포함하는 열보다 업데이트됩니다 웹 사이트에서 액세스 한 페이지. URL 열이 수신 될 수 있습니다 마찬가지로 자주 변경되지만 통계적 분포 그 가치는 아마도 비교적 느리게 변할 것입니다.

실행할 수 있습니다분석on 특정 테이블 및 테이블의 특정 열만 있으므로 일부 통계를 더 업데이트하기 위해 유연성이 존재합니다 응용 프로그램에 필요한 경우 다른 사람보다 자주 다른 사람보다 자주. ~ 안에 그러나이 기능의 유용성은 실천합니다 못 미더운. 시작PostgreSQL 7.2, 분석도 상당히 빠른 작업입니다 통계 랜덤 샘플링을 사용하기 때문에 큰 테이블 모든 단일 행을 읽지 않고 테이블 행의 행. 그래서 아마 그것을 전체에 걸쳐 실행하는 것이 훨씬 간단 할 것입니다. 자주 데이터베이스.

팁 :콜럼 당 조정이지만분석주파수는 그리되지 않을 수 있습니다 생산적, 당신은 그것이 가치가 있다는 것을 알 수 있습니다 세부의 세부 수준의 컬럼 당 조정 에 의해 수집 된 통계분석. 크게 사용되는 열여기서조항은 매우 불규칙합니다 데이터 배포에는 더 미세한 곡물 데이터가 필요할 수 있습니다 다른 열보다 히스토그램. 보다Alter Table Set Statistics.

대부분의 사이트에 대한 권장 실습은 일정을 잡는 것입니다 토토 전체분석하루에 한 번 낮은 시간의 시간; 이것은 유용하게 결합 될 수 있습니다 야간진공. 그러나 사이트와 함께 비교적 느리게 변화하는 테이블 통계는 그것을 발견 할 수 있습니다 이것은 과잉이며 덜 주파수분석달리기가 충분합니다.

21.1.3. 거래 ID 방지 랩 어라운드 실패

PostgreSQL'S MVCC 거래 시맨틱은 비교할 수있는 것에 달려 있습니다 트랜잭션 ID (xid) 숫자 : 삽입 xid가 현재 트랜잭션의 XID는"에서 미래"전류에 보이지 않아야합니다 거래. 그러나 트랜잭션 ID는 크기가 제한되어 있기 때문에 (32 이 글을 쓰는 데 비트) 오랫동안 실행되는 클러스터 (40 억 개 이상의 거래) 고통트랜잭션 ID 랩 어라운드: XID 카운터 주위를 0으로 감싸고 갑자기 갑자기 거래 과거에 미래에있는 것처럼 보였습니다. 그들의 출력은 보이지 않습니다. 요컨대, 치명적인 데이터 손실. (실제로 데이터는 여전히 존재하지만 차갑습니다 당신이 그것을 얻을 수 없다면 편안함.)

이전postgresql7.2, XID 랩 어라운드에 대한 유일한 방어는 re였습니다.initdb적어도 40 억마다 거래. 물론 이것은 교통량이 많은 것에 대해 만족스럽지 않았습니다 사이트이므로 더 나은 솔루션이 고안되었습니다. 새로운 접근 방식은 서버가없이 무기한으로 토토할 수 있도록합니다.initdb또는 모든 종류의 재시작. 그만큼 가격은이 유지 보수 요구 사항입니다.데이터베이스의 모든 테이블은 있어야합니다 적어도 10 억 건의 거래마다 진공 청소기.

실제로 이것은 번거로운 요구 사항이 아니지만 그 이후로 충족하지 못한 결과는 완전한 데이터가 될 수 있습니다. 손실 (낭비 된 디스크 공간이나 느린 성능이 아니라), 일부 토토를 돕기 위해 특별 조항이 이루어졌습니다 관리자는 마지막 이래로 시간을 추적합니다진공. 이것의 나머지 섹션은 세부 사항을 제공합니다.

XID 비교에 대한 새로운 접근법은 두 가지를 구별합니다 특수 XID, 번호 1 및 2 (bootstrapxidandfrozenxid). 이 두 XID는 항상입니다 모든 정상 XID보다 오래된 것으로 간주됩니다. 정상적인 xids (그것들 2)가 Modulo-2를 사용하여 비교됩니다31산술. 이것은 모든 정상적인 XID에 대해 있음을 의미합니다 20 억 개의 xids"구형""최신"; 또 다른 방법은 일반 XID 공간이 끝점이없는 원형. 따라서 한 번 행 버전이 있습니다 특정 일반 XID, 행 버전으로 만들어졌습니다."과거"다음 20 억 건의 거래의 경우, 어떤 정상이든 우리가 이야기하고 있습니다. 행 버전이 여전히 존재하는 경우 20 억 명이 넘는 거래 후에 갑자기 갑자기있을 것입니다 미래에있는 것 같습니다. 데이터 손실을 방지하기 위해 오래된 행 버전은 xid를 재 할당해야합니다frozenxid그들이 도달하기 전에 언젠가 2 억 번의 트랜잭션 오래된 마크. 일단 그들이 할당되면 이 특별한 xid, 그들은"과거"모든 정상 거래 랩 어라운드 문제와 그러한 행 버전에 관계없이 아무리 길든 삭제 될 때까지 좋을 것입니다. 이것 XID의 재 할당은에 의해 처리됩니다.진공.

진공의 정상 정책입니다 재 할인frozenxid모든 행으로 일반 XID가 10 억 명 이상의 거래를 가진 버전 과거에. 이 정책은 원래 삽입 XID를 보존합니다 더 이상 관심이 없을 때까지. (사실은, 대부분의 행 버전은 아마도 살아 나고 죽을 것입니다. 존재"Frozen".)이 정책을 통해 사이의 최대 안전한 간격진공모든 테이블에서 실행되는 것은 정확히 하나입니다 10 억 거래 : 더 오래 기다리면 가능합니다 재 할당하기에 충분히 오래되지 않은 행 버전 지난번에 20 억 명이 넘는 거래가되었습니다. 미래에 싸여있었습니다. 즉, 당신에게 잃어 버렸습니다. (물론, 20 억 명의 후에 다시 나타날 것입니다 거래이지만 도움이되지 않습니다.)

정기 이후진공실행은입니다 어쨌든 앞에서 설명한 이유로 필요합니다 어떤 테이블이든 오랫동안 진공 청소기를 청소하지 않을 것 같지 않습니다. 10 억 거래. 그러나 관리자가 보장하도록 돕기 위해 이 제약 조건이 충족됩니다.진공시스템 테이블에 트랜잭션 ID 통계를 저장pg_database. 특히datfrozenxid토토의 열pg_database행에서 행이 업데이트됩니다 데이터베이스 전체의 완료진공작동 (예 :진공특정 테이블의 이름을 지정하지 않음). 이 필드에 저장된 값은 Freeze Cutoff XID입니다. 그것에 의해 사용되었습니다진공명령. 모두 이 컷오프 XID보다 오래된 일반 XID는 대체되었습니다frozenxid내 해당 토토. 이 정보를 조사하는 편리한 방법 쿼리를 실행하는 것입니다

pg_database에서 datname, age (datfrozenxid)를 선택하십시오.

Age열 측정 컷오프 XID에서 현재로의 트랜잭션 수 거래의 xid.

표준 동결 정책을 사용하여Age열은 10 억에서 시작됩니다 신선하게 바신 데이터베이스. 때Age데이터베이스는 20 억에 이릅니다 랩 어라운드 실패의 위험을 피하기 위해 다시 진공 청소기를 청소하십시오. 권장 연습은진공각 토토는 최소 1 억마다 한 번 이상 (500 충분한 안전을 제공하기 위해 백만) 거래 여유. 이 규칙을 충족시키기 위해 각 토토 전체진공자동으로 경고를 전달합니다pg_database항목 표시Age1.5 이상 10 억 거래, 예 :

play =# 진공;
경고 : 일부 데이터베이스는 1613770184 거래에서 청소되지 않았습니다.
힌트 : 533713463 트랜잭션 내에서 진공 청소기를 진공 청소치하거나 랩 어라운드 실패가 발생할 수 있습니다.
진공

진공with동결옵션은보다 공격적인 동결을 사용합니다 정책 : 행 버전은 충분히 오래되면 동결됩니다. 모든 공개 거래에서 좋은 것으로 간주됩니다. 특히, a진공 동결에서 수행됩니다 그렇지 않으면 단일 토토, 보장됩니다.all그에 대한 행 버전 데이터베이스가 동결됩니다. 따라서 데이터베이스가있는 한 어떤 식 으로든 수정되지 않으면 후속가 필요하지 않습니다. 거래 ID 랩 어라운드 문제를 피하기 위해 진공 청소기. 이것 기술은에 의해 사용됩니다.initdbTO 준비template0토토. 그것 또한 사용자가 만든 토토를 준비하는 데 사용해야합니다 표시 될datallowconn=거짓inpg_database편리하지 않기 때문에 방법진공토토 연결할 수 없습니다. 참고진공's 비 바 검사 데이터베이스에 대한 자동 경고 메시지는 할 것입니다 무시하다pg_database출품작DatallowConn=거짓, 허위 경고를 피하기 위해 이 데이터베이스에 대해; 그러므로 보장하는 것은 당신에게 달려 있습니다 그러한 데이터베이스는 올바르게 동결됩니다.

경고

거래에 대한 안전을 확인하십시오 랩 어라운드, 진공 청소기가 필요합니다Every테이블을 포함합니다 시스템 카탈로그,Every적어도 데이터베이스 10 억마다 한 번. 우리는 데이터를 보았습니다 사람들이 그들을 결정하는 사람들로 인한 손실 상황 활성 사용자 테이블을 진공 청소기로 진공 청소기로 청소할 필요가 있습니다. 데이터베이스 전체 진공 명령을 발행하는 대신. 그것은 잘 작동하는 것처럼 보일 것입니다 ... 잠시 동안.