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

21장. 일상적인 토토 유지 관리 작업

반드시 수행해야 하는 몇 가지 일상적인 유지 관리 작업이 있습니다. a를 유지하기 위해 정기적으로 수행됩니다.포스트그레SQL서버가 원활하게 작동하고 있습니다. 는 여기서 논의되는 작업은 본질적으로 반복적이며 쉽게 수행될 수 있습니다. 다음과 같은 표준 Unix 도구를 사용하여 자동화됨크론스크립트. 하지만 그것은 토토입니다 적절한 스크립트를 설정하는 것은 관리자의 책임입니다. 성공적으로 실행되는지 확인합니다.

한 가지 확실한 유지 관리 작업은 다음의 백업 복사본을 생성하는 것입니다. 정기적인 일정에 따라 데이터를 수집합니다. 최근 백업이 없으면 재해(디스크 장애, 화재, 실수로 중요한 테이블을 삭제하는 등). 백업과 다음에서 사용 가능한 복구 메커니즘포스트그레SQL다음에서 자세히 논의됩니다.PostgreSQL : 문서 : 8.0 : 토토 및 토토.

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

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

PostgreSQL유지관리가 적습니다. 다른 데이터베이스 관리 시스템과 비교됩니다. 그럼에도 불구하고, 이러한 작업에 대한 적절한 관심은 다음을 보장하는 방향으로 나아갈 것입니다. 시스템에 대한 즐겁고 생산적인 경험입니다.

21.1. 일상적인 진공 청소

PostgreSQL진공명령은 정기적으로 실행되어야 합니다. 여러 가지 이유로:

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

  2. 다음에서 사용하는 데이터 통계를 업데이트하려면PostgreSQL쿼리 플래너.

  3. 다음으로 인해 매우 오래된 데이터의 손실을 방지하기 위해트랜잭션 ID 랩어라운드.

의 빈도와 범위진공각각에 대해 수행된 작업 이유는 각 사이트의 요구 사항에 따라 다릅니다. 따라서 데이터베이스 관리자는 이러한 문제를 이해해야 합니다. 적절한 유지 관리 전략을 개발합니다. 이 섹션 높은 수준의 문제를 설명하는 데 집중합니다. 자세한 내용은 명령 구문 등에 대해서는 다음을 참조하세요.진공참조 페이지.

시작PostgreSQL7.2, 의 표준형진공할 수 있다 일반 데이터베이스 작업과 병렬로 실행(선택, 삽입, 업데이트, 삭제는 가능하지만 테이블은 변경되지 않습니다. 정의). 따라서 일상적인 진공 청소는 거의 그렇지 않습니다. 이전 릴리스와 마찬가지로 방해가 되지만 하루 중 사용량이 적은 시간에 예약하는 것이 중요합니다.

시작PostgreSQL8.0, 다음과 같이 조정할 수 있는 구성 매개변수가 있습니다. 백그라운드 진공 청소로 인해 성능에 미치는 영향이 더욱 줄어듭니다. 참조섹션 16.4.3.4.

21.1.1. 디스크 복구 중 공간

정상적으로PostgreSQL작업, an업데이트또는삭제행이 즉시 제거되지 않음 행의 이전 버전입니다. 이 접근 방식은 다음을 위해 필요합니다. 다중 버전 동시성 제어의 이점을 얻습니다(참조범퍼카 토토 : 문서 : 8.0 : 범퍼카 토토 제어): 행 버전은 다음과 같아야 합니다. 잠재적으로 다른 사람에게 표시되는 동안 삭제됩니다. 거래. 하지만 결국에는 오래되었거나 삭제된 행이 버전은 더 이상 어떤 거래에도 관심이 없습니다. 는 새 행에서 재사용하려면 차지하는 공간을 회수해야 합니다. 디스크 공간 요구 사항이 무한정 증가하는 것을 방지합니다. 이것은 실행하여 완료진공.

분명히 자주 업데이트되거나 삭제되는 테이블입니다 테이블보다 더 자주 진공청소기를 청소해야 합니다. 거의 업데이트되지 않습니다. 주기적으로 설정하는 것이 유용할 수 있습니다.크론할 일진공선택한 테이블만, 테이블 건너뛰기 자주 바뀌지 않는 것으로 알려져 있습니다. 이것은 아마도 크게 업데이트된 대규모 테이블과 자주 업데이트되지 않는 대형 테이블 — 테이블을 청소하는 데 드는 추가 비용 작은 테이블은 걱정할 만큼 충분하지 않습니다.

