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 một thời điểm (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 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 vai trò tuỳ chỉnh, hãy đảm bảo bạn đã cấp các quyền sau:

  • 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ác thao tác đọc từ 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

Trước khi bắt đầu

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 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 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 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 vô hiệu hoá PITR sẽ bị xoá sau ngày hết hạn PITR.
  • Nếu vô tình xoá dữ liệu trong vòng một 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 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 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ữ. Hãy xem phần Định 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 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à 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 biểu tượng 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ã 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 bạn bật 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 hiển thị.
  • 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 bạn tắt PITR hoặc 7 ngày nếu bạn bật PITR.

Đọ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ể chỉ định trực tiếp readTime trong các thao tác đọ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ể chỉ định trực tiếp readTime trong các thao tác đọ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

PITR được hỗ trợ trong tất cả các phương thức đọc Cloud Firestore, đó là get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuerypartitionQuery.

Để 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 có độ chính xác đến phần triệu giây trong vòng một giờ qua hoặc dấu thời gian có độ chính xác đến phút trong khoảng thời gian hơn một 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 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 ở quy mô lớn bằng Dataflow.

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ể dùng mã sau 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.

Xuất và nhập 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 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
    

    Địa điểm,

    • 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 để 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 ở phút nguyê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 ở dấu thời gian đã chỉ định, thì sẽ xảy 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 là trong vòng một giờ qua.
    • Bạn sẽ không bị tính phí cho lệnh 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ó 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 đè.