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

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

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

الأذونات

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

  • مالك 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 - تعيين إلى رقم تعريف قاعدة البيانات أو (افتراضي).

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

وحدة التحكم

  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 API أو أداة ربط 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 استنساخ قواعد البيانات. يمكنك استخدام تعليمات 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 بيانات البحث أو كيانات الكائنات الثنائية الكبيرة من قاعدة بيانات (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. استيراد إلى قاعدة بيانات

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