다음에는 두 가지 변형이 있습니다.진공명령. 첫 번째 형식은"게으른 진공"또는 그냥진공, 테이블에 만료된 데이터를 표시하고 향후 재사용을 위한 인덱스 그렇죠아님복원을 시도합니다. 만료된 데이터가 즉시 사용하는 공간입니다. 그러므로, 테이블 파일은 단축되지 않으며 파일에 사용되지 않은 공간이 있습니다. 운영 체제로 반환되지 않습니다. 이 변형은진공다음과 동시에 실행될 수 있습니다. 정상적인 데이터베이스 작업입니다.

두 번째 형태는진공 전체명령. 이는 보다 공격적인 알고리즘을 사용합니다. 만료된 행 버전에서 소비한 공간을 회수합니다. 모두 다음으로 해제된 공간진공 가득 참즉시 운영 체제로 반환됩니다. 불행하게도 이 변형은진공명령은 다음에 대한 독점 잠금을 획득합니다. 각 테이블 동안진공이 가득 참이 그것을 처리합니다. 따라서 자주 사용하는진공 가득 참매우 부정적일 수 있음 동시 토토 쿼리의 성능에 영향을 미칩니다.

의 표준형진공이다 상당히 수준을 유지하려는 목적으로 사용하는 것이 가장 좋습니다. 디스크 공간의 안정적인 상태 사용. 디스크를 반납해야 하는 경우 사용할 수 있는 운영 체제 공간진공이 가득 참— 그런데 요점이 뭐죠? 할당만 하면 되는 디스크 공간을 해제합니다. 곧 또? 보통 빈도 표준진공실행은 다음보다 더 나은 접근 방식입니다. 드물게진공 가득 참다음을 위해 실행됩니다. 많이 업데이트된 테이블을 유지 관리합니다.

대부분의 사이트에서 권장되는 방법은 토토 전체진공하루에 한 번 하루 중 사용량이 적은 시간, 더 자주 보충 필요한 경우 많이 업데이트된 테이블을 진공 청소기로 청소합니다. (일부 데이터 전송률이 매우 높은 설치 수정진공사용 중인 테이블 몇 분에 한 번씩 자주 발생합니다.) 클러스터의 토토, 잊지 마세요진공각각; 프로그램vacuumdb도움이 될 것 같습니다.

팁:contrib/pg_autovacuum프로그램은 다음과 같습니다. 고주파 진공 청소를 자동화하는 데 유용합니다. 운영.

진공 가득 참다음에 권장됩니다. 대부분의 행을 삭제했음을 알고 있는 경우 테이블의 안정된 상태 크기가 다음과 같이 크게 줄어들었습니다.진공 전체의 더욱 공격적인 접근 방식입니다. 일반 사용진공, 아님진공 전체, 공간 회수를 위한 일상적인 진공청소용.

다음에 내용이 삭제된 테이블이 있는 경우 주기적으로 수행하는 것을 고려하십시오.잘라내기사용하는 것보다삭제다음에 이어진공. 잘라내기테이블의 전체 내용을 즉시 제거합니다. 후속 조치가 필요함진공또는진공 가득 참복원하기 위해 현재 사용되지 않은 디스크 공간입니다.

21.1.2. 플래너 업데이트 중 통계

PostgreSQL질의 기획자는 콘텐츠에 대한 통계정보에 의존합니다. 쿼리에 대한 좋은 계획을 생성하기 위해 테이블을 만듭니다. 이것들 통계는 다음에 의해 수집됩니다.분석명령으로 호출할 수 있습니다. 자체적으로 또는 선택적인 단계로진공. 합리적으로 갖는 것이 중요하다 정확한 통계가 없으면 잘못된 계획 선택이 발생할 수 있습니다. 토토 성능이 저하됩니다.

공간 복구를 위한 진공 청소와 마찬가지로 자주 업데이트되는 통계는 데이터보다 자주 업데이트되는 테이블에 더 유용합니다. 거의 업데이트되지 않는 것들에 대해. 하지만 대규모 업데이트에도 불구하고 테이블의 경우 통계 업데이트가 필요하지 않을 수 있습니다. 데이터의 통계적 분포는 크게 변하지 않습니다. 에이 간단한 경험 법칙은 최소 금액이 얼마인지 생각하는 것입니다. 테이블에 있는 열의 최대값이 변경됩니다. 에 대한 예를 들어, a타임스탬프그 열 행 업데이트 시간을 포함합니다. 행이 추가됨에 따라 지속적으로 증가하는 최대값 업데이트됨; 그러한 열은 아마도 더 자주 필요할 것입니다 예를 들어 URL이 포함된 열보다 통계가 업데이트됩니다. 웹사이트에서 액세스한 페이지. URL 열은 다음을 수신할 수 있습니다. 자주 변경되지만 통계적 분포는 그 값은 아마도 상대적으로 느리게 변할 것입니다.

