استخدام ميزة الاسترداد في الوقت المناسب (PITR)

توضّح هذه الصفحة كيفية استخدام ميزة "الاسترداد في نقطة زمنية" (PITR) للاحتفاظ بالبيانات واستردادها في Cloud Firestore.

للتعرّف على مفاهيم ميزة "الاسترداد في نقطة زمنية"، يُرجى الاطّلاع على مقالة الاسترداد في نقطة زمنية.

الأذونات

للحصول على الأذونات اللازمة لإدارة إعدادات ميزة "الاسترداد في نقطة زمنية"، اطلب من المشرف منحك أدوار إدارة الهوية وإمكانية الوصول التالية في المشروع الذي تريد تفعيل ميزة "الاسترداد في نقطة زمنية" فيه:

  • مالك Cloud Datastore ‏ (roles/datastore.owner)

بالنسبة إلى الأدوار المخصّصة، تأكَّد من منح الأذونات التالية:

  • لتفعيل ميزة "الاسترداد في نقطة زمنية" عند إنشاء قاعدة بيانات: datastore.databases.create
  • لتعديل إعدادات ميزة "الاسترداد في نقطة زمنية" في قاعدة بيانات حالية: datastore.databases.update وdatastore.databases.list
  • لإجراء عمليات قراءة من بيانات ميزة "الاسترداد في نقطة زمنية": datastore.databases.get وdatastore.entities.get وdatastore.entities.list
  • لتصدير بيانات ميزة "الاسترداد في نقطة زمنية": datastore.databases.export
  • لاستيراد بيانات ميزة "الاسترداد في نقطة زمنية": datastore.databases.import
  • لاستنساخ قاعدة بيانات: datastore.databases.clone

قبل البدء

يُرجى مراعاة النقاط التالية قبل البدء في استخدام ميزة "الاسترداد في نقطة زمنية":

  • لا يمكنك البدء في القراءة من بيانات قبل سبعة أيام مباشرةً بعد تفعيل ميزة "الاسترداد في نقطة زمنية".
  • إذا أردت تفعيل ميزة "الاسترداد في نقطة زمنية" عند إنشاء قاعدة بيانات، عليك استخدام الأمر gcloud firestore databases create. لا يمكن تفعيل ميزة "الاسترداد في نقطة زمنية" أثناء إنشاء قاعدة بيانات باستخدام Google Cloud Console.
  • Cloud Firestore يبدأ في الاحتفاظ بالإصدارات من تلك النقطة الزمنية فصاعدًا بعد تفعيل ميزة "الاسترداد في نقطة زمنية".
  • لا يمكنك قراءة بيانات ميزة "الاسترداد في نقطة زمنية" في نافذة "الاسترداد في نقطة زمنية" بعد إيقاف هذه الميزة.
  • إذا أعدت تفعيل ميزة "الاسترداد في نقطة زمنية" مباشرةً بعد إيقافها، لن تعود بيانات ميزة "الاسترداد في نقطة زمنية" السابقة متاحة. سيتم حذف أي بيانات لميزة "الاسترداد في نقطة زمنية" تم إنشاؤها قبل إيقاف هذه الميزة بعد تاريخ انتهاء صلاحية ميزة "الاسترداد في نقطة زمنية".
  • إذا حذفت بيانات عن طريق الخطأ في الساعة الأخيرة وكانت ميزة "الاسترداد في نقطة زمنية" غير مفعّلة، يمكنك استعادة بياناتك من خلال تفعيل ميزة "الاسترداد في نقطة زمنية" في غضون ساعة واحدة من الحذف.
  • ستفشل أي عملية قراءة يتم إجراؤها على بيانات ميزة "الاسترداد في نقطة زمنية" منتهية الصلاحية.

تفعيل ميزة "الاسترداد في نقطة زمنية"

قبل استخدام ميزة "الاسترداد في نقطة زمنية"، فعِّل الفوترة لمشروعك على Google Cloud project. لا يمكن استخدام وظيفة "الاسترداد في نقطة زمنية" إلا في مشاريع Google Cloud التي تم تفعيل الفوترة فيها.

لتفعيل ميزة "الاسترداد في نقطة زمنية" لقاعدة بياناتك، اتّبِع الخطوات التالية:

وحدة التحكم

  1. في Google Cloud Console، انتقِل إلى صفحة قواعد البيانات.

    الانتقال إلى "قواعد البيانات"

  2. اختَر قاعدة البيانات المطلوبة من قائمة قواعد البيانات.

  3. في قائمة التنقّل، انقر على التعافي من الكوارث.

  4. انقر على تعديل لتعديل الإعدادات.

  5. ضَع علامة في مربّع الاختيار تفعيل ميزة "الاسترداد في نقطة زمنية" ، ثم انقر على حفظ.

