หน้านี้อธิบายวิธีใช้การกู้คืนช่วงเวลา (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 - วิธีโคลนฐานข้อมูล
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 สำหรับฐานข้อมูล
คอนโซล
ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล
เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล
ในเมนูการนำทาง ให้คลิกการกู้คืนจากภัยพิบัติ
คลิกแก้ไขเพื่อแก้ไขการตั้งค่า
เลือกช่องทำเครื่องหมายเปิดใช้การกู้คืนช่วงเวลา แล้วคลิกบันทึก
การเปิดใช้ 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- ตั้งค่าเป็นรหัสฐานข้อมูลหรือ (ค่าเริ่มต้น)
รับระยะเวลาเก็บรักษาและเวลาของเวอร์ชันแรกสุด
คอนโซล
ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล
เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล
ในเมนูการนำทาง ให้คลิกการกู้คืนจากภัยพิบัติ
ในส่วนการตั้งค่า ให้จดระยะเวลาเก็บรักษาและเวลาของเวอร์ชันที่เก่าที่สุด
- ระยะเวลาเก็บรักษา: ระยะเวลาที่ 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 ให้ลองใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
ในคำขอเมธอดอ่าน ให้ส่งค่า
readTimeเป็นการประทับเวลา PITR ที่รองรับในเมธอดreadOptionsการประทับเวลา PITR อาจเป็นการประทับเวลาที่มีความแม่นยำระดับไมโครวินาทีภายในชั่วโมงที่ผ่านมา หรือการประทับเวลาระดับนาทีเต็มที่เกินชั่วโมงที่ผ่านมา แต่ต้องไม่เร็วกว่าearliestVersionTimeใช้พารามิเตอร์
readTimeร่วมกับเมธอดBeginTransactionเป็นส่วนหนึ่งของReadOnlyธุรกรรมสำหรับการอ่าน PITR หลายรายการ
Apache Beam
ใช้Cloud Firestoreเครื่องมือเชื่อมต่อ IO Apache Beam เพื่ออ่านหรือเขียนเอกสารในCloud Firestoreฐานข้อมูลที่ขนาดใหญ่ด้วย Dataflow
การอ่าน PITR ได้รับการรองรับในวิธีการอ่านต่อไปนี้ของCloud FirestoreIO Connector วิธีการอ่านเหล่านี้รองรับwithReadTime(@Nullable Instant readTime)วิธีการที่คุณใช้สำหรับ PITR reads ดังนี้
- FirestoreV1.BatchGetDocuments
- FirestoreV1.ListCollectionIds
- FirestoreV1.ListDocuments
- FirestoreV1.PartitionQuery
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 ไม่รองรับการโคลนฐานข้อมูล คุณใช้ วิธีการสำหรับ 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_IDPITR_TIMESTAMP: a PITR timestamp in the RFC 3339 format, at minute granularity. เช่น
2025-06-01T10:20:00.00Zหรือ2025-06-01T10:30:00.00-07:00DESTINATION_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: ใช้การเข้ารหัสเริ่มต้นของ Googlecustomer-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'
Firebase CLI
ใช้คำสั่ง firebase firestore:databases:clone เพื่อโคลนฐานข้อมูล
firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'
แทนที่ค่าต่อไปนี้
SOURCE_DATABASE: ชื่อฐานข้อมูลของฐานข้อมูลที่มีอยู่ซึ่งคุณต้องการโคลน ชื่อใช้รูปแบบ
projects/PROJECT_ID/databases/SOURCE_DATABASE_IDDESTINATION_DATABASE: ชื่อฐานข้อมูล สำหรับฐานข้อมูลที่โคลนใหม่ ชื่อใช้รูปแบบ
projects/PROJECT_ID/databases/DESTINATION_DATABASE_IDชื่อฐานข้อมูลนี้ต้องไม่เชื่อมโยงกับฐานข้อมูลที่มีอยู่PITR_TIMESTAMP: a PITR timestamp in the RFC 3339 format, at minute granularity. เช่น
2025-06-01T10:20:00.00Zหรือ2025-06-01T10:30:00.00-07:00หากไม่ได้ระบุ สแนปชอตที่เลือกจะเป็นเวลาปัจจุบัน โดยปัดเศษลงเป็นนาที
โดยค่าเริ่มต้น ฐานข้อมูลที่โคลนจะมีค่ากำหนดการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง หากต้องการเปลี่ยนการกำหนดค่าการเข้ารหัส ให้ใช้อาร์กิวเมนต์
--encryption-type
- (ค่าเริ่มต้น)
USE_SOURCE_ENCRYPTION: ใช้การกำหนดค่าการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง GOOGLE_DEFAULT_ENCRYPTION: ใช้การเข้ารหัสเริ่มต้นของ GoogleCUSTOMER_MANAGED_ENCRYPTION: ใช้การเข้ารหัส CMEK ระบุ รหัสคีย์ ในอาร์กิวเมนต์--kms-key-name
ตัวอย่างต่อไปนี้แสดงวิธีกําหนดค่าการเข้ารหัส CMEK สําหรับฐานข้อมูลที่โคลน
firebase firestore:databases:clone \
'projects/example-project/databases/(default)' \
'projects/example-project/databases/example-dest-db' \
--snapshot-time 'PITR_TIMESTAMP' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION
ข้อจำกัด
การดำเนินการโคลนจะไม่โคลนApp Engineข้อมูลการค้นหาหรือเอนทิตี Blob จากฐานข้อมูล (default) ข้อมูลนี้ใช้ได้กับฐานข้อมูล (default) เท่านั้น และจะใช้ไม่ได้หากคุณโคลนจาก (default) ไปยังฐานข้อมูลที่ไม่รองรับข้อมูลดังกล่าว จึงมีการยกเว้นข้อมูลนี้จากการโคลน
ส่งออกและนำเข้าจากข้อมูล PITR
คุณสามารถส่งออกฐานข้อมูลไปยัง Cloud Storage จากข้อมูล PITR
โดยใช้คำสั่ง gcloud firestore export คุณสามารถส่งออกข้อมูล PITR ที่การประทับเวลาเป็นแบบเต็มนาทีภายใน
7 วันที่ผ่านมา แต่ไม่เร็วกว่าวันที่ earliestVersionTime หากข้อมูลไม่มีอยู่อีกต่อไปที่การประทับเวลาที่ระบุ การดำเนินการส่งออกจะล้มเหลว
การดำเนินการส่งออก PITR รองรับตัวกรองทั้งหมด รวมถึงการส่งออกเอกสารทั้งหมดและการส่งออกคอลเล็กชันที่เฉพาะเจาะจง
ส่งออกฐานข้อมูลโดยระบุพารามิเตอร์
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:00COLLECTION_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 ที่ไม่สำเร็จ
นำเข้าไปยังฐานข้อมูล
ทำตามขั้นตอนในนำเข้าเอกสารทั้งหมดเพื่อนำเข้า ฐานข้อมูลที่ส่งออก หากมีเอกสารอยู่ในฐานข้อมูลแล้ว ระบบจะเขียนทับเอกสารนั้น