โซลูชันฐานข้อมูลเก็บถาวร


18

ในการต่อเนื่องกับคำถามที่โพสต์โดยฉันบนมันเป็นความคิดที่ดีที่จะย้ายตารางปริมาณสูงและเข้าถึงอย่างสูงไปยังฐานข้อมูลแยกต่างหากหรือไม่ กำลังมองหาเทคนิค / โซลูชันที่แตกต่างกันสำหรับการเก็บฐานข้อมูลใน PostgreSQL

วิธีแก้ปัญหาเล็กน้อยที่ฉันนึกได้คือ:

  1. การแบ่งตาราง
  2. คั่นพื้นที่ตารางและ / หรือสคีมา
  3. การย้ายระเบียน / ตารางที่เก็บถาวรไปยังฮาร์ดดิสก์อื่น

คำแนะนำ / คำแนะนำ / คำแนะนำอื่น ๆ ยินดีต้อนรับและชื่นชมจริงๆ

หมายเหตุ:เรากำลังเรียกใช้ PostgreSQL v9.1.3 บน CentOS5.2

คำตอบ:


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 ) ;

    หลังจากนั้นเราจะมี 2 ตารางใหม่: public.posts_all (ที่มีคอลัมน์เดียวกันเหมือนในโพสต์) เพื่อค้นหาโพสต์ทั้งหมด (ที่เก็บถาวรและการผลิต) และ public.posts_archive เพื่อค้นหาโพสต์เก็บถาวรทั้งหมด Public.posts จะสืบทอดจาก posts_all
    ส่วนแทรกควรดำเนินการในลักษณะเก่า (ไปยังตาราง public.posts) เว้นแต่คุณจะเขียนทริกเกอร์บน posts_all เพื่อเปลี่ยนเส้นทางแทรกไปยังตารางโพสต์ หากคุณมีการแบ่งพาร์ติชันมันจะซับซ้อนมากขึ้น ด้วยแอปพลิเคชันที่ใช้งานได้และก่อนการโยกย้ายข้อมูลเก่าคุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในรหัสแอปพลิเคชันเพื่อทำงานกับวิธีนี้

  3. สร้างไฟล์เก็บถาวรสกีมาสำหรับการแยกเชิงตรรกะ ข้อเสนอแนะของฉันจะแยกข้อมูลที่เก็บถาวรตามช่วงเวลา (ปีหรือเดือน) ถ้าเป็นไปได้ (archive_2005)

  4. สร้างตารางเก็บถาวรใน archive_year schema

    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 archive_2005 และ postgresql planer จะรู้ว่าข้อมูลมีเฉพาะในช่วงเวลาที่ออกแบบ หากคุณค้นหาตามช่วงเวลาอื่น postgresql จะไม่ค้นหาในตารางนี้

  5. สร้างฟังก์ชั่น / ขั้นตอน / ทริกเกอร์เพื่อย้ายข้อมูลไปยังตารางที่เก็บถาวร

  6. ทำการเก็บถาวรหนึ่งครั้งเป็นระยะเวลา (ปีที่นี่) และดูดตารางเก่าหรือทำมันโดยอัตโนมัติโดยทริกเกอร์ (หนักกว่าใน autovacuum) มีทั้งข้อดีและข้อเสียในทั้งสองเทคนิค

หากดำเนินการ:

  1. สามารถสืบค้นข้อมูลที่เก็บถาวร (เลือก * จาก posts_archive) ทั้งหมด (เลือก * จาก posts_all) และข้อมูลการผลิต (เลือก * จาก public.posts) แยกกัน
  2. สามารถทำแบบแผนการเก็บถาวรการถ่ายโอนข้อมูลแยกต่างหากและวางซ้อนกับพวกเขาในวิธีที่ง่าย pg_dump -s archive_2005 datase_name drop schema archive_2005 cascade; - ระวังเพราะจะลบตารางที่เกี่ยวข้องทั้งหมด
  3. ข้อมูลเก่าที่แยกออกจากกันโดยใช้ tablespace และมีเหตุผลโดย schema
  4. โครงสร้างที่ค่อนข้างซับซ้อนในการจัดการกระบวนการเก็บถาวร
  5. สามารถสร้างดัชนีที่แตกต่างกันในการผลิตและตารางการเก็บถาวรเพื่อเพิ่มประสิทธิภาพการสืบค้นให้กับทั้งสอง (ดัชนีขนาดเล็กและเฉพาะ = แบบสอบถามได้เร็วขึ้นและพื้นที่น้อยกว่าที่จำเป็น)
  6. หากคุณมีตารางการแบ่งพาร์ติชัน (ตามปีหรือเดือน) กระบวนการเก็บถาวรจะเป็นเพียงการย้ายทั้งตารางไปยังarchive_tablespaceหรือเพียงแค่เปลี่ยนเพื่อสืบทอดจาก posts_archive (ฉันไม่ได้ทดสอบสิ่งนี้)
  7. หากคุณไม่ต้องการเข้าถึงข้อมูลเก่า (เก็บถาวร) คุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในแอปพลิเคชัน

นี่เป็นเทคนิคทั่วไปและคุณควรปรับให้เข้ากับความต้องการของคุณ ข้อเสนอแนะเพื่อปรับปรุงนี้?

อ่านเพิ่มเติม: มรดก PostgreSQL , การแบ่ง


Create tables (table posts example):ผมไม่สามารถที่จะเข้าใจได้อย่างชัดเจนขั้นตอนที่ 2 คุณอธิบายได้หรือไม่ว่าขั้นตอนเฉพาะเกี่ยวกับจำนวนตารางทั้งหมดและการสืบทอดระหว่างตารางเกี่ยวข้องกันอย่างไร
Gnanam

แก้ไขคำตอบแล้ว ฉันหวังว่ามันจะเพียงพอที่จะเข้าใจและใช้งานการเก็บถาวร
sufleR

ในแอปพลิเคชันตามเวลาจริงจะมีตารางที่ขึ้นต่อกัน / ลูกเชื่อมต่อ / เกี่ยวข้องมากกว่าหนึ่งตารางกับตารางแม่ / ตารางต้นแบบ ดังนั้นขั้นตอนที่ระบุไว้ที่นี่จึงสามารถใช้กับตารางที่ขึ้นอยู่กับลูกทั้งหมดได้โดยอัตโนมัติ ความเข้าใจของฉันถูกต้องหรือไม่
Gnanam

ใช่. นี่เป็นเพียงตัวอย่างตารางเดียว ฉันใช้สิ่งนี้ในฐานข้อมูล 100GB แต่มีเพียงตารางที่ใหญ่ที่สุดไม่กี่แห่ง
sufleR

ดังนั้นในกรณีนี้ซึ่งตารางจะได้รับตามปกติว่างเปล่า ( posts, posts-allหรือposts-archive) ที่มีอยู่เพียงเพื่อเป็นตัวแทนของชุดข้อมูลทั้งหมด?
Gnanam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.