Làm việc với tính năng khôi phục tại một thời điểm (PITR)

Liên quan đến phiên bản Cloud Firestore Standard và phiên bản Cloud Firestore Enterprise.

Trang này mô tả cách sử dụng tính năng khôi phục tại một thời điểm (PITR) để giữ lại và khôi phục dữ liệu trong Cloud Firestore có khả năng tương thích với MongoDB.

Để tìm hiểu các khái niệm về PITR, hãy xem phần Khôi phục tại một thời điểm.

Quyền

Để có được các quyền cần thiết để quản lý chế độ 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 chế độ PITR:

  • Chủ sở hữu Cloud Datastore (roles/datastore.owner)

Đối với các vai trò tùy chỉnh, hãy đảm bảo rằng các quyền sau được cấp:

  • Cách bật PITR khi tạo cơ sở dữ liệu: datastore.databases.create
  • Cách cập nhật chế độ PITR trên cơ sở dữ liệu hiện có: datastore.databases.update,datastore.databases.list
  • Để thực hiện đọc từ dữ liệu PITR: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • Để xuất dữ liệu PITR: datastore.databases.export
  • Cách nhập dữ liệu PITR: datastore.databases.import
  • Cách sao chép cơ sở dữ liệu: datastore.databases.clone

Trước khi bắt đầu

Lưu ý những điểm sau trước khi bạn bắt đầu sử dụng PITR:

  • Bạn không thể bắt đầu đọc từ 7 ngày trước ngay sau khi bật PITR.
  • Nếu bạn 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. Không hỗ trợ bật PITR khi tạo cơ sở dữ liệu bằng bảng điều khiển Google Cloud.
  • Cloud Firestore tương thích với MongoDB sẽ bắt đầu lưu giữ 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 nữa. Bất kỳ dữ liệu PITR nào được tạo trước khi vô hiệu hóa PITR sẽ bị xóa 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 sẽ 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 của bạn trên Google Cloud. Chỉ những dự án trê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

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Cơ sở dữ liệu.

    Chuyển đến phần Cơ sở dữ liệu

  2. Chọn cơ sở dữ liệu cần thiết trong danh sách cơ sở dữ liệu.

  3. Trong trình đơn điều hướng, hãy nhấp vào Khôi phục sau thảm hoạ.

  4. Nhấp vào Chỉnh sửa để chỉnh sửa chế độ cài đặt.

  5. Chọn hộp đánh dấu Bật tính năng khôi phục tại một thời điểm, rồi nhấp vào Lưu.

Việc bật PITR sẽ phát sinh chi phí lưu trữ. Xem Giá để biết thêm thông tin.

Để tắt PITR, hãy bỏ chọn hộp Bật tính năng khôi phục về một thời điểm nhất định trên trang 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ã nhận dạng cơ sở dữ liệu hoặc (mặc định).

Lấy khoảng thời gian lưu giữ và thời gian của phiên bản sớm nhất

Bảng điều khiển

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Cơ sở dữ liệu.

    Chuyển đến phần Cơ sở dữ liệu

  2. Chọn cơ sở dữ liệu cần thiết trong danh sách cơ sở dữ liệu.

  3. Trong trình đơn điều hướng, hãy nhấp vào Khôi phục sau thảm hoạ.

  4. Trong phần Cài đặt, hãy lưu ý Khoảng thời gian lưu giữThời gian của phiên bản sớm nhất.

    • Khoảng thời gian lưu giữ: khoảng thời gian mà Cloud Firestore có khả năng tương thích với MongoDB lưu giữ tất cả các phiên bản dữ liệu cho cơ sở dữ liệu. Giá trị này là 1 giờ khi PITR bị tắt và 7 ngày khi PITR được bật.
    • 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 khoảng thời gian PITR. Giá trị này được Cloud Firestore cập nhật liên tục với khả năng tương thích MongoDB và trở nên cũ 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 giá trị được truy vấn đến thời điểm bạn bắt đầu khôi phục.
    • Khôi phục về một thời điểm nhất định: cho biết Enabled nếu bạn bật PITR. Nếu PITR bị tắt, bạn sẽ thấy Disabled.

gcloud

Chạy lệnh gcloud firestore databases describe như sau:

gcloud firestore databases describe --database=DATABASE_ID

Thay thế DATABASE_ID bằng ID cơ sở dữ liệu hoặc '(default)'.

Sau đây là kết quả:

    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 sớm nhất được lưu trữ.
  • pointInTimeRecoveryEnablement: cho thấy POINT_IN_TIME_RECOVERY_ENABLED, nếu PITR được bật. Nếu tắt PITR, bạn sẽ thấy POINT_IN_TIME_RECOVERY_DISABLED hoặc trường pointInTimeRecoveryEnablement có 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ị có thể là 1 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 cách sử dụng thư viện ứng dụng, phương thức REST API 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ể trực tiếp chỉ định readTime trong các lần đọc. Hãy xem phần Giao dịch và hoạt động 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ể trực tiếp chỉ định readTime trong các lần đọc. Hãy xem phần Giao dịch và hoạt động 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 PITR được hỗ trợ trong tất cả các phương thức đọc tương thích với MongoDB của Cloud Firestore, bao gồm get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuerypartitionQuery.

