ใช้งานการกู้คืนช่วงเวลา (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
  • หากต้องการโคลนฐานข้อมูล ให้ใช้สิทธิ์ datastore.databases.clone

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

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

  • คุณจะเริ่มอ่านข้อมูลจาก 7 วันที่ผ่านมาได้ไม่ทันทีหลังจากเปิดใช้ PITR
  • หากต้องการเปิดใช้ PITR เมื่อสร้างฐานข้อมูล คุณต้องใช้คำสั่ง gcloud firestore databases create ระบบไม่รองรับการเปิดใช้ PITR ขณะสร้างฐานข้อมูลโดยใช้คอนโซล Google Cloud
  • 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 - ตั้งค่าเป็นรหัสฐานข้อมูลหรือ `'(default)'`

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

คอนโซล

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

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

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

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

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

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

โคลนจากฐานข้อมูล

คุณสามารถโคลนฐานข้อมูลที่มีอยู่ ณ การประทับเวลาที่เลือกไปยังฐานข้อมูลใหม่ได้โดยทำดังนี้

  • ฐานข้อมูลที่โคลนจะเป็นฐานข้อมูลใหม่ที่สร้างขึ้นในตำแหน่งเดียวกับฐานข้อมูลต้นทาง

    ในการสร้างโคลน Cloud Firestore ใช้ ข้อมูลการกู้คืนช่วงเวลา (PITR) ของฐานข้อมูลต้นทาง ฐานข้อมูลที่โคลนจะมีข้อมูลและดัชนีทั้งหมด

  • โดยค่าเริ่มต้น ฐานข้อมูลที่โคลนจะได้รับการเข้ารหัสในลักษณะเดียวกับฐานข้อมูลต้นทาง โดยใช้การเข้ารหัสเริ่มต้นของ Google หรือ การเข้ารหัส CMEK คุณสามารถระบุประเภทการเข้ารหัสอื่นหรือใช้คีย์อื่นสำหรับการเข้ารหัส CMEK ได้

  • การประทับเวลามีความละเอียดระดับ 1 นาทีและระบุช่วงเวลา ในอดีตภายในระยะเวลาที่กำหนดโดย หน้าต่าง PITR ดังนี้

    • หากเปิดใช้ PITR สำหรับฐานข้อมูล คุณจะเลือกนาทีใดก็ได้ใน 7 วันที่ผ่านมา (หรือน้อยกว่าหากเปิดใช้ PITR ไม่ถึง 7 วัน)
    • หากไม่ได้เปิดใช้ PITR คุณจะเลือกนาทีใดก็ได้ในชั่วโมงที่ผ่านมา
    • คุณสามารถตรวจสอบการประทับเวลาที่เก่าที่สุดที่คุณสามารถเลือกได้ ในคำอธิบายของฐานข้อมูล

คอนโซล

Firebase Console ไม่รองรับการโคลนฐานข้อมูล คุณสามารถใช้ คำแนะนำสำหรับ Google Cloud CLI เพื่อโคลนฐานข้อมูลได้

Google Cloud CLI

gcloud

ใช้คำสั่ง gcloud firestore databases clone เพื่อโคลนฐานข้อมูล

gcloud firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'

แทนที่ข้อมูลต่อไปนี้

  • SOURCE_DATABASE: ชื่อฐานข้อมูลของฐานข้อมูลที่มีอยู่ซึ่งคุณต้องการโคลน ชื่อใช้รูปแบบ projects/PROJECT_ID/databases/SOURCE_DATABASE_ID

  • PITR_TIMESTAMP: การประทับเวลา PITR ในรูปแบบ RFC 3339 ที่มีความละเอียดระดับนาที เช่น 2025-06-01T10:20:00.00Z หรือ 2025-06-01T10:30:00.00-07:00

  • DESTINATION_DATABASE_ID: รหัสฐานข้อมูล สำหรับฐานข้อมูลที่โคลนใหม่ รหัสฐานข้อมูลนี้ต้องไม่เชื่อมโยงกับฐานข้อมูลที่มีอยู่

ตัวอย่าง

gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db'

หากต้องการผูกกับแท็กบางรายการขณะโคลนฐานข้อมูล ให้ใช้คำสั่งก่อนหน้าพร้อมกับแฟล็ก --tags ซึ่งเป็นรายการแท็ก KEY=VALUE ที่ไม่บังคับเพื่อผูก

ตัวอย่าง

gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--tags=key1=value1,key2=value2

โดยค่าเริ่มต้น ฐานข้อมูลที่โคลนจะมีการกำหนดค่าการเข้ารหัสแบบเดียวกับฐานข้อมูลต้นทาง หากต้องการเปลี่ยนการกำหนดค่าการเข้ารหัส ให้ใช้การโต้แย้ง --encryption-type ดังนี้

  • (ค่าเริ่มต้น) use-source-encryption: ใช้การกำหนดค่าการเข้ารหัสแบบเดียวกับฐานข้อมูลต้นทาง
  • google-default-encryption: ใช้การเข้ารหัสเริ่มต้นของ Google
  • customer-managed-encryption: ใช้การเข้ารหัส CMEK ระบุ รหัสคีย์ ในการโต้แย้ง --kms-key-name

ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าการเข้ารหัส CMEK สำหรับฐานข้อมูลที่โคลน

gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'