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

Bu sayfada, Cloud Firestore içinde verileri saklamak ve kurtarmak için belirli bir noktadan önceyi kurtarma (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

Belirli bir zamana geri yükleme ayarlarını yönetmek için gereken izinleri almak üzere yöneticinizden, belirli bir zamana geri yüklemeyi etkinleştirmek istediğiniz projede size aşağıdaki IAM rollerini vermesini isteyin:

  • Cloud Datastore 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ında belirli bir zamana geri yükleme ayarlarını güncellemek için: datastore.databases.update,datastore.databases.list
  • PITR verilerinden okuma yapmak için: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • Belirli bir zamana ait verileri dışa aktarmak için: datastore.databases.export
  • PITR verilerini içe aktarmak için: datastore.databases.import
  • Veritabanını klonlamak için: datastore.databases.clone

Başlamadan önce

Belirli bir zamana geri yükleme özelliğini 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.
  • Veritabanı oluştururken PITR'yi etkinleştirmek istiyorsanız gcloud firestore databases create komutunu kullanmanız gerekir. Google Cloud Console'u kullanarak veritabanı oluştururken PITR'yi etkinleştirme desteklenmez.
  • Cloud Firestore, PITR etkinleştirildikten sonra 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 verilerinde gerçekleştirilen 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. Yalnızca faturalandırmanın etkin olduğu Google Cloud projeleri PITR işlevini kullanabilir.

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

Konsol

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

    Veritabanları'na gidin

  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 noktadan önceyi kurtarmayı etkinleştir onay kutusunu işaretleyin ve ardından Kaydet'i tıklayın.

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

Belirli bir noktadan önceyi kurtarmayı devre dışı bırakmak için Google Cloud Console'daki Olağanüstü Durum 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 komutuyla PITR'yi aşağıdaki gibi 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ği olarak ayarlanır.

gcloud firestore databases update komutunu kullanarak PITR'yi aşağıdaki gibi 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ğine veya (varsayılan) değerine 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 gidin

  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: Cloud Firestore tarafından veritabanı için tüm veri sürümlerinin saklandığı süre. PITR devre dışı bırakıldığında değer bir saat, 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 Cloud Firestore tarafından sürekli güncellenir ve sorgulandığı anda güncelliğini yitirir. Bu değeri veri kurtarmak için 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 değerini gösterir. PITR devre dışıysa Disabled ifadesini 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ış şu şekildedir:

    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 değerini gösterir. PITR devre dışıysa POINT_IN_TIME_RECOVERY_DISABLED ifadesini görürsünüz veya pointInTimeRecoveryEnablement alanı gösterilmeyebilir.
  • versionRetentionPeriod: PITR verilerinin saklandığı milisaniye cinsinden süre. PITR devre dışıysa değer bir saat, PITR etkinse yedi gün olabilir.

Belirli bir zamana ait verileri okuma

İstemci kitaplıklarını, REST API yöntemlerini veya FirestoreIO Apache Beam bağlayıcısını kullanarak PITR verilerini 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 yazma işlemleri 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 yazma işlemleri 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 okuma işlemleri, tüm Cloud Firestore okuma yöntemlerinde desteklenir: get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery ve partitionQuery.

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. PITR zaman damgası, son bir saat içindeki mikrosaniye hassasiyetinde bir zaman damgası veya son bir saatten önceki tam dakika zaman damgası olabilir ancak earliestVersionTime tarihinden önce olamaz.

  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 bir Cloud Firestore veritabanındaki belgeleri okumak veya yazmak için Cloud FirestoreIO Apache Beam bağlayıcısını kullanın.

Belirli bir zamana geri yükleme okuma işlemleri, 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, belirli bir zamana geri yükleme 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 ardışık düzenindeki readTime örneklerinin tam listesi için GitHub deposuna bakın.

Veritabanından klonlama

Mevcut bir veritabanını, seçilen bir zaman damgasında yeni bir veritabanına kopyalayabilirsiniz:

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

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

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

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

    • Veritabanınız için PITR etkinleştirilmişse son 7 gün içindeki herhangi bir dakikayı (veya PITR 7 günden daha kısa bir süre önce etkinleştirildiyse daha azını) seçebilirsiniz.
    • PITR etkinleştirilmemişse son bir saatteki herhangi bir dakikayı seçebilirsiniz.
    • Seçebileceğiniz en erken zaman damgasını veritabanınızın açıklamasında bulabilirsiniz.

Console

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

gcloud

Bir 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ır.

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

  • DESTINATION_DATABASE_ID: Klonlanan yeni bir veritabanı için veritabanı kimliği. Bu veritabanı kimliği, mevcut bir veritabanıyla ilişkili olmamalıdır.

Ö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 ANAHTAR=DEĞER çiftlerinin isteğe bağlı bir 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

Klonlanan veritabanı, varsayılan olarak 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 şifrelemesi kullanın. --kms-key-name bağımsız değişkeninde bir anahtar kimliği belirtin.

Aşağıdaki örnekte, kopyalanan 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

Bir 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ır.

  • DESTINATION_DATABASE: Klonlanan yeni veritabanı için bir veritabanı adı. Ad, projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID biçimini kullanır. Bu veritabanı adı, mevcut bir veritabanıyla ilişkili olmamalıdır.

  • PITR_TIMESTAMP: RFC 3339 biçiminde, dakika ayrıntı düzeyinde 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ü, geçerli zamanın dakikaya yuvarlanmış hali olur.

Klonlanan veritabanı, varsayılan olarak 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 şifrelemesi kullanın. --kms-key-name bağımsız değişkeninde bir anahtar kimliği belirtin.

Aşağıdaki örnekte, kopyalanan 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 varlıklarını 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ılamaz. Bu nedenle, klonlardan hariç tutulur.

PITR verilerini dışa ve içe aktarma

gcloud firestore export komutunu kullanarak veritabanınızı PITR verilerinden Cloud Storage konumuna aktarabilirsiniz. Zaman damgasının son yedi gün içinde tam dakika zaman damgası olduğu ancak earliestVersionTime tarihinden önce olmadığı PITR verilerini dışa aktarabilirsiniz. Belirtilen zaman damgasında veri yoksa dışa aktarma işlemi başarısız olur.

Belirli bir zamana geri yükleme dışa aktarma işlemi, tüm dokümanların ve belirli koleksiyonların dışa aktarılması dahil olmak üzere tüm filtreleri destekler.

  1. snapshot-time parametresini seçilen kurtarma zaman damgasına ayarlayarak veritabanını dışa aktarın.

    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
    

    Burada,

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

    PITR verilerini dışa aktarmadan önce aşağıdaki noktaları göz önünde bulundurun:

    • 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 tam dakika zaman damgası olduğundan ancak earliestVersionTime tarihinden önce olmadığından emin olun. Belirtilen zaman damgasında veri yoksa hata oluşur. Belirtilen zaman son bir saat içinde olsa bile zaman damgası tam dakika olmalıdır.
    • Başarısız olan belirli bir zamana geri yükleme dışa aktarma işlemleri için ücret alınmaz.
  2. Veritabanına aktarma

    Dışa aktarılan veritabanınızı içe aktarmak için Tüm dokümanları içe aktarma bölümündeki adımları uygulayın. Veritabanınızda zaten mevcut olan tüm belgelerin üzerine yazılır.