ทำงานกับการกู้คืนช่วงเวลา (PITR)

หน้านี้จะอธิบายวิธีใช้การกู้คืนช่วงเวลา (PITR) เพื่อเก็บรักษาและกู้คืนข้อมูลใน Cloud Firestore

หากต้องการทำความเข้าใจแนวคิดของ PITR โปรดดูการกู้คืนช่วงเวลา

สิทธิ์

หากต้องการรับสิทธิ์ที่จำเป็นต่อการจัดการการตั้งค่า PITR โปรดขอให้ผู้ดูแลระบบมอบบทบาท IAM ต่อไปนี้ในโปรเจ็กต์ที่คุณต้องการเปิดใช้ PITR

  • เจ้าของ Cloud Datastore (roles/datastore.owner)

สำหรับบทบาทที่กำหนดเอง โปรดตรวจสอบว่าได้ให้สิทธิ์ต่อไปนี้แล้ว

  • วิธีเปิดใช้ PITR เมื่อสร้างฐานข้อมูล datastore.databases.create
  • วิธีอัปเดตการตั้งค่า PITR ในฐานข้อมูลเดิม: datastore.databases.update,datastore.databases.list
  • หากต้องการอ่านจากข้อมูล PITR: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • วิธีส่งออกข้อมูล PITR: datastore.databases.export
  • วิธีนำเข้าข้อมูล PITR: datastore.databases.import

ก่อนเริ่มต้น

โปรดทราบประเด็นต่อไปนี้ก่อนที่จะเริ่มใช้ PITR

  • คุณไม่สามารถเริ่มอ่านจาก 7 วันที่ผ่านมาได้ทันทีหลังจากเปิดใช้ PITR
  • หากต้องการเปิดใช้ PITR เมื่อสร้างฐานข้อมูล คุณต้องใช้คำสั่ง gcloud firestore databases create ระบบไม่รองรับการเปิดใช้ PITR ขณะสร้างฐานข้อมูลโดยใช้คอนโซล GCP
  • Cloud Firestore เริ่มเก็บเวอร์ชันนับจากจุดนั้นเป็นต้นไปหลังจากเปิดใช้ PITR
  • คุณไม่สามารถอ่านข้อมูล PITR ในหน้าต่าง PITR ได้หลังจากที่ปิดใช้งาน PITR
  • ถ้าคุณเปิดใช้งาน PITR อีกครั้งทันที หลังจากปิดใช้งาน ข้อมูล PITR ที่ผ่านมา จะใช้งานไม่ได้อีกต่อไป ข้อมูล PITR ใดๆ ที่สร้างขึ้นก่อนปิดใช้งาน PITR จะถูกลบหลังจากวันที่หมดอายุ PITR
  • หากคุณลบข้อมูลไปโดยบังเอิญในชั่วโมงที่ผ่านมาและปิดใช้งาน PITR ไว้ คุณสามารถกู้คืนข้อมูลได้โดยเปิดใช้ PITR ภายใน 1 ชั่วโมงหลังจากลบ
  • การอ่านข้อมูล PITR ที่หมดอายุแล้วล้มเหลว

เปิดใช้งาน PITR

ก่อนใช้ PITR ให้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Google Cloud มีเพียงโปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่จะใช้ฟังก์ชัน PITR ได้

หากต้องการเปิดใช้งาน PITR สำหรับฐานข้อมูลของคุณ ให้ทำดังนี้

คอนโซล

  1. ในคอนโซล Google Cloud Platform ให้ไปที่หน้าฐานข้อมูล

    ไปที่ Databases

  2. เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล

  3. ในเมนูการนำทาง ให้คลิก การกู้ข้อมูลคืนหลังจากภัยพิบัติ

  4. คลิกแก้ไขเพื่อแก้ไขการตั้งค่า

  5. เลือกช่องทำเครื่องหมายเปิดใช้การกู้คืนช่วงเวลา แล้วคลิกบันทึก

การเปิดใช้ PITR จะมีค่าใช้จ่ายในการจัดเก็บ ดูข้อมูลเพิ่มเติมได้ที่ราคา

หากต้องการปิดใช้ PITR ให้ยกเลิกการเลือกช่องทำเครื่องหมายเปิดใช้การกู้คืนช่วงเวลาจากหน้าการกู้ข้อมูลคืนหลังจากภัยพิบัติในคอนโซล GCP