실행이 가능합니다분석켜짐 특정 테이블, 심지어는 테이블의 특정 열만 일부 통계를 더 많이 업데이트할 수 있는 유연성이 존재합니다. 애플리케이션에 필요한 경우 다른 것보다 자주. 에서 그러나 실제로 이 기능의 유용성은 의심스럽다. 다음에서 시작됨PostgreSQL 7.2, 분석다음에서도 상당히 빠른 작업입니다. 통계적 무작위 샘플링을 사용하기 때문에 큰 테이블 모든 단일 행을 읽는 대신 테이블의 행을 읽습니다. 따라서 전체에 걸쳐 실행하는 것이 아마도 훨씬 간단할 것입니다. 데이터베이스를 자주 사용하세요.

팁:열별로 조정했지만분석빈도가 그리 높지 않을 수 있습니다. 생산적이라면, 당신은 그 일을 할 가치가 있다고 생각할 수도 있습니다 열별로 세부 수준 조정 통계 수집자:분석. 에서 많이 사용되는 열어디절이 있으며 매우 불규칙합니다. 데이터 배포에는 더 세분화된 데이터가 필요할 수 있습니다. 다른 열보다 히스토그램. 참조테이블 세트 통계 변경.

대부분의 사이트에서 권장되는 방법은 토토 전체분석하루에 한 번 하루 중 사용량이 적은 시간; 이는 다음과 유용하게 결합될 수 있습니다. 매일 밤진공. 그러나 다음과 같은 사이트는 상대적으로 느리게 변화하는 테이블 통계는 다음과 같은 사실을 알 수 있습니다. 이건 과잉이고 빈도도 낮습니다.분석실행하면 충분합니다.

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

PostgreSQL의 MVCC 트랜잭션 의미론은 비교 능력에 달려 있습니다. 거래 ID(XID) 숫자: 삽입 XID가 다음보다 큰 행 버전 현재 거래의 XID는"안에 미래"현재 사용자에게 표시되어서는 안 됩니다. 거래. 하지만 트랜잭션 ID의 크기가 제한되어 있으므로(32개) 이 글을 쓰는 시점의 비트) 오랫동안 실행되는 클러스터 (40억 건 이상의 거래)가 어려움을 겪을 것입니다.거래 ID 랩어라운드: XID 카운터 0으로 돌아가고 갑자기 거래가 발생합니다. 과거에는 미래에 있는 것처럼 보였습니다. 즉, 그 결과는 보이지 않게 됩니다. 한마디로 재앙적인 데이터다. 손실. (사실 데이터는 아직 남아있는데 그게 차갑네요. 할 수 없다면 위로가 됩니다.)

이전PostgreSQL7.2, XID 랩어라운드에 대한 유일한 방어는 다시-initdb적어도 40억 건의 거래마다. 물론 이것은 트래픽이 많은 환경에서는 그다지 만족스럽지 않았습니다. 더 나은 솔루션이 고안되었습니다. 새로운 접근 방식을 사용하면 서버가 다음 없이 무기한 작동 상태를 유지할 수 있습니다.initdb또는 모든 종류의 재시작. 는 가격은 유지 관리 요구 사항입니다.데이터베이스의 모든 테이블은 다음과 같아야 합니다. 10억 건의 거래마다 최소 한 번씩 진공 처리됨.

실제로 이는 부담스러운 요구 사항은 아니지만 이후 이를 충족하지 못하면 완전한 데이터가 될 수 있습니다. 손실(디스크 공간 낭비나 성능 저하뿐만 아니라), 일부 토토를 돕기 위해 특별 조항이 만들어졌습니다. 관리자는 마지막 이후의 시간을 추적합니다.진공. 이것의 나머지 섹션에 자세한 내용이 나와 있습니다.

XID 비교에 대한 새로운 접근 방식은 두 가지를 구별합니다. 특수 XID, 숫자 1 및 2(부트스트랩XID그리고FrozenXID). 이 두 XID는 항상 모든 일반 XID보다 오래된 것으로 간주됩니다. 일반 XID( 2보다 큼)은 modulo-2를 사용하여 비교됩니다.31산술. 이는 모든 일반 XID에 대해 다음이 있음을 의미합니다. 20억 개의 XID가 있습니다."나이가 많은"그리고 20억이"최신"; 다르게 말하면 일반 XID 공간은 다음과 같습니다. 끝이 없는 원형. 따라서 행 버전이 일단 특정 일반 XID(행 버전)로 생성되었습니다. 될 것 같습니다"과거에"다음 20억 거래의 경우, 정상 여부에 관계없이 우리가 말하는 XID입니다. 행 버전이 아직 존재하는 경우 20억 개가 넘는 거래 후에 갑자기 미래에 있을 것 같습니다. 데이터 손실을 방지하기 위해 이전 행 버전에는 XID를 다시 할당해야 합니다.FrozenXID언젠가 그들이 도착하기 전에 20억 거래의 오래된 기록입니다. 일단 할당되면 이 특별한 XID는 다음과 같습니다."과거에"모든 일반 거래에 랩어라운드 문제와 관계없이 이러한 행 버전 기간에 관계없이 삭제될 때까지는 괜찮습니다. 이 XID 재할당은에 의해 처리됩니다.진공.