يؤدي تفعيل ميزة "الاسترداد في نقطة زمنية" إلى تحمُّل تكاليف التخزين. لمزيد من المعلومات، اطّلِع على صفحة الأسعار.

لإيقاف ميزة "الاسترداد في نقطة زمنية"، أزِل العلامة من مربّع الاختيار تفعيل ميزة "الاسترداد في نقطة زمنية" من صفحة "التعافي من الكوارث" في Google Cloud Console.

gcloud

يمكنك تفعيل ميزة "الاسترداد في نقطة زمنية" أثناء إنشاء قاعدة بيانات باستخدام الأمرَين gcloud firestore databases create و--enable-ptir على النحو التالي:

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

استبدِل القيم على النحو التالي:

  • LOCATION - الموقع الجغرافي الذي تريد إنشاء قاعدة بياناتك فيه.
  • DATABASE_ID - اضبطه على رقم تعريف قاعدة بيانات.

يمكنك إيقاف ميزة "الاسترداد في نقطة زمنية" باستخدام الأمر gcloud firestore databases update على النحو التالي:

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

استبدِل القيم على النحو التالي:

  • DATABASE_ID - اضبطه على رقم تعريف قاعدة البيانات أو (default).

الحصول على فترة التخزين ووقت أقدم إصدار

وحدة التحكم

  1. في Google Cloud Console، انتقِل إلى صفحة قواعد البيانات.

    الانتقال إلى "قواعد البيانات"

  2. اختَر قاعدة البيانات المطلوبة من قائمة قواعد البيانات.

  3. في قائمة التنقّل، انقر على التعافي من الكوارث.

  4. في قسم الإعدادات ، اطّلِع على فترة التخزين ووقت أقدم إصدار.

    • فترة الاحتفاظ بالبيانات: الفترة التي يحتفظ فيها Cloud Firestore بجميع إصدارات البيانات لقاعدة البيانات. تكون القيمة ساعة واحدة عند إيقاف ميزة "الاسترداد في نقطة زمنية" وسبعة أيام عند تفعيلها.
    • وقت أقدم إصدار: أقدم طابع زمني يمكن قراءة الإصدارات القديمة من البيانات عنده في نافذة "الاسترداد في نقطة زمنية". يتم تعديل هذه القيمة باستمرار من قِبل Cloud Firestore وتصبح قديمة في اللحظة التي يتم فيها طلبها. إذا كنت تستخدم هذه القيمة لاسترداد البيانات، احرص على مراعاة الوقت من اللحظة التي يتم فيها طلب القيمة إلى اللحظة التي تبدأ فيها عملية الاسترداد.
    • الاسترداد في نقطة زمنية: يعرض Enabled، إذا كانت ميزة "الاسترداد في نقطة زمنية" مفعّلة. إذا كانت ميزة "الاسترداد في نقطة زمنية" غير مفعّلة، سيظهر لك Disabled.

gcloud

نفِّذ الأمر gcloud firestore databases describe على النحو التالي:

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: الطابع الزمني لأقدم بيانات ميزة "الاسترداد في نقطة زمنية" تم تخزينها.
  • pointInTimeRecoveryEnablement: يعرض POINT_IN_TIME_RECOVERY_ENABLED إذا كانت ميزة "الاسترداد في نقطة زمنية" مفعّلة. إذا كانت ميزة "الاسترداد في نقطة زمنية" غير مفعّلة، سيظهر لك POINT_IN_TIME_RECOVERY_DISABLED أو قد لا يظهر الحقل pointInTimeRecoveryEnablement.
  • versionRetentionPeriod: الفترة الزمنية التي يتم خلالها الاحتفاظ ببيانات ميزة "الاسترداد في نقطة زمنية" بالملّي ثانية. يمكن أن تكون القيمة ساعة واحدة عند إيقاف ميزة "الاسترداد في نقطة زمنية" أو سبعة أيام إذا كانت ميزة "الاسترداد في نقطة زمنية" مفعّلة.

قراءة بيانات ميزة "الاسترداد في نقطة زمنية"

يمكنك قراءة بيانات ميزة "الاسترداد في نقطة زمنية" باستخدام مكتبات العملاء أو طرق واجهة برمجة تطبيقات REST أو أداة ربط FirestoreIO Apache Beam.

مكتبات العملاء

Java

عليك استخدام معاملة 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();

العقدة

عليك استخدام معاملة 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)}
);

REST API

تتوفّر عمليات القراءة في ميزة "الاسترداد في نقطة زمنية" في جميع طرق القراءة Cloud Firestore، وهي get وlist وbatchGet و listCollectionIds وlistDocuments و runQuery وrunAggregationQuery و partitionQuery.