Để thực hiện đọc bằng phương thức REST, hãy thử một trong các tùy chọn sau:

  1. Trong yêu cầu phương thức đọc của bạn, hãy truyền giá trị readTime dưới dạng dấu thời gian PITR được hỗ trợ trong phương thức readOptions. Dấu thời gian PITR có thể là dấu thời gian có độ chính xác đến micro giây trong giờ qua hoặc dấu thời gian là toàn bộ phút sau giờ qua, nhưng không sớm hơn earliestVersionTime.

  2. Sử dụng tham số readTime cùng với phương thức BeginTransaction như một phần của giao dịch ReadOnly cho nhiều lần đọc PITR.

Tia Apache

Sử dụng Cloud Firestore có trình kết nối Apache Beam tương thích với MongoDB để đọc hoặc ghi tài liệu trong cơ sở dữ liệu Cloud Firestore tương thích với MongoDB ở quy mô lớn bằng Dataflow.

Đọc PITR được hỗ trợ trong phương thức đọc sau của Cloud Firestore với trình kết nối MongoDB compatibilityIO. 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 lần đọc PITR:

Java

Bạn có thể sử dụng mã sau đây với mã ví dụ về quy trình Dataflow cho 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) để đọ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 một 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 tại một thời điểm (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ách tương tự như cơ sở dữ liệu nguồn, bằng cách 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 để 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 đã bật PITR cho cơ sở dữ liệu, 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 bạn bật PITR chưa được 7 ngày).
    • Nếu không bật PITR, 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

Bảng điều khiển Firebase 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

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ế nội dung 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, với độ chi tiết theo phút. Ví dụ: 2025-06-01T10:20:00.00Z hoặc 2025-06-01T10:30:00.00-07:00.

  • DESTINATION_DATABASE_ID: mã nhận dạng cơ sở dữ liệu cho một cơ sở dữ liệu mới được sao chép. Mã nhận dạng 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 một cấu hình mã hoá như cơ sở dữ liệu nguồn.
  • google-default-encryption: sử dụng chế độ mã hoá mặc định của Google.
  • customer-managed-encryption: sử dụng phương thức mã hoá CMEK. Chỉ định một mã khoá trong đối số --kms-key-name.

Ví dụ sau đây cho thấy cách định cấu hình chế độ 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ế nội dung 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 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, với độ chi tiết theo phút. Ví dụ: 2025-06-01T10:20:00.00Z hoặc 2025-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 một cấu hình mã hoá như cơ sở dữ liệu nguồn.
  • GOOGLE_DEFAULT_ENCRYPTION: sử dụng chế độ mã hoá mặc định của Google.
  • CUSTOMER_MANAGED_ENCRYPTION: sử dụng phương thức mã hoá CMEK. Chỉ định một mã khoá trong đối số --kms-key-name.

Ví dụ sau đây cho thấy cách định cấu hình chế độ 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 như vậy, vì vậy, dữ liệu này sẽ bị loại trừ khỏi bản sao.

Xuất và nhập dữ liệu từ 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 có dấu thời gian là dấu thời gian nguyên phút trong vòng 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ể.

  1. Xuất cơ sở dữ liệu, chỉ định tham số snapshot-time cho dấu thời gian khôi phục đã chọn.

    gcloud

    Chạy lệnh sau để xuất cơ sở dữ liệu vào nhóm của bạn.

    gcloud firestore export gs://BUCKET_NAME_PATH \
        --snapshot-time=PITR_TIMESTAMP \
        --collection-ids=COLLECTION_IDS \
        --namespace-ids=NAMESPACE_IDS
    

    Ở đâu,

    • BUCKET_NAME_PATH – một vùng chứa 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 ở độ chi tiết theo phút, ví dụ: 2023-05-26T10:20:00.00Z hoặc 2023-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ã nhận dạng không gian tên, ví dụ: 'customer','orders'.

    Lưu ý những điểm sau đây trước khi xuất dữ liệu PITR:

    • Chỉ định dấu thời gian theo định dạng RFC 3339. Ví dụ: 2023-05-26T10:20:00.00Z hoặc 2023-10-19T10:30:00.00-07:00.
    • Đảm bảo rằng dấu thời gian bạn chỉ định là dấu thời gian tính bằng phút trong bảy ngày qua, nhưng không sớm hơn earliestVersionTime. Nếu dữ liệu không còn tồn tại tại thời điểm được chỉ định, lỗi sẽ được tạo ra. Dấu thời gian phải là một phút trọn vẹn, ngay cả khi thời gian chỉ định nằm trong giờ trước.
    • Bạn sẽ không bị tính phí cho một lần xuất PITR không thành công.
  2. Nhập vào cơ sở dữ liệu.

    Hãy làm theo 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 đè.