ทำงานกับการกู้คืนช่วงเวลา (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:

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

เปิดใช้งาน PITR

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

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

คอนโซล

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

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

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

  3. ในเมนูนำทาง คลิก Disaster Recovery

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

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

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

หากต้องการปิดใช้ PITR ให้ล้างช่องทำเครื่องหมาย เปิดใช้การกู้คืนช่วงเวลา จากหน้า Disaster Recovery ในคอนโซล 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 - ตั้งค่าเป็น ID ฐานข้อมูลหรือ (ค่าเริ่มต้น)
  • TYPE - ตั้งค่าเป็น firestore-native

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

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

แทนที่ค่าดังต่อไปนี้:

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

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

คอนโซล

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

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

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

  3. ในเมนูนำทาง คลิก Disaster Recovery

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

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

gcloud

รัน ฐานข้อมูล gcloud firestore อธิบาย คำสั่งดังนี้:

gcloud firestore databases describe --database=DATABASE_ID

แทนที่ DATABASE_ID ด้วย 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 ถูกเก็บรักษาไว้เป็นมิลลิวินาที ค่าอาจเป็นหนึ่งชั่วโมงเมื่อปิดใช้งาน PITR หรือเจ็ดวันหากเปิดใช้งาน PITR

อ่านข้อมูล PITR

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

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

ชวา

คุณต้องใช้ธุรกรรม 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

การอ่าน PITR ได้รับการสนับสนุนในวิธีการอ่าน Cloud Firestore ทั้งหมด ซึ่งได้แก่ get , list , battGet , listCollectionIds , listDocuments , runQuery , runAggregationQuery และ partitionQuery

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

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

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

อาปาเช่ บีม

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

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

ชวา

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

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