진공의 일반적인 정책은 다음과 같습니다. 재할당FrozenXID모든 행에 10억 건 이상의 거래가 발생한 일반 XID 버전 과거에는. 이 정책은 원래 삽입 XID를 보존합니다. 더 이상 관심이 없을 때까지. (사실, 대부분의 행 버전은 아마도 한 번도 없이 살다가 죽을 것입니다. 존재"냉동".) 이 정책을 사용하면 사이의 최대 안전 간격진공모든 테이블에서 실행되는 것은 정확히 하나입니다. 10억 건의 거래: 더 오래 기다리면 재할당할 만큼 오래되지 않은 행 버전 지난 번 거래는 이제 20억 건이 넘었고 미래로 포장되었습니다. 즉, 당신에게 상실되었습니다. (물론 20억이 더 지나면 다시 등장하겠지만) 거래가 가능하지만 도움이 되지 않습니다.)

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

pg_database에서 datname, 나이(datfrozenxid) 선택;

나이열은 컷오프 XID부터 현재까지의 트랜잭션 수 거래의 XID.

표준 동결 정책에 따르면,나이열은 10억부터 시작됩니다. 새로 비워진 데이터베이스. 때나이20억에 가까워지면 데이터베이스가 필요합니다. 랩 어라운드 실패의 위험을 피하기 위해 다시 진공 청소하십시오. 권장되는 방법은 다음과 같습니다.진공각 토토는 적어도 5억(500 백만) 거래를 통해 충분한 안전을 제공합니다. 여백. 이 규칙을 충족하기 위해 각 토토 전체에서진공다음의 경우 자동으로 경고를 전달합니다. 있어요pg_database항목 표시됨나이1.5 이상 10억 건의 거래 예:

play=# 진공;
경고: 일부 데이터베이스는 1613770184 트랜잭션에서 정리되지 않았습니다.
힌트: 533713463 트랜잭션 내에서 진공 청소기로 청소하는 것이 좋습니다. 그렇지 않으면 랩어라운드 오류가 발생할 수 있습니다.
진공

진공정지옵션은 보다 공격적인 동결을 사용합니다. 정책: 행 버전이 충분히 오래되면 고정됩니다. 모든 공개 거래에서 좋은 것으로 간주됩니다. 특히 만약에 a진공 동결다음에서 수행됩니다. 그렇지 않으면 유휴 데이터베이스인 경우 다음이 보장됩니다.모두행 버전 데이터베이스가 동결됩니다. 따라서 데이터베이스가 있는 한 어떤 식으로든 수정되지 않았으므로 후속 작업이 필요하지 않습니다. 트랜잭션 ID 랩어라운드 문제를 피하기 위해 진공 청소기로 청소합니다. 이 기술은 다음에서 사용됩니다.initdb에 준비하세요템플릿0토토. 그것 사용자가 만든 토토를 준비하는 데에도 사용해야 합니다. 표시해야 할 것dataallowconn = 거짓pg_database, 편리한 게 없으니까 가는 길진공당신이 만든 토토 연결할 수 없습니다. 참고하세요진공의 진공화되지 않은 데이터베이스에 대한 자동 경고 메시지는 무시pg_database다음을 포함한 항목dataallowconn = 거짓, 거짓 경고를 피하기 위해 이러한 데이터베이스에 대해 따라서 이를 보장하는 것은 귀하에게 달려 있습니다 그러한 데이터베이스는 올바르게 고정되어 있습니다.

경고

거래에 대한 안전을 보장하기 위해 랩 어라운드, 진공 청소기로 청소해야 함모든테이블, 포함 시스템 카탈로그, in모든데이터베이스 적어도 10억 건의 거래마다 한 번씩. 우리는 데이터를 보았습니다 사람들이 결정함으로써 발생하는 손실 상황 활성 사용자 테이블을 비우기만 하면 됩니다. 데이터베이스 전체에 진공 명령을 실행하는 대신. 한동안은 괜찮을 것 같습니다.