ใช้งานการกู้คืนช่วงเวลา (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 ขณะสร้างฐานข้อมูลโดยใช้คอนโซล Google Cloud
  • Cloud Firestore จะเริ่มเก็บรักษาเวอร์ชันนับจากจุดนั้นเป็นต้นไปหลังจากเปิดใช้ PITR
  • คุณจะอ่านข้อมูล PITR ในกรอบเวลา PITR ไม่ได้หลังจากปิดใช้ PITR
  • หากคุณเปิดใช้ PITR อีกครั้งทันทีหลังจากปิดใช้ ข้อมูล PITR ที่ผ่านมาจะใช้งานไม่ได้อีกต่อไป ระบบจะลบข้อมูล PITR ที่สร้างขึ้นก่อนปิดใช้ PITR หลังจากวันที่หมดอายุของ PITR
  • หากคุณลบข้อมูลโดยไม่ตั้งใจในช่วง 1 ชั่วโมงที่ผ่านมาและปิดใช้ 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 ดังนี้

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

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

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

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

gcloud firestore databases update\
  [--database=DATABASE_ID; default="(default)"]\
  --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 หรือตัวเชื่อมต่อ FirestoreIO Apache Beam

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

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 อาจเป็นการประทับเวลาที่แม่นยําระดับไมโครวินาทีภายใน 1 ชั่วโมงที่ผ่านมา หรือการประทับเวลาที่แม่นยําระดับนาทีเต็มหลังจาก 1 ชั่วโมงที่ผ่านมา แต่ต้องไม่เร็วกว่า 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 หากไม่มีข้อมูลในการประทับเวลาที่ระบุ ระบบจะแสดงข้อผิดพลาด การประทับเวลาต้องเป็นนาทีเต็ม แม้ว่าเวลาดังกล่าวจะอยู่ใน 1 ชั่วโมงที่ผ่านมาก็ตาม
    • ระบบจะไม่เรียกเก็บเงินจากคุณสำหรับการส่งออก PITR ที่ไม่สําเร็จ
  2. นําเข้าไปยังฐานข้อมูล

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