Belirli bir noktadan önceyi kurtarma (PITR) ile çalışma

Cloud Firestore Standard sürümü ve Cloud Firestore Enterprise sürümü için geçerlidir.

Bu sayfada, MongoDB uyumlu Cloud Firestore'da verileri saklamak ve kurtarmak için belirli bir noktaya geri yükleme (PITR) özelliğinin nasıl kullanılacağı açıklanmaktadır.

Belirli bir noktadan önceyi kurtarma kavramlarını anlamak için Belirli bir noktadan önceyi kurtarma başlıklı makaleyi inceleyin.

İzinler

PITR ayarlarını yönetmek için ihtiyaç duyduğunuz izinleri almak için yöneticinizden, PITR'yi etkinleştirmek istediğiniz projede size aşağıdaki IAM rollerini vermesini isteyin:

  • Bulut Veri Deposu Sahibi (roles/datastore.owner)

Özel roller için aşağıdaki izinlerin verildiğinden emin olun:

  • Veritabanı oluştururken PITR'yi etkinleştirmek için: datastore.databases.create
  • Mevcut veritabanındaki PITR ayarlarını güncellemek için: datastore.databases.update,datastore.databases.list
  • PITR verilerinden okuma işlemi yapmak için: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • PITR verilerini dışa aktarmak için: datastore.databases.export
  • PITR verilerini içe aktarmak için: datastore.databases.import
  • Bir veritabanını klonlamak için: datastore.databases.clone

Başlamadan önce

PITR'yi kullanmaya başlamadan önce aşağıdaki noktalara dikkat edin:

  • PITR'yi etkinleştirdikten hemen sonra yedi gün öncesinden okumaya başlayamazsınız.
  • Bir veritabanı oluştururken PITR'yi etkinleştirmek istiyorsanız gcloud firestore databases create komutunu kullanmalısınız. Google Cloud Console'u kullanarak veritabanı oluştururken PITR'nin etkinleştirilmesi desteklenmez.
  • MongoDB uyumlu Cloud Firestore, PITR etkinleştirildikten sonraki sürümleri saklamaya başlar.
  • PITR'yi devre dışı bıraktıktan sonra PITR penceresindeki PITR verilerini okuyamazsınız.
  • PITR'yi devre dışı bıraktıktan hemen sonra yeniden etkinleştirirseniz geçmiş PITR verileri artık kullanılamaz. PITR devre dışı bırakılmadan önce oluşturulan tüm PITR verileri, PITR geçerlilik bitiş tarihinden sonra silinir.
  • Son bir saat içinde yanlışlıkla veri sildiyseniz ve PITR devre dışıysa silme işleminden sonraki bir saat içinde PITR'yi etkinleştirerek verilerinizi geri yükleyebilirsiniz.
  • Süresi dolmuş PITR verileri üzerinde gerçekleştirilen tüm okuma işlemleri başarısız olur.

PITR'yi etkinleştirme

PITR'yi kullanmadan önce Google Cloud projeniz için faturalandırmayı etkinleştirin. PITR işlevini yalnızca faturalandırma özelliği etkinleştirilmiş Google Cloud projeleri kullanabilir.

Veritabanınız için PITR'yi etkinleştirmek üzere:

Konsol

  1. Google Cloud Console'da Veritabanları sayfasına gidin.

    Veritabanları'na git

  2. Veritabanları listesinden gerekli veritabanını seçin.

  3. Gezinme menüsünde Olağanüstü Durum Kurtarma'yı tıklayın.

  4. Ayarları düzenlemek için Düzenle'yi tıklayın.

  5. Belirli bir noktaya geri yüklemeyi etkinleştir onay kutusunu işaretleyin ve Kaydet'i tıklayın.

PITR'nin etkinleştirilmesi depolama maliyetlerine neden olur. Daha fazla bilgi için Fiyatlandırma bölümüne bakın.

PITR'yi devre dışı bırakmak için Google Cloud Console'daki Afet Kurtarma sayfasında Belirli bir noktadan önceyi kurtarmayı etkinleştir onay kutusunun işaretini kaldırın.

gcloud

Veritabanı oluşturma sırasında gcloud firestore databases create ve --enable-ptir komutlarıyla PITR'yi aşağıdaki şekilde etkinleştirin:

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

Değerleri aşağıdaki gibi değiştirin:

  • LOCATION: Veritabanınızı oluşturmak istediğiniz konum.
  • DATABASE_ID - Veritabanı kimliğine ayarlanır.