لإجراء عملية قراءة باستخدام طرق REST، جرِّب أحد الخيارات التالية:

  1. في طلب طريقة القراءة، مرِّر قيمة readTime كطابع زمني متوافق مع ميزة "الاسترداد في نقطة زمنية" في طريقة readOptions. يمكن أن يكون الطابع الزمني لميزة "الاسترداد في نقطة زمنية" إما طابعًا زمنيًا بدقة الميكروثانية خلال الساعة الماضية أو طابعًا زمنيًا بدقة الدقيقة الكاملة بعد الساعة الماضية، ولكن ليس قبل earliestVersionTime.

  2. استخدِم المَعلمة readTime مع طريقة BeginTransaction كجزء من معاملة ReadOnly لعمليات قراءة متعددة لميزة "الاسترداد في نقطة زمنية".

Apache Beam

استخدِم أداة ربط Cloud FirestoreIO Apache Beam لقراءة المستندات أو كتابتها على نطاق واسع في قاعدة بيانات Cloud Firestore باستخدام Dataflow.

تتوفّر عمليات القراءة في ميزة "الاسترداد في نقطة زمنية" في طريقة القراءة التالية لأداة ربط Cloud FirestoreIO. تتوافق طرق القراءة هذه مع طريقة withReadTime(@Nullable Instant readTime) التي يمكنك استخدامها لعمليات القراءة في ميزة "الاسترداد في نقطة زمنية":

Java

يمكن استخدام الرمز التالي مع نموذج رمز خط أنابيب Dataflow لعمليات القراءة أو الكتابة المجمّعة. يستخدم المثال طريقة withReadTime(@Nullable Instant readTime) لعمليات القراءة في ميزة "الاسترداد في نقطة زمنية".

  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 يستخدم بيانات ميزة "الاسترداد في نقطة زمنية" لقاعدة البيانات المصدر. تتضمّن قاعدة البيانات المستنسَخة جميع البيانات والفهارس.

  • سيتم تشفير قاعدة البيانات المستنسَخة بالطريقة نفسها التي تم بها تشفير قاعدة البيانات المصدر، إما باستخدام تشفير Google التلقائي أو تشفير "مفاتيح التشفير التي يديرها العميل" (CMEK). يمكنك تحديد نوع تشفير مختلف أو استخدام مفتاح مختلف لتشفير "مفاتيح التشفير التي يديرها العميل".

  • تكون دقة الطابع الزمني دقيقة واحدة ويحدّد نقطة زمنية في الماضي، في الفترة المحدّدة من خلال نافذة "الاسترداد في نقطة زمنية":

    • إذا كانت ميزة "الاسترداد في نقطة زمنية" مفعّلة لقاعدة بياناتك، يمكنك اختيار أي دقيقة في آخر 7 أيام (أو أقل إذا تم تفعيل ميزة "الاسترداد في نقطة زمنية" قبل أقل من 7 أيام).
    • إذا لم تكن ميزة "الاسترداد في نقطة زمنية" مفعّلة، يمكنك اختيار أي دقيقة في الساعة الماضية.
    • يمكنك الاطّلاع على أقدم طابع زمني يمكنك اختياره في وصف قاعدة بياناتك.

وحدة التحكم

Firebase لا تتيح Console استنساخ قواعد البيانات. يمكنك استخدام تعليمات Google Cloud CLI لاستنساخ قواعد البيانات.

gcloud

استخدِم الأمر gcloud firestore databases clone لاستنساخ قاعدة بيانات:

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

استبدِل ما يلي:

مثال:

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، وهي قائمة اختيارية بالعلامات على شكل أزواج `KEY=VALUE` للربط بها.

مثال:

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

سيكون لقاعدة البيانات المستنسَخة إعدادات التشفير نفسها لقاعدة البيانات المصدر. لتغيير إعدادات التشفير، استخدِم الوسيطة --encryption-type:

  • (تلقائي) use-source-encryption: استخدِم إعدادات التشفير نفسها لقاعدة البيانات المصدر.
  • google-default-encryption: استخدِم تشفير Google التلقائي.
  • customer-managed-encryption: استخدِم تشفير "مفاتيح التشفير التي يديرها العميل". حدِّد رقم تعريف مفتاح في الوسيطة --kms-key-name.

يوضّح المثال التالي كيفية ضبط تشفير "مفاتيح التشفير التي يديرها العميل" لقاعدة البيانات المستنسَخة:

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'

Firebase CLI

استخدِم الأمر firebase firestore:databases:clone لاستنساخ قاعدة بيانات:

firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'