gcloud

เปิดใช้ PITR ระหว่างการสร้างฐานข้อมูลด้วยคำสั่ง gcloud firestore databases create ดังนี้

gcloud firestore databases create\
  --location=LOCATION\
  [--database=DATABASE_ID; default="(default)"]\
  [--type=TYPE; default="firestore-native"]\
  --enable-pitr

แทนที่ค่าต่อไปนี้

  • Location - ตำแหน่งที่คุณต้องการสร้างฐานข้อมูล
  • DATABASE_ID - ตั้งค่าเป็นรหัสฐานข้อมูลหรือ (ค่าเริ่มต้น)
  • TYPE - ตั้งค่าเป็นต้นทางของ Firestore

คุณปิดใช้ PITR ได้โดยใช้คำสั่ง gcloud firestore databases update ดังนี้

gcloud firestore databases update\
  [--database=DATABASE_ID; default="(default)"]\
  --no-enable-pitr

แทนที่ค่าต่อไปนี้

  • DATABASE_ID - ตั้งค่าเป็นรหัสฐานข้อมูลหรือ (ค่าเริ่มต้น)

ดูระยะเวลาเก็บรักษาและเวลาของเวอร์ชันแรกสุด

คอนโซล

  1. ในคอนโซล Google Cloud Platform ให้ไปที่หน้าฐานข้อมูล

    ไปที่ Databases

  2. เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล

  3. ในเมนูการนำทาง ให้คลิก การกู้ข้อมูลคืนหลังจากภัยพิบัติ

  4. ในส่วนการตั้งค่า ให้จดบันทึกระยะเวลาเก็บรักษาและเวลาของเวอร์ชันแรกสุด

    • ระยะเวลาเก็บรักษา: ระยะเวลาที่ Cloud Firestore เก็บรักษาข้อมูลทุกเวอร์ชันสำหรับฐานข้อมูล ค่าคือ 1 ชั่วโมงเมื่อปิดใช้ PITR และเมื่อเปิดใช้ PITR เป็นเวลา 7 วัน
    • เวลาของเวอร์ชันที่เร็วที่สุด: การประทับเวลาแรกสุดที่อ่านข้อมูลเวอร์ชันเก่าๆ ได้ในหน้าต่าง PITR Cloud Firestore จะอัปเดตค่านี้อย่างต่อเนื่องและจะไม่มีการอัปเดตอีกต่อไปเมื่อมีการค้นหา หากคุณใช้ค่านี้เพื่อกู้คืนข้อมูล อย่าลืมพิจารณาระยะเวลานับตั้งแต่เวลาที่ค้นหาค่านี้จนถึงตอนที่เริ่มกู้คืนข้อมูล
    • การกู้คืนช่วงเวลา: แสดง Enabled หากเปิดใช้ PITR หาก PITR ปิดอยู่ คุณจะเห็น Disabled

gcloud

เรียกใช้คำสั่ง gcloudfirestoreฐานข้อมูลs description ดังนี้

gcloud firestore databases describe --database=DATABASE_ID

แทนที่ DATABASE_ID ด้วยรหัสฐานข้อมูลหรือ default

เอาต์พุตมีดังนี้

    appEngineIntegrationMode: ENABLED
    concurrencyMode: PESSIMISTIC
    createTime: '2021-03-24T17:02:35.234Z'
    deleteProtectionState: DELETE_PROTECTION_DISABLED
    earliestVersionTime: '2023-06-12T16:17:25.222474Z'
    etag: IIDayqOevv8CMNTvyNK4uv8C
    keyPrefix: s
    locationId: nam5
    name: projects/PROJECT_ID/databases/(default)
    pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
    type: FIRESTORE_NATIVE
    uid: 5230c382-dcd2-468f-8cb3-2a1acfde2b32
    updateTime: '2021-11-17T17:48:22.171180Z'
    versionRetentionPeriod: 3600s

