Trang này mô tả cách sử dụng tính năng khôi phục về một thời điểm nhất định (PITR) để giữ lại và khôi phục dữ liệu trong Cloud Firestore.
Để hiểu các khái niệm về PITR, hãy xem bài viết Khôi phục về một thời điểm nhất định.
Quyền
Để có các quyền cần thiết để quản lý chế độ cài đặt PITR, hãy yêu cầu quản trị viên cấp cho bạn các vai trò IAM sau đây trên dự án mà bạn muốn bật PITR:
- Chủ sở hữu Cloud Datastore (
roles/datastore.owner)
Đối với các vai trò tuỳ chỉnh, hãy đảm bảo rằng bạn đã cấp các quyền sau đây:
- Để bật PITR khi tạo cơ sở dữ liệu:
datastore.databases.create - Để cập nhật chế độ cài đặt PITR trên cơ sở dữ liệu hiện có:
datastore.databases.update,datastore.databases.list - Để thực hiện thao tác đọc từ dữ liệu PITR:
datastore.databases.get,datastore.entities.get,datastore.entities.list - Để xuất dữ liệu PITR:
datastore.databases.export - Để nhập dữ liệu PITR:
datastore.databases.import - Để sao chép cơ sở dữ liệu:
datastore.databases.clone
Trước khi bắt đầu
Hãy lưu ý những điểm sau đây trước khi bạn bắt đầu sử dụng PITR:
- Bạn không thể bắt đầu đọc dữ liệu từ 7 ngày trước ngay sau khi bật PITR.
- Nếu muốn bật PITR khi tạo cơ sở dữ liệu, bạn phải sử dụng lệnh
gcloud firestore databases create. Bạn không thể bật PITR khi tạo cơ sở dữ liệu bằng bảng điều khiển Cloud. - Cloud Firestore bắt đầu giữ lại các phiên bản từ thời điểm đó trở đi sau khi bật PITR.
- Bạn không thể đọc dữ liệu PITR trong cửa sổ PITR sau khi tắt PITR.
- Nếu bạn bật lại PITR ngay sau khi tắt, thì dữ liệu PITR trước đó sẽ không còn dùng được nữa. Mọi dữ liệu PITR được tạo trước khi tắt PITR sẽ bị xoá sau ngày hết hạn PITR.
- Nếu vô tình xoá dữ liệu trong giờ qua và PITR bị tắt, bạn có thể khôi phục dữ liệu bằng cách bật PITR trong vòng một giờ kể từ khi xoá.
- Mọi thao tác đọc được thực hiện trên dữ liệu PITR đã hết hạn đều không thành công.
Bật PITR
Trước khi sử dụng PITR, hãy bật tính năng thanh toán cho dự án Google Cloud của bạn. Chỉ những dự án Google Cloud đã bật tính năng thanh toán mới có thể sử dụng chức năng PITR.
Cách bật PITR cho cơ sở dữ liệu:
Bảng điều khiển
Trong bảng điều khiển Cloud, hãy chuyển đến trang Databases (Cơ sở dữ liệu).
Chọn cơ sở dữ liệu bắt buộc trong danh sách cơ sở dữ liệu.
Trong trình đơn điều hướng, hãy nhấp vào Disaster Recovery (Khôi phục sau thảm hoạ).
Nhấp vào Edit (Chỉnh sửa) để chỉnh sửa chế độ cài đặt.
Chọn hộp đánh dấu Enable point-in-time recovery (Bật tính năng khôi phục về một thời điểm nhất định), sau đó nhấp vào Save (Lưu).
Việc bật PITR sẽ phát sinh chi phí lưu trữ. Hãy xem phần Giá để biết thêm thông tin.
Để tắt PITR, hãy bỏ chọn hộp đánh dấu Enable point-in-time recovery (Bật tính năng khôi phục về một thời điểm nhất định) trên trang Disaster Recovery (Khôi phục sau thảm hoạ) trong bảng điều khiển Google Cloud.
gcloud
Bật PITR trong quá trình tạo cơ sở dữ liệu bằng gcloud firestore databases create và lệnh --enable-ptir như sau:
gcloud firestore databases create\
--location=LOCATION\
--database=DATABASE_ID\
--type=firestore-native\
--enable-pitr
Thay thế các giá trị như sau:
LOCATION– vị trí mà bạn muốn tạo cơ sở dữ liệu.DATABASE_ID– đặt thành mã cơ sở dữ liệu.
Bạn có thể tắt PITR bằng lệnh gcloud firestore databases update như sau:
gcloud firestore databases update\
--database=DATABASE_ID\
--no-enable-pitr
Thay thế các giá trị như sau:
DATABASE_ID– đặt thành mã cơ sở dữ liệu hoặc (mặc định).
Lấy khoảng thời gian lưu giữ và thời gian phiên bản sớm nhất
Bảng điều khiển
Trong bảng điều khiển Cloud, hãy chuyển đến trang Databases (Cơ sở dữ liệu).
Chọn cơ sở dữ liệu bắt buộc trong danh sách cơ sở dữ liệu.
Trong trình đơn điều hướng, hãy nhấp vào Disaster Recovery (Khôi phục sau thảm hoạ).
Trong phần Settings (Cài đặt), hãy lưu ý Retention period (khoảng thời gian lưu giữ) và Earliest version time (Thời gian phiên bản sớm nhất).
- Khoảng thời gian lưu giữ: khoảng thời gian mà Cloud Firestore giữ lại tất cả các phiên bản dữ liệu cho cơ sở dữ liệu. Giá trị này là một giờ khi PITR bị tắt và 7 ngày khi PITR được bật.
- Earliest version time (Thời gian phiên bản sớm nhất): dấu thời gian sớm nhất mà các phiên bản cũ hơn của dữ liệu có thể được đọc trong cửa sổ PITR. Giá trị này được cập nhật liên tục bởi Cloud Firestore và trở nên lỗi thời ngay khi được truy vấn. Nếu bạn đang sử dụng giá trị này để khôi phục dữ liệu, hãy nhớ tính đến thời gian từ thời điểm truy vấn giá trị đến thời điểm bạn bắt đầu khôi phục.
- Point-in-time recovery (Khôi phục về một thời điểm nhất định): hiển thị
Enablednếu PITR được bật. Nếu PITR bị tắt, bạn sẽ thấyDisabled(Đã tắt).
gcloud
Chạy lệnh gcloud firestore databases describe như sau:
gcloud firestore databases describe --database=DATABASE_ID
Thay thế DATABASE_ID bằng mã cơ sở dữ liệu hoặc '(default)'.
Sau đây là kết quả đầu ra:
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
trong đó:
earliestVersionTime: dấu thời gian của dữ liệu PITR được lưu trữ sớm nhất.pointInTimeRecoveryEnablement: hiển thịPOINT_IN_TIME_RECOVERY_ENABLEDnếu PITR được bật. Nếu PITR bị tắt, bạn sẽ thấyPOINT_IN_TIME_RECOVERY_DISABLEDhoặc trườngpointInTimeRecoveryEnablementcó thể không xuất hiện.versionRetentionPeriod: khoảng thời gian mà dữ liệu PITR được giữ lại tính bằng mili giây. Giá trị này có thể là một giờ khi PITR bị tắt hoặc 7 ngày nếu PITR được bật.
Đọc dữ liệu PITR
Bạn có thể đọc dữ liệu PITR bằng thư viện ứng dụng, phương thức API REST hoặc trình kết nối FirestoreIO Apache Beam.Thư viện ứng dụng
Java
Bạn phải sử dụng giao dịch ReadOnly để đọc dữ liệu PITR. Bạn không thể chỉ định trực tiếp readTime trong các thao tác đọc.
Hãy xem phần Giao dịch và thao tác ghi theo lô để biết thêm thông tin.
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();
Nút
Bạn phải sử dụng giao dịch ReadOnly để đọc dữ liệu PITR. Bạn không thể chỉ định trực tiếp readTime trong các thao tác đọc.
Hãy xem phần Giao dịch và thao tác ghi theo lô để biết thêm thông tin.
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 REST
Các thao tác đọc PITR được hỗ trợ trong tất cả các phương thức đọc Cloud Firestore, đó là get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery, và partitionQuery.
Để thực hiện thao tác đọc bằng các phương thức REST, hãy thử một trong các lựa chọn sau:
Trong yêu cầu phương thức đọc, hãy truyền giá trị
readTimedưới dạng dấu thời gian PITR được hỗ trợ trong phương thứcreadOptions. Dấu thời gian PITR có thể là dấu thời gian có độ chính xác đến từng micro giây trong giờ qua hoặc dấu thời gian có độ chính xác đến từng phút ngoài giờ qua, nhưng không được sớm hơnearliestVersionTime.Sử dụng tham số
readTimecùng với phương thứcBeginTransactionnhư một phần của giao dịchReadOnlycho nhiều thao tác đọc PITR.
Apache Beam
Sử dụng trình kết nối Cloud FirestoreIO Apache Beam để đọc hoặc ghi tài liệu trong cơ sở dữ liệu Cloud Firestore ở quy mô lớn bằng Dataflow.
Các thao tác đọc PITR được hỗ trợ trong phương thức đọc sau đây của trình kết nối
Cloud FirestoreIO. Các phương thức đọc này hỗ trợ phương thức withReadTime(@Nullable Instant readTime) mà bạn có thể sử dụng cho các thao tác đọc PITR:
- FirestoreV1.BatchGetDocuments
- FirestoreV1.ListCollectionIds
- FirestoreV1.ListDocuments
- FirestoreV1.PartitionQuery
Java
Bạn có thể sử dụng mã sau đây với mã ví dụ về quy trình Dataflow để thực hiện các thao tác đọc hoặc ghi hàng loạt. Ví dụ này sử dụng phương thức withReadTime(@Nullable Instant readTime) cho các thao tác đọc 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())
...
Để xem danh sách đầy đủ các ví dụ về readTime trong quy trình Dataflow, hãy xem kho lưu trữ GitHub.
Sao chép từ cơ sở dữ liệu
Bạn có thể sao chép một cơ sở dữ liệu hiện có tại dấu thời gian đã chọn vào một cơ sở dữ liệu mới:
Cơ sở dữ liệu được sao chép là một cơ sở dữ liệu mới sẽ được tạo ở cùng vị trí với cơ sở dữ liệu nguồn.
Để tạo bản sao, Cloud Firestore sử dụng dữ liệu khôi phục về một thời điểm nhất định (PITR) của cơ sở dữ liệu nguồn. Cơ sở dữ liệu được sao chép bao gồm tất cả dữ liệu và chỉ mục.
Theo mặc định, cơ sở dữ liệu được sao chép sẽ được mã hoá theo cùng một cách với cơ sở dữ liệu nguồn, sử dụng phương thức mã hoá mặc định của Google hoặc phương thức mã hoá CMEK. Bạn có thể chỉ định một loại mã hoá khác hoặc sử dụng một khoá khác cho phương thức mã hoá CMEK.
Dấu thời gian có độ chi tiết là một phút và chỉ định một thời điểm trong quá khứ, trong khoảng thời gian được xác định bởi cửa sổ PITR:
- Nếu PITR được bật cho cơ sở dữ liệu của bạn, bạn có thể chọn bất kỳ phút nào trong 7 ngày qua (hoặc ít hơn nếu PITR được bật chưa đến 7 ngày trước).
- Nếu PITR không được bật, bạn có thể chọn bất kỳ phút nào trong giờ qua.
- Bạn có thể kiểm tra dấu thời gian sớm nhất mà bạn có thể chọn trong phần mô tả cơ sở dữ liệu.
Bảng điều khiển
Firebase console không hỗ trợ tính năng sao chép cơ sở dữ liệu. Bạn có thể sử dụng hướng dẫn cho Google Cloud CLI để sao chép cơ sở dữ liệu.
gcloud
Sử dụng lệnh
gcloud firestore databases clone
để sao chép cơ sở dữ liệu:
gcloud firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'
Thay thế như sau:
SOURCE_DATABASE: tên cơ sở dữ liệu của một cơ sở dữ liệu hiện có mà bạn muốn sao chép. Tên này sử dụng định dạng
projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.PITR_TIMESTAMP: dấu thời gian PITR ở định dạng RFC 3339, có độ chi tiết đến từng phút. Ví dụ:
2025-06-01T10:20:00.00Zhoặc2025-06-01T10:30:00.00-07:00.DESTINATION_DATABASE_ID: mã cơ sở dữ liệu cho một cơ sở dữ liệu mới được sao chép. Mã cơ sở dữ liệu này không được liên kết với cơ sở dữ liệu hiện có.
Ví dụ:
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db'
Nếu bạn muốn liên kết với một số thẻ trong khi sao chép cơ sở dữ liệu, hãy sử dụng lệnh trước đó với cờ --tags. Đây là danh sách không bắt buộc gồm các cặp thẻ KEY=VALUE để liên kết.
Ví dụ:
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
Theo mặc định, cơ sở dữ liệu được sao chép sẽ có cùng cấu hình mã hoá với cơ sở dữ liệu nguồn. Để thay đổi cấu hình mã hoá, hãy sử dụng đối số --encryption-type:
- (Mặc định)
use-source-encryption: sử dụng cùng cấu hình mã hoá với cơ sở dữ liệu nguồn. google-default-encryption: sử dụng phương thức mã hoá mặc định của Google.customer-managed-encryption: sử dụng phương thức mã hoá CMEK. Chỉ định mã khoá trong đối số--kms-key-name.
Ví dụ sau đây cho thấy cách định cấu hình phương thức mã hoá CMEK cho cơ sở dữ liệu được sao chép:
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'
Giao diện dòng lệnh (CLI) của Firebase
Sử dụng lệnh firebase firestore:databases:clone để sao chép cơ sở dữ liệu:
firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'
Thay thế như sau:
SOURCE_DATABASE: tên cơ sở dữ liệu của một cơ sở dữ liệu hiện có mà bạn muốn sao chép. Tên này sử dụng định dạng
projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.DESTINATION_DATABASE: tên cơ sở dữ liệu cho một cơ sở dữ liệu mới được sao chép. Tên này sử dụng định dạng
projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID. Tên cơ sở dữ liệu này không được liên kết với cơ sở dữ liệu hiện có.PITR_TIMESTAMP: dấu thời gian PITR ở định dạng RFC 3339, có độ chi tiết đến từng phút. Ví dụ:
2025-06-01T10:20:00.00Zhoặc2025-06-01T10:30:00.00-07:00. Nếu không được chỉ định, ảnh chụp nhanh đã chọn sẽ là thời gian hiện tại, được làm tròn xuống đến phút.
Theo mặc định, cơ sở dữ liệu được sao chép sẽ có cùng cấu hình mã hoá với cơ sở dữ liệu nguồn. Để thay đổi cấu hình mã hoá, hãy sử dụng đối số --encryption-type:
- (Mặc định)
USE_SOURCE_ENCRYPTION: sử dụng cùng cấu hình mã hoá với cơ sở dữ liệu nguồn. GOOGLE_DEFAULT_ENCRYPTION: sử dụng phương thức mã hoá mặc định của Google.CUSTOMER_MANAGED_ENCRYPTION: sử dụng phương thức mã hoá CMEK. Chỉ định mã khoá trong đối số--kms-key-name.
Ví dụ sau đây cho thấy cách định cấu hình phương thức mã hoá CMEK cho cơ sở dữ liệu được sao chép:
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
Hạn chế
Thao tác sao chép không sao chép App Engine dữ liệu tìm kiếm hoặc các thực thể blob từ cơ sở dữ liệu (default). Dữ liệu này chỉ hợp lệ cho cơ sở dữ liệu (default) và sẽ không hữu ích nếu bạn sao chép từ (default) sang một cơ sở dữ liệu không hỗ trợ dữ liệu đó, vì vậy, dữ liệu này sẽ bị loại trừ khỏi các bản sao.
Xuất và nhập từ dữ liệu PITR
Bạn có thể xuất cơ sở dữ liệu sang Cloud Storage từ dữ liệu PITR
bằng lệnh gcloud firestore export. Bạn có thể xuất dữ liệu PITR trong đó dấu thời gian là dấu thời gian có độ chi tiết đến từng phút trong 7 ngày qua, nhưng không được sớm hơn earliestVersionTime. Nếu dữ liệu không còn tồn tại ở dấu thời gian đã chỉ định, thì thao tác xuất sẽ không thành công.
Thao tác xuất PITR hỗ trợ tất cả các bộ lọc, bao gồm cả việc xuất tất cả tài liệu và xuất các bộ sưu tập cụ thể.
Xuất cơ sở dữ liệu, chỉ định tham số
snapshot-timecho dấu thời gian khôi phục đã chọn.gcloud
Chạy lệnh sau để xuất cơ sở dữ liệu sang nhóm của bạn.
gcloud firestore export gs://BUCKET_NAME_PATH \ --snapshot-time=PITR_TIMESTAMP \ --collection-ids=COLLECTION_IDS \ --namespace-ids=NAMESPACE_IDSTrong đó:
BUCKET_NAME_PATH– nhóm Cloud Storage hợp lệ có tiền tố đường dẫn không bắt buộc nơi lưu trữ các tệp xuất.PITR_TIMESTAMP– dấu thời gian PITR có độ chi tiết đến từng phút, ví dụ:2023-05-26T10:20:00.00Zhoặc2023-10-19T10:30:00.00-07:00.COLLECTION_IDS– danh sách mã bộ sưu tập hoặc mã nhóm bộ sưu tập, ví dụ:'specific-collection-group1','specific-collection-group2'.NAMESPACE_IDS– danh sách mã không gian tên, ví dụ:'customer','orders'.
Hãy lưu ý những điểm sau đây trước khi xuất dữ liệu PITR:
- Chỉ định dấu thời gian ở định dạng RFC 3339.
Ví dụ:
2023-05-26T10:20:00.00Zhoặc2023-10-19T10:30:00.00-07:00. - Đảm bảo rằng dấu thời gian mà bạn chỉ định là dấu thời gian có độ chi tiết đến từng phút trong 7 ngày qua, nhưng không được sớm hơn
earliestVersionTime. Nếu dữ liệu không còn tồn tại ở dấu thời gian đã chỉ định, thì một lỗi sẽ được tạo. Dấu thời gian phải là một phút hoàn chỉnh, ngay cả khi thời gian được chỉ định nằm trong giờ qua. - Bạn sẽ không bị tính phí cho thao tác xuất PITR không thành công.
Nhập vào cơ sở dữ liệu.
Sử dụng các bước trong phần Nhập tất cả tài liệu để nhập cơ sở dữ liệu đã xuất. Nếu có bất kỳ tài liệu nào đã tồn tại trong cơ sở dữ liệu của bạn, thì tài liệu đó sẽ bị ghi đè.