PITR'yi aşağıdaki gibi gcloud firestore databases update komutunu kullanarak devre dışı bırakabilirsiniz:

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

Değerleri aşağıdaki gibi değiştirin:

  • DATABASE_ID: Veritabanı kimliği veya (varsayılan) olarak ayarlanır.

Saklama süresini ve en eski sürüm zamanını alma

Konsol

  1. Google Cloud Console'da Veritabanları sayfasına gidin.

    Veritabanları'na git

  2. Veritabanları listesinden gerekli veritabanını seçin.

  3. Gezinme menüsünde Olağanüstü Durum Kurtarma'yı tıklayın.

  4. Ayarlar bölümünde Saklama süresi ve En eski sürüm zamanı'nı not edin.

    • Saklama süresi: MongoDB uyumlu Cloud Firestore'un veritabanı için verilerin tüm sürümlerini sakladığı süre. PITR devre dışı bırakıldığında değer bir saat, PITR etkinleştirildiğinde ise yedi gündür.
    • En erken sürüm zamanı: Verilerin eski sürümlerinin PITR penceresinde okunabileceği en erken zaman damgası. Bu değer, MongoDB uyumlu Cloud Firestore tarafından sürekli olarak güncellenir ve sorgulandığı anda eski hale gelir. Verileri kurtarmak için bu değeri kullanıyorsanız değerin sorgulandığı andan kurtarma işlemini başlattığınız ana kadar geçen süreyi hesaba kattığınızdan emin olun.
    • Belirli bir noktadan önceyi kurtarma: PITR etkinse Enabled simgesini gösterir. PITR devre dışıysa Disabled simgesini görürsünüz.

gcloud

gcloud firestore databases describe komutunu aşağıdaki gibi çalıştırın:

gcloud firestore databases describe --database=DATABASE_ID

DATABASE_ID yerine veritabanı kimliğini veya '(default)' değerini girin.

Çıkış:

    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

Burada:

  • earliestVersionTime: Depolanan en eski PITR verilerinin zaman damgası.
  • pointInTimeRecoveryEnablement: PITR etkinse POINT_IN_TIME_RECOVERY_ENABLED gösterilir. PITR devre dışı bırakılırsa POINT_IN_TIME_RECOVERY_DISABLED veya pointInTimeRecoveryEnablement alanı gösterilmeyebilir.
  • versionRetentionPeriod: PITR verilerinin saklandığı süre (milisaniye cinsinden). PITR devre dışı bırakıldığında değer bir saat, PITR etkinleştirildiğinde ise yedi gün olabilir.

PITR verilerini okuma

PITR verilerini istemci kitaplıklarını, REST API yöntemlerini veya FirestoreIO Apache Beam bağlayıcısını kullanarak okuyabilirsiniz.

İstemci kitaplıkları

Java

PITR verilerini okumak için ReadOnly işlemini kullanmanız gerekir. Okuma işlemlerinde readTime değerini doğrudan belirtemezsiniz. Daha fazla bilgi için İşlemler ve toplu yazmalar başlıklı makaleyi inceleyin.

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

Düğüm

PITR verilerini okumak için ReadOnly işlemi kullanmanız gerekir. Okuma işlemlerinde readTime değerini doğrudan belirtemezsiniz. Daha fazla bilgi için İşlemler ve toplu yazmalar başlıklı makaleyi inceleyin.

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

PITR okumaları, get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery ve partitionQuery olan tüm MongoDB uyumlu Cloud Firestore okuma yöntemlerinde desteklenir.

REST yöntemlerini kullanarak okuma işlemi gerçekleştirmek için aşağıdaki seçeneklerden birini deneyin:

  1. Okuma yöntemi isteğinizde, readTime değerini readOptions yönteminde desteklenen bir PITR zaman damgası olarak iletin. Bir PITR zaman damgası, son bir saat içindeki mikrosaniye hassasiyetli bir zaman damgası veya son bir saatin ötesinde, ancak earliestVersionTime değerinden daha erken olmayan tam bir dakikalık zaman damgası olabilir.

  2. Birden fazla PITR okuma işlemi için ReadOnly işlemi kapsamında readTime parametresini BeginTransaction yöntemiyle birlikte kullanın.

Apache Beam

Dataflow ile büyük ölçekte MongoDB uyumlu Cloud Firestore veritabanındaki dokümanları okumak veya yazmak için MongoDB uyumlu Cloud Firestore IO Apache Beam bağlayıcısını kullanın.