ที่ไหน

  • earliestVersionTime - การประทับเวลาของข้อมูล PITR ที่จัดเก็บแรกสุด
  • pointInTimeRecoveryEnablement: แสดง POINT_IN_TIME_RECOVERY_ENABLED หากเปิดใช้ PITR หาก PITR ปิดอยู่ คุณอาจเห็น POINT_IN_TIME_RECOVERY_DISABLED หรือช่อง pointInTimeRecoveryEnablement อาจไม่แสดง
  • versionRetentionPeriod - ระยะเวลาที่เก็บรักษาข้อมูล PITR ในหน่วยมิลลิวินาที ค่าเป็น 1 ชั่วโมงเมื่อปิดใช้ PITR หรืออาจเป็นเวลา 7 วันหากเปิดใช้ PITR

อ่านข้อมูล PITR

คุณอ่านข้อมูล PITR ได้โดยใช้ไลบรารีของไคลเอ็นต์, เมธอด REST API หรือเครื่องมือเชื่อมต่อ Apacheบีมของ FirestoreIO

ไลบรารีของไคลเอ็นต์

Java

คุณต้องใช้ธุรกรรม ReadOnly เพื่ออ่านข้อมูล PITR คุณไม่สามารถระบุ readTime โดยตรงในการอ่าน โปรดดูข้อมูลเพิ่มเติมที่ธุรกรรมและการเขียนแบบกลุ่ม

  Firestore firestore = …

  TransactionOptions options =
          TransactionOptions.createReadOnlyOptionsBuilder()
              .setReadTime(
                  com.google.protobuf.Timestamp.newBuilder()
                      .setSeconds(1684098540L)
                      .setNanos(0))
              .build();

  ApiFuture<Void> futureTransaction = firestore.runTransaction(
              transaction -> {
                // Does a snapshot read document lookup
                final DocumentSnapshot documentResult =
                    transaction.get(documentReference).get();

                // Executes a snapshot read query
                final QuerySnapshot queryResult =
                  transaction.get(query).get();
              },
              options);

  // Blocks on transaction to complete
  futureTransaction.get();

โหนด

