این صفحه نحوه استفاده از بازیابی نقطهزمانی (PITR) را برای حفظ و بازیابی دادهها در Cloud Firestore شرح میدهد.
برای درک مفاهیم PITR، به بازیابی نقطهزمانی مراجعه کنید.
اجازهها
برای دریافت اجازههایی که برای مدیریت تنظیمات PITR نیاز دارید، از سرپرستتان بخواهید نقشهای IAM زیر را در پروژهای که میخواهید PITR را در آن فعال کنید به شما اعطا کند:
- مالک Cloud Datastore (
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 پساز فعال کردن PITR، نسخهها را از آن نقطه به بعد حفظ میکند.
- پساز غیرفعال کردن PITR، نمیتوانید دادههای PITR را در پنجره PITR بخوانید.
- اگر بلافاصله پساز غیرفعال کردن «بازیابی نقطهزمانی»، آن را دوباره فعال کنید، دادههای «بازیابی نقطهزمانی» گذشته دیگر دردسترس نخواهد بود. هرگونه داده PITR که قبلاز غیرفعال کردن PITR ایجاد شده باشد، پساز تاریخ انقضای PITR حذف خواهد شد.
- اگر بهطور تصادفی دادهها را در ساعت گذشته حذف کردهاید و PITR غیرفعال است، میتوانید با فعال کردن PITR ظرف یک ساعت پساز حذف، دادههایتان را بازیابی کنید.
- هرگونه خواندن انجامشده روی دادههای PITR منقضیشده ناموفق خواهد بود.
فعال کردن PITR
قبلاز استفاده از PITR، صورتحساب را برای پروژه Google Cloud خود فعال کنید. فقط پروژههای Google Cloud که صورتحساب آنها فعال است میتوانند از عملکرد PITR استفاده کنند.
برای فعال کردن PITR برای پایگاه دادهتان:
کنسول
در کنسول Google Cloud، به صفحه پایگاههای داده بروید.
پایگاه داده موردنیاز را از فهرست پایگاههای داده انتخاب کنید.
در منو پیمایش، روی بازیابی پساز فاجعه کلیک کنید.
برای ویرایش تنظیمات، روی ویرایش کلیک کنید.
چارگوش انتخاب فعال کردن بازیابی نقطهزمانی را انتخاب کنید و سپس روی ذخیره کلیک کنید.
فعال کردن PITR هزینه فضای ذخیرهسازی بههمراه دارد. برای اطلاعات بیشتر، قیمتگذاری را ببینید.
برای غیرفعال کردن PITR، چارگوش انتخاب فعال کردن بازیابی نقطهزمانی را در صفحه «بازیابی پساز فاجعه» در کنسول Google Cloud پاک کنید.
gcloud
بااستفاده از gcloud firestore databases create و فرمان --enable-ptir، بازیابی نقطهزمانی را درطول ایجاد پایگاه داده فعال کنید:
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- روی شناسه پایگاه داده یا (پیشفرض) تنظیم شده است.
دریافت دوره نگهداری و زمان قدیمیترین نسخه
کنسول
در کنسول Google Cloud، به صفحه پایگاههای داده بروید.
پایگاه داده موردنیاز را از فهرست پایگاههای داده انتخاب کنید.
در منو پیمایش، روی بازیابی پساز فاجعه کلیک کنید.
در بخش تنظیمات، به دوره نگهداری و زمان قدیمیترین نسخه توجه کنید.
- دوره نگهداری: دورهای که Cloud Firestore همه نسخههای داده را برای پایگاه داده نگهداری میکند. وقتی PITR غیرفعال باشد، این مقدار یک ساعت است و وقتی PITR فعال باشد، این مقدار هفت روز است.
- زمان قدیمیترین نسخه: قدیمیترین مُهر زمانی که در آن نسخههای قدیمیتر دادهها را میتوان در پنجره «بازیابی نقطهزمانی» خواند. این مقدار بهطور مداوم توسط Cloud Firestore بهروز میشود و بهمحض اینکه مورد پُرسمان قرار میگیرد، قدیمی میشود. اگر از این مقدار برای بازیابی دادهها استفاده میکنید، حتماً زمان بین لحظه پرسمان مقدار تا لحظه شروع بازیابی را درنظر بگیرید.
- بازیابی نقطه زمانی: اگر PITR فعال باشد،
Enabledرا نشان میدهد. اگر PITR غیرفعال باشد،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: مُهر زمان قدیمیترین دادههای 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();
Node
برای خواندن دادههای 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)}
);
REST API
خوانشهای PITR در همه روشهای خواندن Cloud Firestore پشتیبانی میشود، که عبارتند از: get، list، batchGet، listCollectionIds، listDocuments، runQuery، runAggregationQuery، و partitionQuery.
برای انجام خواندن بااستفاده از روشهای REST، یکی از گزینههای زیر را امتحان کنید:
در درخواست روش خواندن، مقدار
readTimeرا بهعنوان مُهر زمان PITR پشتیبانیشده در روشreadOptionsارسال کنید. مُهر زمان PITR میتواند مُهر زمان با دقت میکروثانیه در ساعت گذشته یا مُهر زمان دقیقه کامل فراتر از ساعت گذشته باشد، اما نباید زودتر ازearliestVersionTimeباشد.از پارامتر
readTimeهمراه با روشBeginTransactionبهعنوان بخشی از تراکنشReadOnlyبرای چندین خواندن PITR استفاده کنید.
Apache Beam
از رابط Cloud FirestoreIO Apache Beam برای خواندن یا نوشتن اسناد در پایگاه داده Cloud Firestore در مقیاس بزرگ با Dataflow استفاده کنید.
خواندنهای PITR در روش خواندن زیر از
رابط Cloud FirestoreIO پشتیبانی میشود. این روشهای خواندن از روش withReadTime(@Nullable Instant readTime) پشتیبانی میکنند که میتوانید برای خواندنهای PITR استفاده کنید:
- FirestoreV1.BatchGetDocuments
- FirestoreV1.ListCollectionIds
- FirestoreV1.ListDocuments
- FirestoreV1.PartitionQuery
جاوا
کد زیر را میتوان با نمونه کد خط لوله 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) پایگاه داده منبع استفاده میکند. پایگاه داده کلونشده شامل همه دادهها و نمایهها است.
بهطور پیشفرض، پایگاه داده کلونشده به همان روش پایگاه داده منبع، بااستفاده از رمزگذاری پیشفرض Google یا رمزگذاری CMEK، رمزگذاری خواهد شد. میتوانید نوع رمزگذاری دیگری را مشخص کنید یا از کلید دیگری برای رمزگذاری CMEK استفاده کنید.
مُهر زمان دارای دانهبندی یک دقیقهای است و نقطهای از زمان را در گذشته مشخص میکند، در دورهای که توسط پنجره PITR تعریف شده است:
- اگر PITR برای پایگاه داده شما فعال باشد، میتوانید هر دقیقهای را در ۷ روز گذشته انتخاب کنید (یا کمتر، اگر PITR کمتر از ۷ روز پیش فعال شده باشد).
- اگر «بازیابی نقطهزمانی» فعال نباشد، میتوانید هر دقیقهای را در ساعت گذشته انتخاب کنید.
- میتوانید اولین مُهر زمان قابلانتخاب را در شرح پایگاه دادهتان بررسی کنید.
کنسول
کنسول 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'
موارد زیر را جایگزین کنید:
SOURCE_DATABASE: نام پایگاه داده موجودی که میخواهید کلون کنید. نام از قالب
projects/PROJECT_ID/databases/SOURCE_DATABASE_IDاستفاده میکند.PITR_TIMESTAMP: مُهر زمان «بازیابی نقطهزمانی» در قالب RFC 3339، با جزئیات دقیقهای. برای مثال:
2025-06-01T10:20:00.00Zیا2025-06-01T10:30:00.00-07:00.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 استفاده کنید که فهرست اختیاری جفتهای «کلید=مقدار» برچسبها برای اتصال است.
مثال:
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: از رمزگذاری CMEK استفاده کنید. شناسه کلید را در آرگومان--kms-key-nameمشخص کنید.
مثال زیر نحوه پیکربندی رمزگذاری CMEK را برای پایگاه داده شبیهسازیشده نشان میدهد:
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
برای شبیهسازی پایگاه داده، از فرمان 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: از رمزگذاری CMEK استفاده کنید. شناسه کلید را در آرگومان--kms-key-nameمشخص کنید.
مثال زیر نحوه پیکربندی رمزگذاری CMEK را برای پایگاه داده شبیهسازیشده نشان میدهد:
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) به پایگاه دادهای که از این دادهها پشتیبانی نمیکند کلون کنید، مفید نخواهد بود، بنابراین از کلونها مستثنی میشود.
صادر کردن و وارد کردن از دادههای PITR
میتوانید پایگاه دادهتان را بااستفاده از فرمان gcloud firestore export از دادههای PITR به Cloud Storage صادر کنید. میتوانید دادههای PITR را که مُهر زمان آنها مُهر زمان دقیقه کامل در هفت روز گذشته است صادر کنید، اما نه زودتر از earliestVersionTime. اگر دادهها دیگر در مُهر زمان مشخصشده وجود نداشته باشند، عملیات صادر کردن ناموفق خواهد بود.
عملیات صادر کردن PITR از همه فیلترها، ازجمله صادر کردن همه اسناد و صادر کردن مجموعههای خاص، پشتیبانی میکند.
پایگاه داده را صادر کنید و پارامتر
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- مُهر زمان 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نباشد. اگر دادهها دیگر در مُهر زمان مشخصشده وجود نداشته باشد، خطایی ایجاد میشود. مُهر زمان باید یک دقیقه کامل باشد، حتی اگر زمان مشخصشده در ساعت گذشته باشد. - هزینهای بابت صادر کردن ناموفق «بازیابی نقطهزمانی» از شما کسر نمیشود.
وارد کردن به پایگاه داده.
از مراحل وارد کردن همه اسناد برای وارد کردن پایگاه داده صادرشدهتان استفاده کنید. اگر سندی ازقبل در پایگاه داده شما وجود داشته باشد، رونویسی خواهد شد.