ใช้งานการกู้คืนช่วงเวลา (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
    • เวลาของเวอร์ชันที่เร็วที่สุด: การประทับเวลาแรกสุดที่เวอร์ชันเก่าของ อ่านข้อมูลได้ในหน้าต่าง 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)}
  )

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

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

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