Veritabanı arşivi çözümleri


18

Benim tarafımdan gönderilen bir sorunun devamı olarak Yüksek hacimli ve yüksek erişimli tabloları ayrı bir veritabanına taşımak iyi bir fikir mi? , PostgreSQL'de veritabanı arşivleme için farklı teknikler / çözümler arıyorum.

Düşünebileceğim birkaç çözüm:

  1. Tablo bölümleme
  2. Ayrı tablo alanı ve / veya şema
  3. Arşivlenmiş kayıtları / tabloları farklı bir sabit diske taşıma

Diğer öneriler / işaretçiler / çözümler gerçekten memnuniyetle karşılanır ve takdir edilir.

NOT: CentOS5.2 üzerinde PostgreSQL v9.1.3 çalıştırıyoruz

Yanıtlar:


13

Arşivleme ile ilgili önerim:

  1. Oluştur archive_tablespace(isterseniz arşivi donanımdan ayırabilirsiniz)
  2. Tablolar oluşturun. Örneğin, tablo yayınlarını arşivlemek istiyoruz.

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

    Bundan sonra 2 yeni tabloya sahip olacağız: tüm yayınları (arşiv ve üretim) sorgulamak için public.posts_all (yazılarda olduğu gibi aynı sütunlarla) ve tüm arşiv yayınlarını sorgulamak için public.posts_archive. Public.posts, posts_all öğesinden devralır.
    Ekleri yazı tablosuna yeniden yönlendirmek için posts_all üzerinde tetikleyiciler yazmazsanız, ekler eski bir şekilde (public.posts tablosuna) gitmelidir. Bölümleme varsa daha karmaşık olacaktır. Çalışan uygulama ve eski veri taşıma işleminden önce, bu yaklaşımla çalışmak için uygulama kodundaki hiçbir şeyi değiştirmeniz gerekmez.

  3. Mantıksal ayırma için şema arşivi oluşturun. Benim önerim, arşiv verilerini mümkünse bir süre (yıl veya ay) ayırmak olacaktır (archive_2005).

  4. Archive_year şemasında arşiv tabloları oluşturma

    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;

    Bundan sonra, şema arşivi_2005'te yeni tablo yayınlarına sahip olacaksınız ve postgresql planlayıcısı, verilerin sadece tasarlanan zaman diliminde olduğunu bilecektir. Başka bir zaman dilimine göre sorgu yaparsanız postgresql bu tabloda arama yapmaz.

  5. Verileri arşiv tablolarına taşımak için işlevler / prosedürler / tetikleyiciler oluşturun.

  6. Bir süre (burada yıl) bir kez arşivleyin ve eski tabloyu vakumlayın veya tetikleyicilerle otomatik olarak yapın (otomatik vakumda daha ağır). Her iki teknikte de birçok avantaj ve dezavantaj vardır.

Uygulanırsa:

  1. Arşivi (posts_archive'dan * seçin), tümü (posts_all'dan * seçin) ve üretim (public.posts'tan * seçin) verilerini ayrı ayrı sorgulayabilir
  2. Arşiv şemalarını ayrı ayrı dökebilir ve bunlara kolay bir şekilde kademeli olarak bırakabilirsiniz. pg_dump -s archive_2005 datase_name bırakma şeması archive_2005 basamaklı; - dikkatli olun çünkü ilgili tüm tabloları kaldırır
  3. Eski veriler fiziksel olarak tablo alanı ve mantıksal olarak şema ile ayrılmıştır.
  4. Arşivleme sürecini yönetmek için oldukça karmaşık bir yapı
  5. Sorguları her ikisine göre optimize etmek için üretim ve arşiv tablolarında farklı dizinler oluşturabilir (daha küçük ve özel dizinler = daha hızlı sorgular ve daha az alan gerekir)
  6. Bölümlenmiş tablolarınız varsa (yıl veya aya göre) arşivleme işlemi sadece tüm tabloyu taşımak archive_tablespaceveya sadece posts_archive'den devralmak için değiştirmek olacaktır (Bunu test etmedim)
  7. Eski (arşivlenmiş) verilere erişmek istemiyorsanız, uygulamada hiçbir şeyi değiştirmeniz gerekmez.

Bu genel bir tekniktir ve ihtiyaçlarınıza göre uyarlamanız gerekir. Bunu geliştirmek için herhangi bir öneriniz var mı?

İlave okumalar: PostgreSQL mirası , bölümleme


2. adımı net bir şekilde anlayamadım Create tables (table posts example):. Toplamda kaç tablonun bulunduğuna ve tablolar arasındaki mirasın birbiriyle nasıl ilişkili olduğuna dair özel bir adım açıklayabilir misiniz?
Gnanam

Düzenlenmiş cevap. Umarım arşivlemeyi anlamak ve uygulamak yeterlidir.
sufleR

Gerçek zamanlı uygulamada, üst / ana tabloyla bağlantılı / ilişkili birden fazla bağımlı / alt tablo olacaktır. Burada özetlenen adımlar otomatik olarak tüm bağımlı / alt tablolarına da uygulanabilir mi? Anlayışım doğru mu?
Gnanam

Evet. Bu sadece bir tablo örneğidir. Bu 100GB veritabanında uyguladım ama sadece birkaç büyük tablo için.
sufleR

Yani bu durumda, hangi tablo normalde boş (edilecektir posts, posts-allya posts-archive, o tüm veri setini temsil etmek sadece var)?
Gnanam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.