데이터베이스 아카이브 솔루션


18

나에 의해 게시 된 질문에 계속해서 대량 액세스 테이블을 별도의 데이터베이스로 옮기는 것이 좋은 생각입니까? PostgreSQL에서 데이터베이스 아카이빙에 사용할 수있는 다양한 기술 / 솔루션을 찾고 있습니다.

내가 생각할 수있는 몇 가지 해결책은 다음과 같습니다.

  1. 테이블 파티셔닝
  2. 별도의 테이블 스페이스 및 / 또는 스키마
  3. 보관 된 레코드 / 테이블을 다른 하드 디스크로 이동

다른 제안 / 포인터 / 솔루션은 정말 환영 받고 감사합니다.

참고 : CentOS5.2에서 PostgreSQL v9.1.3을 실행하고 있습니다.

답변:


13

보관에 대한 제안 :

  1. 작성 archive_tablespace(아카이브에서 하드웨어를 분리 할 수있는 경우)
  2. 테이블을 만듭니다. 예를 들어 테이블 게시물을 보관하려고합니다.

    create table  posts_all ( LIKE public.posts)  ;
    create table  posts_archive () inherits  ( public.posts_all)  ;
    alter table  public.posts  inherits ( public.posts_all ) ;

    그런 다음 모든 게시물 (아카이브 및 프로덕션)을 쿼리하는 public.posts_all (게시물과 같은 열이있는) 및 모든 아카이브 게시물을 쿼리하는 public.posts_archive라는 두 개의 새 테이블이 생깁니다. Public.posts는 posts_all에서 상속됩니다.
    삽입물을 게시물 테이블로 리디렉션하기 위해 posts_all에 트리거를 작성하지 않는 한 삽입물은 오래된 방법으로 (public.posts 테이블로) 이동해야합니다. 파티셔닝이 있다면 더 복잡해집니다. 응용 프로그램 작동 및 이전 데이터 마이그레이션 전에는이 방법으로 작업하기 위해 응용 프로그램 코드를 변경할 필요가 없습니다.

  3. 논리적 분리를위한 스키마 아카이브를 작성하십시오. 가능하다면 일정 기간 (년 또는 월) (archive_2005)으로 아카이브 데이터를 분리하는 것이 좋습니다.

  4. archive_year 스키마에서 아카이브 테이블 작성

    create table archive_2005.posts (
      check(record_date >= '2005-01-01 00:00:00'::timestamp 
        and record_date <  '2006-01-01 00:00:00'::timestamp)
    ) inherits (posts_archive) tablespace archive_tablesapce;

    그런 다음 schema_2005 스키마에 새 테이블 게시물이 있고 postgresql 플래너는 데이터가 설계된 기간에만 있음을 알게됩니다. 다른 기간으로 쿼리하면 postgresql이이 테이블에서 검색하지 않습니다.

  5. 함수 / 프로 시저 / 트리거를 작성하여 데이터를 아카이브 테이블로 이동하십시오.

  6. 일정 기간 (여기)에 한 번 보관하고 오래된 테이블을 진공 청소기로 청소하거나 트리거 (자동 진공에서 더 무거움)로 자동 보관하십시오. 두 기술에는 많은 장점과 단점이 있습니다.

구현 된 경우 :

  1. 보관 (select * from posts_archive), 모두 (select * from posts_all) 및 생산 (select * from public.posts) 데이터를 별도로 쿼리 할 수 ​​있습니다.
  2. 아카이브 스키마를 개별적으로 덤프하고 캐스케이드를 쉽게 드롭 할 수 있습니다. pg_dump -s archive_2005 datase_name 드롭 스키마 archive_2005 캐스케이드; -모든 관련 테이블을 제거하므로주의하십시오
  3. 이전 데이터는 테이블 스페이스와 스키마로 논리적으로 분리됩니다.
  4. 아카이빙 프로세스를 관리하기위한 매우 복잡한 구조
  5. 프로덕션 및 아카이브 테이블에서 서로 다른 인덱스를 생성하여 쿼리를 둘 다에 맞게 최적화 할 수 있습니다 (작고 특수한 인덱스 = 더 빠른 쿼리 및 적은 공간 필요)
  6. 분할 된 테이블 (연도 또는 월별로)이있는 경우 아카이브 프로세스는 전체 테이블을 이동 archive_tablespace하거나 posts_archive에서 상속하도록 변경하는 것입니다 (테스트하지 않았습니다)
  7. 오래된 (아카이브 된) 데이터에 액세스하지 않으려는 경우 응용 프로그램에서 아무것도 변경하지 않아도됩니다.

이것은 일반적인 기술이므로 필요에 맞게 조정해야합니다. 이를 개선하기위한 제안 사항이 있습니까?

추가 읽기 : PostgreSQL 상속 , 파티셔닝


2 단계를 명확하게 이해할 수 없었습니다 Create tables (table posts example):. 총 테이블 수와 테이블 간 상속이 서로 관련되어있는 특정 단계를 설명 할 수 있습니까?
Gnanam

수정 된 답변. 아카이빙을 이해하고 구현하기에 충분하기를 바랍니다.
sufleR

실시간 응용 프로그램에는 부모 / 마스터 테이블과 연결 / 관련된 둘 이상의 종속 / 자식 테이블이 있습니다. 따라서 여기에 설명 된 단계는 모든 종속 / 자식 테이블에도 자동으로 적용됩니까? 이해가 정확합니까?
Gnanam

예. 이것은 하나의 테이블 예입니다. 나는 이것을 100GB 데이터베이스로 구현했지만 가장 큰 테이블에 대해서만 사용했습니다.
sufleR

따라서이 경우 전체 데이터 세트를 나타 내기 위해 존재 하는 테이블이 일반적으로 비어있는 ( posts, posts-all또는 posts-archive) 무엇입니까?
Gnanam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.