PITR okumaları, MongoDB uyumlu Cloud FirestoreIO bağlayıcısının aşağıdaki okuma yönteminde desteklenir. Bu okuma yöntemleri, PITR okumaları için kullanabileceğiniz withReadTime(@Nullable Instant readTime) yöntemini destekler:

Java

Aşağıdaki kod, toplu okuma veya yazma işlemleri için örnek Dataflow ardışık düzen koduyla kullanılabilir. Örnekte, PITR okumaları için withReadTime(@Nullable Instant readTime) yöntemi kullanılmaktadır.

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

Dataflow işlem hattındaki readTime örneklerinin tam listesi için GitHub deposuna bakın.

Veritabanından klonlama

Seçilen bir zaman damgasında mevcut bir veritabanını yeni bir veritabanına klonlayabilirsiniz:

  • Klonlanan veritabanı, kaynak veritabanıyla aynı konumda oluşturulan yeni bir veritabanıdır.

    Cloud Firestore, klon oluşturmak için kaynak veritabanının belirli bir noktadan önceyi kurtarma (PITR) verilerini kullanır. Klonlanan veritabanı tüm verileri ve dizinleri içerir.

  • Varsayılan olarak, klonlanan veritabanı kaynak veritabanıyla aynı şekilde şifrelenir. Bu işlemde Google'ın varsayılan şifrelemesi veya CMEK şifrelemesi kullanılır. Farklı bir şifreleme türü belirtebilir veya CMEK şifrelemesi için farklı bir anahtar kullanabilirsiniz.

  • Zaman damgası bir dakikalık ayrıntı düzeyine sahiptir ve PITR penceresi tarafından tanımlanan dönemde geçmişteki bir zaman noktasını belirtir:

    • Veritabanınızda PITR etkinse son 7 gün içindeki herhangi bir dakikayı seçebilirsiniz (PITR 7 günden daha kısa süre önce etkinleştirildiyse daha kısa bir süre seçebilirsiniz).
    • PITR etkin değilse son saatteki herhangi bir dakikayı seçebilirsiniz.
    • Veritabanınızın açıklamasında seçebileceğiniz en eski zaman damgasını kontrol edebilirsiniz.

Console

Firebase konsolu, veritabanı klonlamayı desteklemez. Veritabanlarını klonlamak için Google Cloud CLI ile ilgili talimatları kullanabilirsiniz.

gcloud

Veritabanını klonlamak için gcloud firestore databases clone komutunu kullanın:

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

Aşağıdakini değiştirin:

  • SOURCE_DATABASE: Klonlamak istediğiniz mevcut bir veritabanının veritabanı adı. Ad, projects/PROJECT_ID/databases/SOURCE_DATABASE_ID biçimini kullanıyor.

  • PITR_TIMESTAMP: Dakika ayrıntı düzeyinde, RFC 3339 biçiminde bir PITR zaman damgası. Örneğin: 2025-06-01T10:20:00.00Z veya 2025-06-01T10:30:00.00-07:00.

  • DESTINATION_DATABASE_ID: Yeni bir klonlanmış veritabanı için veritabanı kimliği. Bu veritabanı kimliği, mevcut bir veritabanıyla ilişkilendirilmemelidir.

Örnek:

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

Bir veritabanını klonlarken bazı etiketlere bağlamak istiyorsanız önceki komutu --tags işaretiyle kullanın. Bu işaret, bağlanacak etiketlerin isteğe bağlı bir KEY=VALUE çiftleri listesidir.

Örnek:

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

Varsayılan olarak, klonlanan veritabanı kaynak veritabanıyla aynı şifreleme yapılandırmasına sahip olur. Şifreleme yapılandırmasını değiştirmek için --encryption-type bağımsız değişkenini kullanın:

  • (Varsayılan) use-source-encryption: Kaynak veritabanıyla aynı şifreleme yapılandırmasını kullanın.
  • google-default-encryption: Google'ın varsayılan şifrelemesini kullanın.
  • customer-managed-encryption: CMEK şifrelemesini kullanın. --kms-key-name bağımsız değişkeninde bir anahtar kimliği belirtin.

Aşağıdaki örnekte, klonlanan veritabanı için CMEK şifrelemesinin nasıl yapılandırılacağı gösterilmektedir:

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

Veritabanını klonlamak için firebase firestore:databases:clone komutunu kullanın:

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

