کار با بازیابی نقطه در زمان (PITR)

مربوط به نسخه استاندارد Cloud Firestore و نسخه سازمانی Cloud Firestore.

این صفحه نحوه استفاده از بازیابی نقطه‌ای در زمان (PITR) را برای حفظ و بازیابی داده‌ها در Cloud Firestore با سازگاری MongoDB شرح می‌دهد.

برای درک مفاهیم PITR، به بازیابی در نقطه زمانی مراجعه کنید.

مجوزها

برای دریافت مجوزهای لازم برای مدیریت تنظیمات PITR، از مدیر سیستم خود بخواهید که نقش‌های IAM زیر را در پروژه‌ای که می‌خواهید PITR در آن فعال شود، به شما اعطا کند:

  • مالک انبار داده ابری ( roles/datastore.owner )

برای نقش‌های سفارشی، مطمئن شوید که مجوزهای زیر اعطا شده است:

  • برای فعال کردن PITR هنگام ایجاد پایگاه داده: datastore.databases.create
  • برای به‌روزرسانی تنظیمات PITR در پایگاه داده موجود: datastore.databases.update ، datastore.databases.list
  • برای انجام خواندن از داده‌های PITR: datastore.databases.get ، datastore.entities.get ، datastore.entities.list
  • برای خروجی گرفتن از داده‌های PITR: datastore.databases.export
  • برای وارد کردن داده‌های PITR: datastore.databases.import
  • برای کپی کردن یک پایگاه داده: datastore.databases.clone

قبل از اینکه شروع کنی

قبل از شروع استفاده از PITR به نکات زیر توجه کنید:

  • شما نمی‌توانید بلافاصله پس از فعال کردن PITR، خواندن مطالب هفت روز گذشته را شروع کنید.
  • اگر می‌خواهید PITR را هنگام ایجاد پایگاه داده فعال کنید، باید از دستور gcloud firestore databases create استفاده کنید. فعال کردن PITR هنگام ایجاد پایگاه داده با استفاده از کنسول Google Cloud پشتیبانی نمی‌شود.
  • Cloud Firestore با سازگاری MongoDB پس از فعال کردن PITR، شروع به حفظ نسخه‌ها از نقطه‌ای به بعد می‌کند.
  • پس از غیرفعال کردن PITR، نمی‌توانید داده‌های PITR را در پنجره PITR بخوانید.
  • اگر بلافاصله پس از غیرفعال کردن PITR، آن را دوباره فعال کنید، داده‌های PITR قبلی دیگر در دسترس نخواهند بود. هرگونه داده PITR که قبل از غیرفعال کردن PITR ایجاد شده باشد، پس از تاریخ انقضای PITR حذف خواهد شد.
  • اگر در یک ساعت گذشته به‌طور تصادفی داده‌ها را حذف کرده‌اید و PITR غیرفعال است، می‌توانید با فعال کردن PITR ظرف یک ساعت پس از حذف، داده‌های خود را بازیابی کنید.
  • هرگونه عملیات خواندن روی داده‌های منقضی‌شده‌ی PITR با شکست مواجه می‌شود.

فعال کردن PITR

قبل از استفاده از PITR، صورتحساب را برای پروژه Google Cloud خود فعال کنید . فقط پروژه‌های Google Cloud که صورتحساب آنها فعال است می‌توانند از قابلیت PITR استفاده کنند.

برای فعال کردن PITR برای پایگاه داده خود:

کنسول

  1. در کنسول گوگل کلود، به صفحه پایگاه‌های داده بروید.

    به پایگاه‌های داده بروید

  2. از لیست پایگاه‌های داده، پایگاه داده مورد نظر را انتخاب کنید.

  3. در منوی پیمایش، روی بازیابی فاجعه کلیک کنید.

  4. برای ویرایش تنظیمات، روی ویرایش کلیک کنید.

  5. کادر فعال کردن بازیابی نقطه‌ای در زمان را علامت بزنید و سپس روی ذخیره کلیک کنید.

فعال‌سازی PITR هزینه‌های ذخیره‌سازی را به همراه دارد. برای اطلاعات بیشتر به بخش قیمت‌گذاری مراجعه کنید.

برای غیرفعال کردن PITR، کادر انتخاب «فعال کردن بازیابی نقطه‌ای در زمان» را از صفحه بازیابی فاجعه در کنسول Google Cloud بردارید.

جی‌کلاود

