เกี่ยวข้องกับ Cloud Firestore รุ่น Standard และ Cloud Firestore รุ่น Enterprise |
หน้านี้อธิบายวิธีใช้การกู้คืน ณ จุดเวลา (PITR) เพื่อเก็บรักษาและกู้คืนข้อมูลใน Cloud Firestore ที่เข้ากันได้กับ MongoDB
หากต้องการทำความเข้าใจแนวคิด 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 Console - Cloud Firestore ที่เข้ากันได้กับ MongoDB จะเริ่มเก็บรักษาเวอร์ชันนับจากจุดนี้เป็นต้นไปหลังจากเปิดใช้ 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 ที่เข้ากันได้กับ MongoDB จะเก็บรักษาข้อมูลทุกเวอร์ชันของฐานข้อมูล ค่าจะเป็น 1 ชั่วโมงเมื่อปิดใช้ PITR และ 7 วันเมื่อเปิดใช้ PITR
- เวลาของเวอร์ชันที่เก่าที่สุด: การประทับเวลาที่เก่าที่สุดซึ่งสามารถอ่านข้อมูลเวอร์ชันเก่าในหน้าต่าง PITR ได้ Cloud Firestore จะอัปเดตค่านี้อย่างต่อเนื่อง โดยมีความเข้ากันได้กับ MongoDB และค่านี้จะล้าสมัยทันทีที่มีการค้นหา หากคุณใช้ค่านี้เพื่อกู้คืนข้อมูล โปรดคำนึงถึงเวลาตั้งแต่ ช่วงเวลาที่ค้นหาค่าจนถึงช่วงเวลาที่คุณเริ่มการกู้คืน
- การกู้คืนช่วงเวลา: แสดง
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 ทั้งหมดที่มีวิธีการอ่านที่เข้ากันได้กับ MongoDB ซึ่งได้แก่ get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery และ partitionQuery
หากต้องการอ่านโดยใช้วิธี REST ให้ลองใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
ในคำขอเมธอดอ่าน ให้ส่งค่า
readTime
เป็นการประทับเวลา PITR ที่รองรับในเมธอดreadOptions
การประทับเวลา PITR อาจเป็นการประทับเวลาที่มีความแม่นยำระดับไมโครวินาทีภายในชั่วโมงที่ผ่านมา หรือการประทับเวลาแบบเต็มนาทีที่เกินชั่วโมงที่ผ่านมา แต่ต้องไม่เร็วกว่าearliestVersionTime
ใช้พารามิเตอร์
readTime
ร่วมกับเมธอดBeginTransaction
เป็นส่วนหนึ่งของReadOnly
ธุรกรรมสำหรับการอ่าน PITR หลายรายการ
Apache Beam
ใช้ตัวเชื่อมต่อ Apache Beam ที่เข้ากันได้กับ Cloud Firestore กับ MongoDB เพื่ออ่านหรือเขียนเอกสารในฐานข้อมูล Cloud Firestore ที่เข้ากันได้กับ MongoDB ในวงกว้างด้วย Dataflow
การอ่าน PITR ได้รับการรองรับในวิธีการอ่านต่อไปนี้ของตัวเชื่อมต่อ I/O ของ Cloud Firestore ที่เข้ากันได้กับ MongoDB วิธีการอ่านเหล่านี้รองรับ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
ส่งออกและนำเข้าจากข้อมูล 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: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
หากไม่มีข้อมูลที่การประทับเวลาที่ระบุอีกต่อไป ระบบจะสร้างข้อผิดพลาด การประทับเวลาต้องเป็นนาทีเต็ม แม้ว่าเวลาที่ระบุจะอยู่ในชั่วโมงที่ผ่านมาก็ตาม - ระบบจะไม่เรียกเก็บเงินจากคุณสำหรับการส่งออก PITR ที่ไม่สำเร็จ
นำเข้าไปยังฐานข้อมูล
ทำตามขั้นตอนในนำเข้าเอกสารทั้งหมดเพื่อนำเข้า ฐานข้อมูลที่ส่งออก หากมีเอกสารอยู่ในฐานข้อมูลแล้ว ระบบจะเขียนทับเอกสารนั้น
โคลนจากฐานข้อมูล
คุณสามารถโคลนฐานข้อมูลที่มีอยู่ ณ การประทับเวลาที่เลือกไปยังฐานข้อมูลใหม่ได้โดยทำดังนี้
ฐานข้อมูลที่โคลนคือฐานข้อมูลใหม่ที่จะสร้างในตำแหน่งเดียวกันกับฐานข้อมูลต้นทาง
หากต้องการโคลน Cloud Firestore จะใช้ข้อมูลการกู้คืน ณ จุดเวลา (PITR) ของฐานข้อมูลต้นทาง ฐานข้อมูลที่โคลนจะมีข้อมูลและดัชนีทั้งหมด
โดยค่าเริ่มต้น ระบบจะเข้ารหัสฐานข้อมูลที่โคลนในลักษณะเดียวกับ ฐานข้อมูลต้นทาง โดยใช้การเข้ารหัสเริ่มต้นของ Google หรือการเข้ารหัส CMEK คุณระบุประเภทการเข้ารหัสอื่นหรือใช้คีย์อื่นสำหรับการเข้ารหัส CMEK ได้
การประทับเวลามีความละเอียด 1 นาทีและระบุจุดเวลา ในอดีต ในช่วงเวลาที่กำหนดโดยกรอบเวลา PITR ดังนี้
- หากเปิดใช้ PITR สำหรับฐานข้อมูล คุณจะเลือกนาทีใดก็ได้ในช่วง 7 วันที่ผ่านมา (หรือน้อยกว่านั้นหากเปิดใช้ PITR เมื่อไม่ถึง 7 วันที่ผ่านมา)
- หากไม่ได้เปิดใช้ PITR คุณจะเลือกนาทีใดก็ได้ในชั่วโมงที่ผ่านมา
- คุณสามารถตรวจสอบการประทับเวลาที่เร็วที่สุดที่เลือกได้ในคำอธิบายของฐานข้อมูล
คอนโซล
คอนโซล Firebase ไม่รองรับการโคลนฐานข้อมูล คุณใช้ วิธีการสำหรับ Google Cloud CLI เพื่อโคลนฐานข้อมูลได้
gcloud
ใช้คำสั่ง
gcloud alpha firestore databases clone
เพื่อโคลนฐานข้อมูล
gcloud alpha 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: a รหัสฐานข้อมูล สำหรับฐานข้อมูลที่โคลนใหม่ รหัสฐานข้อมูลนี้ต้องไม่เชื่อมโยงกับฐานข้อมูลที่มีอยู่
ตัวอย่าง
gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db'
เปลี่ยนการกำหนดค่าการเข้ารหัสของฐานข้อมูลที่โคลน
โดยค่าเริ่มต้น ฐานข้อมูลที่โคลนจะมีค่ากำหนดการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง หากต้องการเปลี่ยนการกำหนดค่าการเข้ารหัส ให้ใช้อาร์กิวเมนต์
--encryption-type
- (ค่าเริ่มต้น)
use-source-encryption
: ใช้การกำหนดค่าการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง google-default-encryption
: ใช้การเข้ารหัสเริ่มต้นของ Googlecustomer-managed-encryption
: ใช้การเข้ารหัส CMEK ระบุ รหัสคีย์ ในอาร์กิวเมนต์--kms-key-name
ตัวอย่างต่อไปนี้แสดงวิธีกําหนดค่าการเข้ารหัส CMEK สําหรับฐานข้อมูลที่โคลน
gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'