Aşağıdakini değiştirin:

  • SOURCE_DATABASE: Klonlamak istediğiniz mevcut bir veritabanının veritabanı adı. Ad, projects/PROJECT_ID/databases/SOURCE_DATABASE_ID biçimini kullanıyor.

  • DESTINATION_DATABASE: Yeni bir klonlanmış veritabanı için veritabanı adı. Ad, projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID biçimini kullanıyor. Bu veritabanı adı, mevcut bir veritabanıyla ilişkilendirilmemelidir.

  • PITR_TIMESTAMP: Dakika ayrıntı düzeyinde, RFC 3339 biçiminde bir PITR zaman damgası. Örneğin: 2025-06-01T10:20:00.00Z veya 2025-06-01T10:30:00.00-07:00. Belirtilmezse seçilen anlık görüntü, dakikaya yuvarlanmış geçerli saat olur.

Varsayılan olarak, klonlanan veritabanı kaynak veritabanıyla aynı şifreleme yapılandırmasına sahip olur. Şifreleme yapılandırmasını değiştirmek için --encryption-type bağımsız değişkenini kullanın:

  • (Varsayılan) USE_SOURCE_ENCRYPTION: Kaynak veritabanıyla aynı şifreleme yapılandırmasını kullanın.
  • GOOGLE_DEFAULT_ENCRYPTION: Google'ın varsayılan şifrelemesini kullanın.
  • CUSTOMER_MANAGED_ENCRYPTION: CMEK şifrelemesini kullanın. --kms-key-name bağımsız değişkeninde bir anahtar kimliği belirtin.

Aşağıdaki örnekte, klonlanan veritabanı için CMEK şifrelemesinin nasıl yapılandırılacağı gösterilmektedir:

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

Sınırlamalar

Klonlama işlemi, (default) veritabanındaki App Engine arama verilerini veya blob öğelerini klonlamaz. Bu veriler yalnızca (default) veritabanı için geçerlidir ve (default) veritabanından bu tür verileri desteklemeyen bir veritabanına klonlama yaparsanız kullanışlı olmaz. Bu nedenle, klonlamalara dahil edilmez.

PITR verilerinden dışa ve içe aktarma

Veritabanınızı PITR verilerinden gcloud firestore export komutunu kullanarak Cloud Storage'a aktarabilirsiniz. Zaman damgası son yedi güne ait tam bir dakikalık zaman damgası olan, ancak earliestVersionTime tarihinden daha önce olmayan PITR verilerini dışa aktarabilirsiniz. Belirtilen zaman damgasında veri artık mevcut değilse dışa aktarma işlemi başarısız olur.

PITR dışa aktarma işlemi, tüm belgelerin dışa aktarılması ve belirli koleksiyonların dışa aktarılması da dahil olmak üzere tüm filtreleri destekler.

  1. Veritabanını dışa aktarın ve snapshot-time parametresini seçilen kurtarma zaman damgasına göre belirtin.

    gcloud

    Veritabanını paketinize aktarmak için aşağıdaki komutu çalıştırın.

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

    Nerede,

    • BUCKET_NAME_PATH: Dışa aktarılan dosyaların depolandığı, isteğe bağlı yol ön ekine sahip geçerli bir Cloud Storage paketi.
    • PITR_TIMESTAMP - Dakika ayrıntı düzeyinde bir PITR zaman damgası (örneğin, 2023-05-26T10:20:00.00Z veya 2023-10-19T10:30:00.00-07:00).
    • COLLECTION_IDS - örneğin, koleksiyon kimliklerinin veya koleksiyon grubu kimliklerinin listesi-'specific-collection-group1','specific-collection-group2'.
    • NAMESPACE_IDS - ad alanı kimliklerinin listesi (örneğin) -'customer','orders'.

    PITR verilerini dışa aktarmadan önce aşağıdaki noktalara dikkat edin:

    • Zaman damgasını RFC 3339 biçiminde belirtin. Örneğin, 2023-05-26T10:20:00.00Z veya 2023-10-19T10:30:00.00-07:00.
    • Belirttiğiniz zaman damgasının, son yedi gün içinde ancak earliestVersionTime tarihinden önce olmayan tam dakikalık bir zaman damgası olduğundan emin olun. Belirtilen zaman damgasında veri artık mevcut değilse bir hata üretilir. Belirtilen zaman son bir saat içinde olsa bile, zaman damgası tam bir dakika olmalıdır.
    • Başarısız bir PITR dışa aktarma işlemi için sizden ödeme alınmaz.
  2. Verileri bir veritabanına aktarma.

    Dışa aktarılan veritabanınızı içe aktarmak için Tüm belgeleri içe aktar bölümündeki adımları kullanın. Veritabanınızda halihazırda herhangi bir belge varsa, üzerine yazılacaktır.