فعال کردن PITR در حین ایجاد پایگاه داده با استفاده از دستور --enable-ptir در gcloud firestore databases create به شرح زیر است:

gcloud firestore databases create\
  --location=LOCATION\
  --database=DATABASE_ID\
  --type=firestore-native\
  --enable-pitr

مقادیر را به صورت زیر جایگزین کنید:

  • LOCATION - مکانی که می‌خواهید پایگاه داده خود را در آن ایجاد کنید.
  • DATABASE_ID - روی شناسه پایگاه داده تنظیم می‌شود.

شما می‌توانید PITR را با استفاده از دستور gcloud firestore databases update به صورت زیر غیرفعال کنید:

gcloud firestore databases update\
  --database=DATABASE_ID\
  --no-enable-pitr

مقادیر را به صورت زیر جایگزین کنید:

  • DATABASE_ID - روی شناسه پایگاه داده یا (پیش‌فرض) تنظیم شده است.

دوره نگهداری و اولین زمان نسخه را دریافت کنید

کنسول

  1. در کنسول گوگل کلود، به صفحه پایگاه‌های داده بروید.

    به پایگاه‌های داده بروید

  2. از لیست پایگاه‌های داده، پایگاه داده مورد نظر را انتخاب کنید.

  3. در منوی پیمایش، روی بازیابی فاجعه کلیک کنید.

  4. در بخش تنظیمات ، به دوره نگهداری (Retention period) و زمان اولین نسخه (Earliest version time) توجه کنید.

    • دوره نگهداری : دوره‌ای که Cloud Firestore با سازگاری MongoDB تمام نسخه‌های داده‌ها را برای پایگاه داده حفظ می‌کند. مقدار آن یک ساعت در حالت غیرفعال بودن PITR و هفت روز در حالت فعال بودن PITR است.
    • زمان اولین نسخه : اولین مهر زمانی که نسخه‌های قدیمی‌تر داده‌ها می‌توانند در پنجره PITR خوانده شوند. این مقدار به طور مداوم توسط Cloud Firestore با سازگاری MongoDB به‌روزرسانی می‌شود و به محض درخواست، قدیمی می‌شود. اگر از این مقدار برای بازیابی داده‌ها استفاده می‌کنید، حتماً زمان را از لحظه درخواست مقدار تا لحظه شروع بازیابی در نظر بگیرید.
    • بازیابی نقطه‌ای : اگر PITR فعال باشد، Enabled نشان می‌دهد. اگر PITR غیرفعال باشد، Disabled خواهید دید.

جی‌کلاود

دستور description مربوط به پایگاه‌های داده‌ی gcloud firestore را به صورت زیر اجرا کنید:

gcloud firestore databases describe --database=DATABASE_ID

DATABASE_ID با شناسه پایگاه داده یا '(default)' جایگزین کنید.

خروجی به این صورت است:

    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

کجا،

  • earliestVersionTime : مهر زمانی اولین داده‌های PITR ذخیره شده.
  • pointInTimeRecoveryEnablement : اگر PITR فعال باشد، POINT_IN_TIME_RECOVERY_ENABLED را نشان می‌دهد. اگر PITR غیرفعال باشد، یا POINT_IN_TIME_RECOVERY_DISABLED خواهید دید یا ممکن است فیلد pointInTimeRecoveryEnablement نمایش داده نشود.
  • versionRetentionPeriod : مدت زمانی که داده‌های PITR بر حسب میلی‌ثانیه نگهداری می‌شوند. این مقدار می‌تواند در صورت غیرفعال بودن PITR یک ساعت و در صورت فعال بودن PITR هفت روز باشد.

خواندن داده‌های PITR

شما می‌توانید داده‌های PITR را با استفاده از کتابخانه‌های کلاینت، متدهای REST API یا کانکتور FirestoreIO Apache Beam بخوانید.

کتابخانه‌های کلاینت

جاوا

برای خواندن داده‌های PITR باید از تراکنش ReadOnly استفاده کنید. نمی‌توانید مستقیماً readTime در خواندن‌ها مشخص کنید. برای اطلاعات بیشتر به بخش تراکنش‌ها و نوشتن‌های دسته‌ای مراجعه کنید.

  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();

گره

برای خواندن داده‌های PITR باید از یک تراکنش ReadOnly استفاده کنید. نمی‌توانید مستقیماً readTime در خواندن‌ها مشخص کنید. برای اطلاعات بیشتر به بخش تراکنش‌ها و نوشتن‌های دسته‌ای مراجعه کنید.

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 رست