คุณต้องใช้ธุรกรรม ReadOnly เพื่ออ่านข้อมูล PITR คุณไม่สามารถระบุ readTime โดยตรงในการอ่าน โปรดดูข้อมูลเพิ่มเติมที่ธุรกรรมและการเขียนแบบกลุ่ม

  const documentSnapshot = await firestore.runTransaction(
    updateFunction => updateFunction.get(documentRef),
    {readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);

  const querySnapshot = await firestore.runTransaction(
    updateFunction => updateFunction.get(query),
    {readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
  )

API ของ REST

การอ่าน PITR ใช้ได้ในวิธีการอ่านของ Cloud Firestore ทั้งหมด ได้แก่ get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery และ partitionQuery

หากต้องการอ่านโดยใช้เมธอด REST ให้ลองใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้

  1. ในคำขอวิธีการอ่านของคุณ ให้ส่งค่า readTime เป็นการประทับเวลา PITR ที่รองรับในเมธอด readOptions การประทับเวลา PITR อาจเป็นการประทับเวลาที่มีความแม่นยำระดับไมโครวินาทีภายในชั่วโมงที่ผ่านมาหรือการประทับเวลาแบบเต็มนาทีหลังจากชั่วโมงที่ผ่านมา แต่ต้องไม่มาก่อน earliestVersionTime

  2. ใช้พารามิเตอร์ readTime ร่วมกับเมธอด BeginTransaction เป็นส่วนหนึ่งของธุรกรรม ReadOnly สำหรับการอ่าน PITR หลายรายการ

Apache Beam

ใช้เครื่องมือเชื่อมต่อ Apache Beam ใน Cloud FirestoreIO เพื่ออ่านหรือเขียนเอกสารในฐานข้อมูล Cloud Firestore จำนวนมากด้วย Dataflow

การอ่าน PITR ได้รับการสนับสนุนในวิธีการอ่านต่อไปนี้ของเครื่องมือเชื่อมต่อ Cloud FirestoreIO วิธีการอ่านเหล่านี้รองรับเมธอด withReadTime(@Nullable Instant readTime) ที่คุณใช้สำหรับอ่าน PITR ได้

Java

โค้ดต่อไปนี้ใช้ได้กับโค้ดไปป์ไลน์ Dataflow สำหรับการดำเนินการอ่านหรือเขียนแบบกลุ่ม ตัวอย่างนี้ใช้เมธอด withReadTime(@Nullable Instant readTime) สำหรับการอ่าน PITR

  Instant readTime = Instant.ofEpochSecond(1684098540L);

  PCollection<Document> documents =
      pipeline
          .apply(Create.of(collectionId))
          .apply(
              new FilterDocumentsQuery(
                  firestoreOptions.getProjectId(), firestoreOptions.getDatabaseId()))
          .apply(FirestoreIO.v1().read().runQuery().withReadTime(readTime).withRpcQosOptions(rpcQosOptions).build())
  ...

ดูรายการตัวอย่าง readTime ทั้งหมดในไปป์ไลน์ Dataflow ได้ที่ที่เก็บของ GitHub

ส่งออกและนำเข้าจากข้อมูล PITR

คุณส่งออกฐานข้อมูลไปยัง Cloud Storage จากข้อมูล PITR ได้โดยใช้คำสั่ง gcloud firestore export คุณส่งออกข้อมูล PITR ได้โดยการประทับเวลาจะเป็นเวลาเต็มนาทีภายใน 7 วันที่ผ่านมา แต่ต้องไม่เร็วกว่า earliestVersionTime หากไม่มีข้อมูลอยู่ในการประทับเวลาที่ระบุแล้ว การส่งออกจะล้มเหลว

การดำเนินการส่งออก PITR สนับสนุนตัวกรองทั้งหมด รวมถึงการส่งออกเอกสารทั้งหมด และการส่งออกคอลเล็กชันที่ระบุ

  1. ส่งออกฐานข้อมูล โดยระบุพารามิเตอร์ snapshot-time ไปยังการประทับเวลาการกู้คืนที่ต้องการ

    gcloud

    เรียกใช้คำสั่งต่อไปนี้เพื่อส่งออกฐานข้อมูลไปยังที่เก็บข้อมูล

    gcloud firestore export gs://[BUCKET_NAME_PATH] \
        --snapshot-time=[PITR_TIMESTAMP] \
        --collection-ids=[COLLECTION_IDS] \
        --namespace-ids=[NAMESPACE_IDS]
    

    ที่ไหน

    • BUCKET_NAME_PATH - ที่เก็บข้อมูล Cloud Storage ที่ถูกต้องซึ่งมีคำนำหน้าเส้นทางที่ไม่บังคับซึ่งเก็บไฟล์ส่งออก
    • PITR_TIMESTAMP - การประทับเวลา PITR ที่ระดับรายละเอียดนาที เช่น 2023-05-26T10:20:00.00Z หรือ 2023-10-19T10:30:00.00-07:00
    • COLLECTION_IDS - รายการรหัสคอลเล็กชันหรือรหัสกลุ่มคอลเล็กชัน เช่น 'specific collection group1','specific collection group2'
    • NAMESPACE_IDS - รายการรหัสเนมสเปซ เช่น 'customer','orders'

    โปรดทราบจุดต่อไปนี้ก่อนส่งออกข้อมูล PITR

    • ระบุการประทับเวลาในรูปแบบ RFC 3339 เช่น 2023-05-26T10:20:00.00Z หรือ 2023-10-19T10:30:00.00-07:00
    • ตรวจสอบว่าการประทับเวลาที่ระบุเป็นการประทับเวลาแบบเต็มนาทีภายในช่วง 7 วันที่ผ่านมา แต่ต้องไม่เร็วกว่า earliestVersionTime หากไม่มีข้อมูลในการประทับเวลาที่ระบุแล้ว จะเกิดข้อผิดพลาดขึ้น การประทับเวลาต้องเป็นแบบเต็มนาที แม้ว่าเวลาที่ระบุจะอยู่ในช่วงชั่วโมงที่ผ่านมาก็ตาม
    • ระบบจะไม่เรียกเก็บเงินสำหรับการส่งออก PITR ที่ล้มเหลว
  2. นำเข้าไปยังฐานข้อมูล

    ทำตามขั้นตอนในนำเข้าเอกสารทั้งหมดเพื่อนำเข้าฐานข้อมูลที่ส่งออก ถ้ามีเอกสารในฐานข้อมูลอยู่แล้ว เอกสารนั้นจะถูกเขียนทับ