استبدِل ما يلي:

  • SOURCE_DATABASE: اسم قاعدة بيانات حالية تريد استنساخها. يستخدم الاسم التنسيق projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.

  • DESTINATION_DATABASE: اسم قاعدة بيانات لقاعدة بيانات مستنسَخة جديدة. يستخدم الاسم التنسيق projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID. يجب ألا يكون اسم قاعدة البيانات هذا مرتبطًا بقاعدة بيانات حالية.

  • PITR_TIMESTAMP: طابع زمني لميزة "الاسترداد في نقطة زمنية" بتنسيق RFC 3339، بدقة الدقيقة. مثلاً: 2025-06-01T10:20:00.00Z أو 2025-06-01T10:30:00.00-07:00. إذا لم يتم تحديد ذلك، سيكون الطابع الزمني الذي تم اختياره هو الوقت الحالي، مع تقريبه إلى أقرب دقيقة.

سيكون لقاعدة البيانات المستنسَخة إعدادات التشفير نفسها لقاعدة البيانات المصدر. لتغيير إعدادات التشفير، استخدِم الوسيطة --encryption-type:

  • (تلقائي) USE_SOURCE_ENCRYPTION: استخدِم إعدادات التشفير نفسها لقاعدة البيانات المصدر.
  • GOOGLE_DEFAULT_ENCRYPTION: استخدِم تشفير Google التلقائي.
  • CUSTOMER_MANAGED_ENCRYPTION: استخدِم تشفير "مفاتيح التشفير التي يديرها العميل". حدِّد رقم تعريف مفتاح في الوسيطة --kms-key-name.

يوضّح المثال التالي كيفية ضبط تشفير "مفاتيح التشفير التي يديرها العميل" لقاعدة البيانات المستنسَخة:

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

القيود

لا تستنسخ عملية الاستنساخ App Engine بيانات بحث أو كيانات blob من قاعدة بيانات (default). لا تكون هذه البيانات صالحة إلا لقاعدة بيانات (default)، ولن تكون مفيدة إذا استنسخت من (default) إلى قاعدة بيانات لا تتوافق مع هذه البيانات، لذا يتم استبعادها من النسخ المستنسَخة.

التصدير والاستيراد من بيانات ميزة "الاسترداد في نقطة زمنية"

يمكنك تصدير قاعدة بياناتك إلى Cloud Storage من بيانات ميزة "الاسترداد في نقطة زمنية" باستخدام الأمر gcloud firestore export. يمكنك تصدير بيانات ميزة "الاسترداد في نقطة زمنية" التي يكون الطابع الزمني لها طابعًا زمنيًا بدقة الدقيقة الكاملة خلال الأيام السبعة الماضية، ولكن ليس قبل earliestVersionTime. إذا لم تعُد البيانات متوفّرة في الطابع الزمني المحدّد، ستفشل عملية التصدير.

تتوافق عملية تصدير ميزة "الاسترداد في نقطة زمنية" مع جميع الفلاتر، بما في ذلك تصدير جميع المستندات وتصدير مجموعات معيّنة.

  1. صدِّر قاعدة البيانات، مع تحديد المَعلمة snapshot-time للطابع الزمني للاسترداد الذي تم اختياره.

    gcloud

    نفِّذ الأمر التالي لتصدير قاعدة البيانات إلى مساحة التخزين السحابي.

    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 - طابع زمني لميزة "الاسترداد في نقطة زمنية" بدقة الدقيقة، مثلاً 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'.

    يُرجى مراعاة النقاط التالية قبل تصدير بيانات ميزة "الاسترداد في نقطة زمنية":

    • حدِّد الطابع الزمني بتنسيق RFC 3339 format. مثلاً، 2023-05-26T10:20:00.00Z أو 2023-10-19T10:30:00.00-07:00.
    • تأكَّد من أنّ الطابع الزمني الذي تحدّده هو طابع زمني بدقة الدقيقة الكاملة خلال الأيام السبعة الماضية، ولكن ليس قبل earliestVersionTime. إذا لم تعُد البيانات متوفّرة في الطابع الزمني المحدّد، سيتم إنشاء خطأ. يجب أن يكون الطابع الزمني بدقة الدقيقة الكاملة، حتى إذا كان الوقت المحدّد خلال الساعة الماضية.
    • لن يتم تحصيل رسوم منك مقابل عملية تصدير فاشلة لميزة "الاسترداد في نقطة زمنية".
  2. استورِد إلى قاعدة بيانات.

    استخدِم الخطوات الواردة في مقالة استيراد جميع المستندات لاستيراد قاعدة البيانات التي تم تصديرها. إذا كان أي مستند موجودًا في قاعدة بياناتك، سيتم استبداله.