خواندن‌های PITR در تمام متدهای خواندن سازگار با MongoDB در Cloud Firestore پشتیبانی می‌شوند که عبارتند از get ، list ، batchGet ، listCollectionIds ، listDocuments ، runQuery ، runAggregationQuery و partitionQuery .

برای انجام خواندن با استفاده از متدهای REST، یکی از گزینه‌های زیر را امتحان کنید:

  1. در درخواست متد خواندن خود، مقدار readTime را به عنوان یک مهر زمانی PITR پشتیبانی شده در متد readOptions ارسال کنید. مهر زمانی PITR می‌تواند یا مهر زمانی با دقت میکروثانیه در یک ساعت گذشته یا مهر زمانی یک دقیقه کامل بعد از یک ساعت گذشته باشد، اما نه زودتر از earliestVersionTime .

  2. از پارامتر readTime به همراه متد BeginTransaction به عنوان بخشی از یک تراکنش ReadOnly برای خواندن‌های چندگانه PITR استفاده کنید.

پرتو آپاچی

از کانکتور Cloud Firestore با سازگاری MongoDB در Apache Beam برای خواندن یا نوشتن اسناد در یک پایگاه داده Cloud Firestore با سازگاری MongoDB در مقیاس بزرگ با Dataflow استفاده کنید.

خواندن‌های PITR در متد خواندن زیر از Cloud Firestore با کانکتور سازگاری MongoDB IO پشتیبانی می‌شوند. این متدهای خواندن از متد withReadTime(@Nullable Instant readTime) که می‌توانید برای خواندن‌های PITR استفاده کنید، پشتیبانی می‌کنند:

جاوا

کد زیر می‌تواند به همراه کد خط لوله Dataflow نمونه برای عملیات خواندن یا نوشتن انبوه استفاده شود. این مثال از متد withReadTime(@Nullable Instant readTime) برای خواندن‌های 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())
  ...

برای فهرست کاملی از مثال‌های readTime در خط لوله Dataflow، به مخزن GitHub مراجعه کنید.

کلون از یک پایگاه داده

شما می‌توانید یک پایگاه داده موجود را در یک زمان مشخص در یک پایگاه داده جدید کلون کنید:

  • پایگاه داده کلون شده، یک پایگاه داده جدید است که در همان مکان پایگاه داده منبع ایجاد خواهد شد.

    برای ایجاد یک کلون، Cloud Firestore از داده‌های بازیابی نقطه‌ای (PITR) پایگاه داده منبع استفاده می‌کند. پایگاه داده کلون شده شامل تمام داده‌ها و شاخص‌ها است.

  • به طور پیش‌فرض، پایگاه داده کلون شده به همان روش پایگاه داده منبع، با استفاده از رمزگذاری پیش‌فرض گوگل یا رمزگذاری CMEK رمزگذاری می‌شود. می‌توانید نوع رمزگذاری متفاوتی را مشخص کنید یا از کلید متفاوتی برای رمزگذاری CMEK استفاده کنید.

  • مهر زمانی دارای جزئیات یک دقیقه‌ای است و یک نقطه زمانی در گذشته، در دوره تعریف شده توسط پنجره PITR را مشخص می‌کند:

    • اگر PITR برای پایگاه داده شما فعال باشد، می‌توانید هر دقیقه‌ای در ۷ روز گذشته (یا کمتر اگر PITR کمتر از ۷ روز پیش فعال شده باشد) را انتخاب کنید.
    • اگر PITR فعال نباشد، می‌توانید هر دقیقه‌ای از یک ساعت گذشته را انتخاب کنید.
    • می‌توانید اولین مهر زمانی که می‌توانید انتخاب کنید را در توضیحات پایگاه داده خود بررسی کنید.

کنسول

کنسول Firebase از شبیه‌سازی پایگاه داده پشتیبانی نمی‌کند. می‌توانید از دستورالعمل‌های Google Cloud CLI برای شبیه‌سازی پایگاه‌های داده استفاده کنید.

جی‌کلاود

برای کلون کردن یک پایگاه داده از دستور gcloud alpha firestore databases clone استفاده کنید:

gcloud alpha firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'

