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

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 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

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

    Chuyển đến trang Databases (Cơ sở dữ liệu)

  2. Chọn cơ sở dữ liệu bắt buộc trong danh sách cơ sở dữ liệu.

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

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

  5. 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), rồi nhấp vào Save (Lưu).

Việc bật PITR sẽ phát sinh chi phí lưu trữ. Hãy xem bài viết 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).

Nhận 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

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

    Chuyển đến trang Databases (Cơ sở dữ liệu)

  2. Chọn cơ sở dữ liệu bắt buộc trong danh sách cơ sở dữ liệu.

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

  4. 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 liên tục cập nhật 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): cho biết Enabled nếu PITR được bật. Nếu PITR bị tắt, bạn sẽ thấy Disabled (Đã 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ả:

    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 biết POINT_IN_TIME_RECOVERY_ENABLED nếu PITR được bật. Nếu PITR bị tắt, 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ị 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 bài viết 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 bài viết 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:

  1. Trong yêu cầu phương thức đọc, hãy truyền giá trị readTime làm 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 từng micro giây trong giờ qua hoặc dấu thời gian toàn phút ngoài giờ qua, nhưng không được sớm hơn earliestVersionTime.

  2. Sử dụng tham số readTime cùng với phương thức BeginTransaction trong giao dịch ReadOnly cho 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ể dùng cho các thao tác đọc PITR:

Java

Bạn có thể sử dụng mã sau đây với mã mẫu của 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 cơ sở dữ liệu hiện có tại dấu thời gian đã chọn vào cơ sở dữ liệu mới:

  • Cơ sở dữ liệu được sao chép là cơ sở dữ liệu mới sẽ được tạo ở cùng vị trí với cơ sở dữ liệu nguồn.

    Để sao chép, 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ách giống như cơ sở dữ liệu nguồn, sử dụng quy trình mã hoá mặc định của Google hoặc quy trình 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 quy trình 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ạn đã 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 bạn chưa 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

Firebase bảng điều khiển 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 về Google Cloud CLI để sao chép cơ sở dữ liệu.

Google Cloud CLI

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ế các mục sau:

  • SOURCE_DATABASE: tên cơ sở dữ liệu của 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.00Z hoặc 2025-06-01T10:30:00.00-07:00.

  • DESTINATION_DATABASE_ID: mã cơ sở dữ liệu cho 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ẻ 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 quy trình mã hoá mặc định của Google.
  • customer-managed-encryption: sử dụng quy trình 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 quy trình 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'