ใช้งานการกู้คืนช่วงเวลา (PITR)

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

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

สิทธิ์

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

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

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

  • หากต้องการเปิดใช้ PITR เมื่อสร้างฐานข้อมูล ให้ทำดังนี้ datastore.databases.create
  • หากต้องการอัปเดตการตั้งค่า PITR ในฐานข้อมูลที่มีอยู่ ให้ทำดังนี้ datastore.databases.updatedatastore.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 ขณะ สร้างฐานข้อมูลโดยใช้ Google Cloud Console
  • 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 ให้ไปที่หน้าฐานข้อมูล

    ไปที่ฐานข้อมูล

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

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

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

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

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

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

gcloud

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

gcloud firestore databases create\
  --location=LOCATION\
  --database=DATABASE_ID\
  --type=firestore-native\
  --enable-pitr

แทนที่ค่าดังนี้

  • LOCATION - ตำแหน่งที่คุณต้องการสร้างฐานข้อมูล
  • DATABASE_ID - ตั้งค่าเป็นรหัสฐานข้อมูล

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

gcloud firestore databases update\
  --database=DATABASE_ID\
  --no-enable-pitr

แทนที่ค่าดังนี้

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

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

คอนโซล

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

    ไปที่ฐานข้อมูล

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

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

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

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

gcloud

เรียกใช้คำสั่ง gcloud firestore databases describe ดังนี้

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/DATABASE_ID
    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 Beam ของ 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)}
);

REST API

ระบบรองรับการอ่าน 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

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

การอ่าน PITR ได้รับการรองรับในวิธีการอ่านต่อไปนี้ของCloud FirestoreIO Connector วิธีการอ่านเหล่านี้รองรับ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. นำเข้าไปยังฐานข้อมูล

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