موارد زیر را جایگزین کنید:

  • SOURCE_DATABASE : نام پایگاه داده‌ی موجودی که می‌خواهید آن را کلون کنید. این نام از قالب projects/ PROJECT_ID /databases/ SOURCE_DATABASE_ID استفاده می‌کند.

  • PITR_TIMESTAMP : یک مهر زمانی PITR در قالب RFC 3339 ، به صورت جزئی و دقیق. برای مثال: 2025-06-01T10:20:00.00Z یا 2025-06-01T10:30:00.00-07:00 .

  • DESTINATION_DATABASE_ID : شناسه پایگاه داده برای یک پایگاه داده کلون شده جدید. این شناسه پایگاه داده نباید با یک پایگاه داده موجود مرتبط باشد.

مثال:

gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db'

پیکربندی رمزگذاری پایگاه داده کلون شده را تغییر دهید

به طور پیش‌فرض، پایگاه داده کلون شده همان پیکربندی رمزگذاری پایگاه داده منبع را خواهد داشت. برای تغییر پیکربندی رمزگذاری، از آرگومان --encryption-type استفاده کنید:

  • (پیش‌فرض) use-source-encryption : از همان پیکربندی رمزگذاری پایگاه داده منبع استفاده می‌کند.
  • google-default-encryption : از رمزگذاری پیش‌فرض گوگل استفاده می‌کند.
  • customer-managed-encryption : از رمزگذاری CMEK استفاده می‌کند. یک شناسه کلید در آرگومان --kms-key-name مشخص کنید.

مثال زیر نحوه پیکربندی رمزگذاری CMEK برای پایگاه داده کلون شده را نشان می‌دهد:

gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'

صادرات و واردات از داده‌های PITR

شما می‌توانید با استفاده از دستور gcloud firestore export ، پایگاه داده خود را از داده‌های PITR به Cloud Storage صادر کنید. می‌توانید داده‌های PITR را که در آن مهر زمانی یک دقیقه کامل در هفت روز گذشته است، اما نه زودتر از earliestVersionTime صادر کنید. اگر داده‌ها دیگر در مهر زمانی مشخص شده وجود نداشته باشند، عملیات صادرات با شکست مواجه می‌شود.

عملیات خروجی PITR از همه فیلترها، از جمله خروجی گرفتن از همه اسناد و خروجی گرفتن از مجموعه‌های خاص، پشتیبانی می‌کند.

  1. پایگاه داده را اکسپورت کنید و پارامتر snapshot-time را به مهر زمانی بازیابی انتخاب شده اختصاص دهید.

    جی‌کلاود

    دستور زیر را برای خروجی گرفتن از پایگاه داده به باکت خود اجرا کنید.

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

    کجا،

    • BUCKET_NAME_PATH - یک باکت معتبر Cloud Storage با پیشوند مسیر اختیاری که فایل‌های خروجی در آن ذخیره می‌شوند.
    • PITR_TIMESTAMP - یک مهر زمانی PITR بر اساس جزئیات دقیقه، برای مثال، 2023-05-26T10:20:00.00Z یا 2023-10-19T10:30:00.00-07:00 .
    • COLLECTION_IDS - فهرستی از شناسه‌های مجموعه یا شناسه‌های گروه‌های مجموعه، برای مثال 'specific-collection-group1','specific-collection-group2' .
    • NAMESPACE_IDS - فهرستی از شناسه‌های فضای نام، برای مثال - 'customer','orders' .

    قبل از خروجی گرفتن از داده‌های PITR به نکات زیر توجه کنید:

    • مهر زمانی را با فرمت RFC 3339 مشخص کنید. برای مثال، 2023-05-26T10:20:00.00Z یا 2023-10-19T10:30:00.00-07:00 .
    • مطمئن شوید که برچسب زمانی که مشخص می‌کنید، یک دقیقه کامل در هفت روز گذشته باشد، اما نه زودتر از earliestVersionTime . اگر داده‌ها دیگر در برچسب زمانی مشخص شده وجود نداشته باشند، خطایی ایجاد می‌شود. برچسب زمانی باید یک دقیقه کامل باشد، حتی اگر زمان مشخص شده در یک ساعت گذشته باشد.
    • برای صادرات ناموفق PITR هزینه‌ای از شما دریافت نمی‌شود.
  2. به یک پایگاه داده وارد کنید.

    برای وارد کردن پایگاه داده‌ی خروجی گرفته شده، از مراحل موجود در «وارد کردن همه اسناد» استفاده کنید. اگر سندی از قبل در پایگاه داده شما وجود داشته باشد، رونویسی خواهد شد.