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 tại thời điểm cụ thể (PITR) để giữ lại và khôi phục dữ liệu trong Cloud Firestore.

Để tìm 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.

Quyền

Để có được các quyền cần thiết nhằm 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 trong dự án mà bạn muốn bật PITR:

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

Đối với vai trò tuỳ chỉnh, hãy đảm bảo bạn đã cấp các quyền sau:

  • Cách bật tính năng PITR khi tạo cơ sở dữ liệu: datastore.databases.create
  • Cách 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
  • Cách đọc dữ liệu PITR: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • Cách 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

Hãy 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 dữ liệu từ 7 ngày trước ngay sau khi bật tính năng 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. Không hỗ trợ việc bật tính năng PITR trong khi tạo cơ sở dữ liệu bằng Google Cloud Console.
  • 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 khoảng thời gian PITR sau khi tắt tính năng PITR.
  • Nếu bạn bật lại PITR ngay sau khi tắt, thì dữ liệu PITR trước đây sẽ không còn nữa. Mọi dữ liệu PITR được tạo trước khi tắt tính năng PITR sẽ bị xoá sau ngày hết hạn của 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 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 tính năng PITR cho cơ sở dữ liệu:

Bảng điều khiển

  1. Trong Google Cloud Console, hãy chuyển đến trang Databases (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 thời điểm cụ thể, sau đó nhấp vào Lưu.

Việc bật PITR sẽ làm phát sinh chi phí lưu trữ. Hãy xem phần Giá để biết thêm thông tin.

Để tắt tính năng PITR, hãy bỏ đánh dấu hộp Bật tính năng khôi phục về thời điểm cụ thể trên trang Khôi phục sau thảm hoạ trong Google Cloud Console.

gcloud

Bật PITR trong quá trình tạo cơ sở dữ liệu bằng lệnh gcloud firestore databases create và --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 tính năng 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 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 Google Cloud Console, hãy chuyển đến trang Databases (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 ý Thời gian lưu giữ và Thời gian của phiên bản sớm nhất.

    • Thời gian lưu giữ: khoảng thời gian mà Cloud Firestore 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à một giờ khi PITR bị tắt và bảy 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 dữ liệu cũ hơn 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à sẽ 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 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 thấy Enabled nếu bạn bật tính năng 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 mã nhận dạng 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

ở đâu,

  • 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 bạn bật tính năng PITR. 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 lưu giữ dữ liệu PITR, tính bằng mili giây. Giá trị này 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 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ể trực tiếp chỉ định readTime trong các thao tác đọc. Hãy xem phần Giao dịch và 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 thao tác đọc. Hãy xem phần Giao dịch và 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

Thao tác đọc PITR được hỗ trợ trong tất cả phương thức đọc Cloud Firestore, bao gồm 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 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 chính xác đến micrô giây trong vòng một giờ qua hoặc dấu thời gian chính xác đến phút ngoài một 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 trong một giao dịch ReadOnly cho nhiều lượt đọ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 trên 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 để đọc PITR:

Java

Bạn có thể sử dụng mã sau đây cùng 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) cho các lượt đọ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 về thời điểm cụ thể (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 phương thức mã hoá mặc định của Google hoặ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ó mứ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ằng khoảng thời gian PITR:

    • Nếu bạn bật tính năng PITR cho cơ sở dữ liệu, thì 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 tính năng PITR chưa đến 7 ngày trước).
    • Nếu chưa bật tính năng PITR, bạn có thể chọn bất kỳ phút nào trong giờ vừa 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ủa cơ sở dữ liệu.

Bảng điều khiển

Bảng điều khiển của Firebase không hỗ trợ việc sao chép cơ sở dữ liệu. Bạn có thể làm theo hướng dẫn dành 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ế 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 có định dạng projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.

  • PITR_TIMESTAMP: dấu thời gian PITR ở định dạng RFC 3339, theo mức độ chi tiết 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 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 một 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ấu hình mã hoá giống như 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 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ột mã khoá trong đối số --kms-key-name.

Ví dụ sau đây cho thấy cách định cấu hì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'

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 có đị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 có đị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 một cơ sở dữ liệu hiện có.

  • PITR_TIMESTAMP: dấu thời gian PITR ở định dạng RFC 3339, theo mức độ chi tiết phút. Ví dụ: 2025-06-01T10:20:00.00Z hoặc 2025-06-01T10:30:00.00-07:00. Nếu bạn không chỉ định, ảnh chụp nhanh được 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ấu hình mã hoá giống như 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 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ột mã khoá trong đối số --kms-key-name.

Ví dụ sau đây cho thấy cách định cấu hình 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 dữ liệu tìm kiếm App Engine hoặ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 có dấu thời gian là dấu thời gian phút tròn 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 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ả bộ lọc, bao gồm cả việc xuất tất cả tài liệu và xuất các tập hợ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 sang bộ chứa của bạn.

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

    Trong đó,

    • BUCKET_NAME_PATH – một bộ 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 ở mức độ 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ã nhận dạng tập hợp hoặc mã nhận dạng nhóm tập hợ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 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 theo phút tròn trong vòng 7 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 dấu thời gian đã chỉ định, thì hệ thống sẽ tạo ra lỗi. Dấu thời gian phải là một phút tròn, ngay cả khi thời gian được 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.

    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ó tài liệu nào đã tồn tại trong cơ sở dữ liệu, thì tài liệu đó sẽ bị ghi đè.